Kubernetes 集群开启防火墙

概述

在 Kubernetes 集群中启用防火墙是提高安全性的重要措施。本文档详细说明了 K8S 集群所需开放的端口,以及使用 ufw 和 iptables 配置防火墙的方法。

端口开放说明

重要提示

在启用防火墙前,必须确保所有 Kubernetes 组件所需的端口已正确开放,否则会导致集群通信失败。

控制平面节点 (Master Nodes)

端口协议用途
6443TCPKubernetes API Server
2379-2380TCPetcd 服务器客户端 API
10250TCPKubelet API
10257TCPkube-controller-manager HTTPS(kubeadm 默认仅本机)
10259TCPkube-scheduler HTTPS(kubeadm 默认仅本机)

10257 和 10259 在 kubeadm 默认配置下监听回环地址,仅供本机健康检查;不要因为它们出现在端口表中就对节点网卡放行。

# API Server
sudo iptables -A INPUT -p tcp --dport 6443 -j ACCEPT
 
# etcd
sudo iptables -A INPUT -p tcp --dport 2379 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 2380 -j ACCEPT
 
# Kubelet
sudo iptables -A INPUT -p tcp --dport 10250 -j ACCEPT
 
# kubeadm 默认将 10257/10259 绑定到 127.0.0.1,无需对网络开放

工作节点 (Worker Nodes)

端口协议用途
10250TCPKubelet API
30000-32767TCPNodePort 服务端口范围
# Kubelet
sudo iptables -A INPUT -p tcp --dport 10250 -j ACCEPT
 
# NodePort Services
sudo iptables -A INPUT -p tcp --dport 30000:32767 -j ACCEPT

NodePort 也可能使用 UDP;只有存在对应 UDP Service 时才按实际来源开放 UDP 范围。生产环境应限制来源网段,而不是对任意地址开放整个范围。

网络插件 (CNI)

说明

不同的 CNI 插件需要开放不同的端口,请根据实际使用的插件进行配置。

Calico

# BGP 端口
sudo iptables -A INPUT -p tcp --dport 179 -j ACCEPT

Flannel

# VXLAN 端口
sudo iptables -A INPUT -p udp --dport 8472 -j ACCEPT

Weave

# Weave Net 端口
sudo iptables -A INPUT -p tcp --dport 6783 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 6783 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 6784 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 6784 -j ACCEPT

Ingress 控制器

提示

只有 Ingress Controller 通过 hostNetwork、hostPort 或节点上的负载均衡入口直接监听时,才需要在相应节点开放 80/443;使用其他 Service 暴露方式时按实际端口处理。

# HTTP
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
 
# HTTPS
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

UFW 配置示例

使用 ufw 在 Ubuntu 上配置防火墙:

# Kubernetes 核心端口
sudo ufw allow 6443/tcp
sudo ufw allow 2379:2380/tcp
sudo ufw allow 10250/tcp
sudo ufw allow 30000:32767/tcp
 
# 网络插件端口
sudo ufw allow 8472/udp  # Flannel
sudo ufw allow 179/tcp   # Calico
sudo ufw allow 6783:6784/tcp  # Weave
sudo ufw allow 6783:6784/udp  # Weave
 
# Ingress 端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
 
# 启用 UFW
sudo ufw enable

iptables 完整配置示例

# 控制平面端口
sudo iptables -A INPUT -p tcp --dport 6443 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 2379 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 2380 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 10250 -j ACCEPT
 
# 工作节点端口
sudo iptables -A INPUT -p tcp --dport 10250 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 30000:32767 -j ACCEPT
 
# 网络插件端口 (Flannel 示例)
sudo iptables -A INPUT -p udp --dport 8472 -j ACCEPT
 
# Ingress 端口
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
 
# 保存 iptables 规则
sudo sh -c 'iptables-save > /etc/iptables/rules.v4'

总结

最佳实践

  • 在 Kubernetes 节点上启用防火墙是可行且推荐的安全措施
  • 必须确保所有必要端口已开放,以保证 K8S 组件正常通信
  • 具体开放的端口取决于你的 Kubernetes 配置和使用的插件
  • 建议使用 ufw 简化防火墙管理

示例不是可直接复制的完整策略

上面的规则没有包含实际来源 CIDR、SSH 保活、默认策略、conntrack 和 CNI 转发链。应用前先导出现有规则并确认有控制台或带外管理入口;iptables -A 还可能与 nftables 后端及 CNI 自动规则冲突。

相关文档


返回: Kubernetes