Kubernetes - NodePort 允许来自特定外部 IP 的流量

Kubernetes - NodePort 允许来自特定外部 IP 的流量

我有一个 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 的数据包(我认为直接接受它作为第二条规则不是一个好主意)。

相关内容