如何允许 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:
wget https://www.google.com
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.164
与 80
& 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.46
与 80
& 443
端口发生
我在这里错过了什么?
您在 post 中提到的网络策略只允许 https/traffic 在 443 上,但您没有在其中提到任何拒绝 http(端口 80)流量的内容。
有两种实现方式:
- 为出口设置默认拒绝策略
任一
- 创建另一个出口策略,拒绝端口 80 上的出口
我正在为我在 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:
wget https://www.google.com
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.164
与 80
& 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.46
与 80
& 443
端口发生
我在这里错过了什么?
您在 post 中提到的网络策略只允许 https/traffic 在 443 上,但您没有在其中提到任何拒绝 http(端口 80)流量的内容。
有两种实现方式:
- 为出口设置默认拒绝策略
任一
- 创建另一个出口策略,拒绝端口 80 上的出口