You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制Kubernetes NodePort仅允许特定外部IP访问?

如何限制Kubernetes NodePort仅允许特定外部IP访问?

你遇到的问题其实挺常见的——你对NetworkPolicy的判断是对的,它确实没法管控外部集群的IP访问NodePort,因为NetworkPolicy主要作用于集群内部Pod之间的流量,或者从集群内部到Pod的流量,外部请求到NodePort时,是先到达Node的网络栈,这部分不在NetworkPolicy的管辖范围内。

至于你手动配置的iptables规则没生效,核心原因是Kubernetes的kube-proxy会在每个Node上自动生成一套优先级更高的iptables规则,这些规则会先于你添加的INPUT链规则把NodePort的流量转发到对应的Pod,所以你的DROP规则根本没机会拦截到流量。

下面给你几个可行的解决方案,按操作复杂度排序:

方案一:调整iptables规则到kube-proxy的专属链中

kube-proxy会创建一个名为KUBE-NODE-PORTS的iptables链,所有NodePort的流量都会先经过这个链。我们只需要把规则加到这个链的最前面,就能优先拦截或放行流量:

  1. 先添加允许指定IP访问31000端口的规则(用-I插入到链的开头,确保优先级最高):
sudo iptables -I KUBE-NODE-PORTS -p tcp --dport 31000 -s 12.12.12.12/32 -j ACCEPT
  1. 再添加拒绝所有其他IP访问该端口的规则:
sudo iptables -I KUBE-NODE-PORTS -p tcp --dport 31000 -j DROP

注意事项:

  • 这些规则是临时的,Node重启后会丢失,需要持久化:
    • Debian/Ubuntu系统:安装iptables-persistent工具,然后执行sudo iptables-save > /etc/iptables/rules.v4
    • RHEL/CentOS系统:执行sudo service iptables save
  • 要在所有运行NodePort的Node上执行这些命令(也就是你的Master和Slave节点)

方案二:改用Ingress Controller(更规范的长期方案)

如果你的集群没有特殊限制,改用Ingress来暴露服务会更灵活,而且大部分Ingress Controller都支持IP白名单功能。以Nginx Ingress Controller为例:

  1. 先部署Nginx Ingress Controller到集群中(如果还没部署)
  2. 创建Ingress资源,添加白名单注解:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: restricted-ingress
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: "12.12.12.12/32"
spec:
  rules:
  - http:
      paths:
      - path: /your-resource-path
        pathType: Prefix
        backend:
          service:
            name: your-service-name
            port:
              number: 80 # 这里填服务的ClusterIP端口,不是NodePort

这样配置后,只有12.12.12.12能通过Ingress访问你的服务,比NodePort的方式更安全、更易管理。

方案三:利用CNI插件的外部IP过滤(如果集群使用了特定CNI)

如果你用的是Calico这类功能丰富的CNI插件,它支持针对外部IP的Ingress过滤规则,可以替代iptables手动配置。不过这个方案需要你熟悉对应CNI的配置,适合有一定集群管理经验的场景。

备注:内容来源于stack exchange,提问作者Ethernaly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 08:49:40