我的 Azure AKS 集群在 1.28.9 Kubernetes 上运行。它在 XX 区域的订阅 X 中运行。我还在订阅 Y + 适当的 NSG、区域 YY 中设置了防火墙高级版。两个 vnet 相互对等。 在集群中,我有 Ingress 资源 + Nginx Ingress 控制器。我没有出口(网络策略)。 在集群中运行带有 wget 和 curl 的 pod。如果我执行“curl www.google.com”,我可以看到访问互联网被拒绝,但如果我执行“curl -v www.google.com”,我可以看到 HTTPS 200 - 连接已建立”。 我的问题是:为什么会这样? 我在网上做了一些研究并得出结论:
第二个问题是:如果我想阻止在此设置中访问互联网,我应该只添加具有特殊配置的出口。
提前致谢!
是的,你的研究是正确的。 curl 显示带有和不带有
-v
标志的不同结果,因为详细模式提供了有关连接过程的更多信息,这些信息在非详细模式下可能不可见。这可能包括 DNS 解析问题、数据包检查或日志记录机制的差异以及可能影响连接的其他网络条件。但是,您仍然可以使用 tcpdump 手动测试它,以比较两个 curl
命令生成的流量,看看数据包结构、时间或内容是否存在显着差异。
您可以做的就是在您的设置中再部署一个已安装
tcpdump
的 pod。
apiVersion: v1
kind: Pod
metadata:
name: tcpdump-pod
namespace: default
spec:
containers:
- name: tcpdump
image: nicolaka/netshoot
command: ["/bin/sh", "-c", "sleep infinity"]
securityContext:
capabilities:
add: ["NET_ADMIN", "NET_RAW"]
然后执行到pod中
kubectl exec -it tcpdump-pod -- /bin/sh
运行
tcpdump
捕获流量
tcpdump -i any -w /tmp/curl_output.pcap
并在新窗口中执行 卷曲 www.google.com 卷曲 -v www.google.com
稍后下载
curl_output.pcap
文件并验证kubectl cp default/tcpdump-pod:/tmp/curl_output.pcap ./curl_output.pcap
谈到第二个问题,如果您想在设置中阻止访问互联网,为什么不考虑设置一个 私有 aks 集群
或者按照您的建议可以添加具有特殊配置的出口来阻止到互联网的出站流量。
如何? 在设置 aks 集群时,选择网络策略插件,例如 Calico。 定义限制互联网出口流量的网络策略
这个是拒绝所有出口
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
namespace: default
spec:
podSelector: {}
policyTypes:
- Egress
egress: []
如果您想仅允许某些内部 IP 地址的出口流量并拒绝其余 IP 地址,请添加这些特定的 IP 地址,如下所示
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-internal-egress
namespace: default
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/16
- ipBlock:
cidr: 192.168.0.0/16
- to:
- ipBlock:
cidr: 172.16.0.0/12
参考资料: