为什么带 --verbose 和不带 --verbose 时,curl 显示不同的结果?

问题描述 投票:0回答:1

我的 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 - 连接已建立”。 我的问题是:为什么会这样? 我在网上做了一些研究并得出结论:

  1. 如果 DNS 解析过程遇到问题,DNS 问题有时会导致非详细卷曲请求失败。详细模式可能会提供有关 DNS 解析过程的更多信息,并以不同的方式处理故障。
  2. 详细模式可能会改变发送数据包的时间或结构,从而可能允许它们通过 NSG 或防火墙规则,否则会阻止它们。
  3. curl 中的详细模式可能会引入标准模式中不存在的轻微延迟或重试,从而允许连接在某些网络条件下成功。
  4. 您的防火墙或 NSG 中可能有一些规则会阻止标准的curl请求,但由于数据包检查或日志记录机制的差异而允许详细请求。

第二个问题是:如果我想阻止在此设置中访问互联网,我应该只添加具有特殊配置的出口。

提前致谢!

azure curl azure-aks azure-nsg
1个回答
0
投票

是的,你的研究是正确的。 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"]

enter image description here

然后执行到pod中

kubectl exec -it tcpdump-pod -- /bin/sh

运行

tcpdump
捕获流量

tcpdump -i any -w /tmp/curl_output.pcap

并在新窗口中执行 卷曲 www.google.com 卷曲 -v www.google.com

enter image description here

稍后下载

curl_output.pcap
文件并验证
kubectl cp default/tcpdump-pod:/tmp/curl_output.pcap ./curl_output.pcap

enter image description here

谈到第二个问题,如果您想在设置中阻止访问互联网,为什么不考虑设置一个 私有 aks 集群

enter image description here

或者按照您的建议可以添加具有特殊配置的出口来阻止到互联网的出站流量。

如何? 在设置 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

enter image description here

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.