我有一个 Kubernetes 集群,其 IP 为:10.10.10.1(主服务器)10.10.10.2(从服务器)
我有一个带有 nginx 的远程服务器,其 IP 为 12.12.12.12。
现在我已经配置了一个 nodePort(31000)来允许从我的集群访问资源。
因此,如果我尝试从 10.10.10.1:31000 下载内容,我就能下载该文件。
所以我想要做的是只允许从 IP 12.12.12.12(我的 nginx 服务器)进行下载。
我认为 NetworkPolicy 无法完成这项工作,因为它是一个外部服务器(集群之外):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-specific-ip-nodeport
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- ipBlock:
cidr: 12.12.12.12/32
ports:
- protocol: TCP
port: 31000
因此,我尝试在主服务器和从服务器上使用 iPtables,但来自各处的流量仍然被允许:
sudo iptables -A INPUT -p tcp --dport 31000 -s 12.12.12.12 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 31000 -j DROP
任何想法?
我的目标是阻止来自端口 31000 上除集群外部的 nginx 服务器之外的所有地方的流量。
答案1
对于 iptables 来说,顺序很重要。您可以构建规则链,并检查这些规则以接受或拒绝数据包。
您已将 (ip -A) 添加为最后一条规则,拒绝所有发往端口 31000 的数据包,并使用倒数第二条规则,将源地址 12.12.12.12 排除在外。如果这些规则是链中的第一条,则所有发往端口 31000 且不是来自 12.12.12.12 的数据包都将被拒绝,但事实并非如此(我建议通过列出 INPUT 链的规则来检查这一点)。
无论如何,如果您想要拒绝所有不是来自 12.12.12.12 的到端口 31000 的流量,您可以尝试使用 -I 选项而不是 -A。(在所需的位置添加规则,默认情况下是链的开头):
iptables -I INPUT -p tcp --dport 31000 -s ! 12.12.12.12 -j DROP
这里,拒绝所有不是来自 12.12.12.12 的数据包,并将其作为第一条规则插入。如果您不想将其作为第一条规则,可以将数字放在“INPUT”的右侧。链的其余部分将决定如何处理来自 12.12.12.12 的数据包(我认为直接接受它作为第二条规则不是一个好主意)。