如何允许 443 端口(https 调用)上的出口流量并阻止 80 端口(http 调用)

How to allow egress traffic on 443 port (https calls) and block 80 port (http calls)

我正在为我在 K3s 上的应用实施 kubernetes 网络策略。我想允许端口 443 egress(从 pod 外部调用互联网),即 https 仅调用 和 deny/block 80 端口上的所有出口调用,即 http。简而言之,允许 https 出口调用并拒绝 http 出口调用。
我正在使用以下 custom-dns.yaml 文件进行测试:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: foo-deny-egress
spec:
  podSelector:
    matchLabels:
      app: foo
  policyTypes:
  - Egress
  egress:
  # allow DNS resolution
  - ports:
    - port: 443
      protocol: UDP
    - port: 443
      protocol: TCP

kubectl apply -f custom-dns.yaml 之后,我创建并登录到 pod :kubectl run --restart=Never pod-v1 --image=busybox -i -t -l app=foo 并通过命令测试 http 和 https url:

  1. wget https://www.google.com
  2. wget http://drive.google.com/drive/u/0/my-drive

两个 wget 命令都给出 wget: bad address 错误。

但是当我不应用此网络策略时,相同的 wget 命令正在运行并给出来自同一 pod 的以下结果:
i.

        wget https://www.google.com
        Connecting to www.google.com (172.217.167.164:443)
        wget: note: TLS certificate validation not implemented
        saving to 'index.html'
        index.html           100% |******************************************************| 15264  0:00:00 ETA
       'index.html' saved

ii.

wget http://drive.google.com/drive/u/0/my-drive
Connecting to drive.google.com (142.250.192.46:80)
Connecting to drive.google.com (142.250.192.46:443)
wget: note: TLS certificate validation not implemented
Connecting to accounts.google.com (142.250.192.77:443)
saving to 'my-drive'
my-drive             100% |******************************************************| 92019  0:00:00 ETA
'my-drive' saved

iii. Telnet 到 google.com IP 172.217.167.16480 & 443 端口发生

#telnet 172.217.166.164 80
Connected to 172.217.166.164
^]q
# telnet 172.217.166.164 443
Connected to 172.217.166.164
^]

iv. 同样 Telnet 到 drive.com IP 142.250.192.4680 & 443 端口发生

我在这里错过了什么?

  • 您在 post 中提到的网络策略只允许 https/traffic 在 443 上,但您没有在其中提到任何拒绝 http(端口 80)流量的内容。

  • 有两种实现方式:

    • 为出口设置默认拒绝策略

    任一

    • 创建另一个出口策略,拒绝端口 80 上的出口