Kubernetes 防火墙配置

概述

本文档提供了在 Ubuntu 系统上为 Kubernetes 集群配置 ufw 防火墙的完整指南,包括快速配置脚本和详细的分步说明。Kubernetes 版本、CNI 和 Service 网段不同,开放端口前应按实际拓扑收紧来源地址。

快速配置脚本

注意

以下内容是模板,不是可直接复制的生产策略。先把 CIDR 替换为真实网段,并保留 SSH/带外管理入口;远程执行 ufw enable 可能立即断开当前连接。

#!/bin/bash
 
ADMIN_CIDR="192.0.2.0/24"
NODE_CIDR="192.0.2.1.0/24"
CONTROL_PLANE_CIDR="192.0.2.1.0/28"
 
# 先允许管理入口,再配置默认策略
ufw allow from "$ADMIN_CIDR" to any port 22 proto tcp
ufw default deny incoming
ufw default allow outgoing
 
# 控制平面和节点通信
ufw allow from "$NODE_CIDR" to any port 6443 proto tcp
ufw allow from "$CONTROL_PLANE_CIDR" to any port 6443 proto tcp
ufw allow from "$ADMIN_CIDR" to any port 6443 proto tcp
ufw allow from "$CONTROL_PLANE_CIDR" to any port 2379:2380 proto tcp
ufw allow from "$CONTROL_PLANE_CIDR" to any port 10250 proto tcp
 
# 仅在使用 Flannel VXLAN 时开放节点间 UDP 8472
ufw allow from "$NODE_CIDR" to any port 8472 proto udp
 
# NodePort 仅在确实使用时按客户端来源开放
# ufw allow from "$ADMIN_CIDR" to any port 30000:32767 proto tcp
 
# 确认规则后再启用
ufw show added
ufw --force enable
 
# 显示防火墙状态和规则
ufw status verbose

安装 Kubernetes(以 1.29 为例)

前置条件

在配置防火墙之前,确保已正确安装 Kubernetes。

# 更新包列表
apt-get update
 
# 安装必要的工具
apt-get install -y apt-transport-https ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
 
# 添加 Kubernetes 社区维护的 apt 仓库(旧的 apt.kubernetes.io 已下线)
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key |
  gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' |
  tee /etc/apt/sources.list.d/kubernetes.list
 
# 更新包列表并安装 kubelet、kubeadm 和 kubectl
apt-get update
apt-get install -y kubelet kubeadm kubectl
 
# 锁定版本
apt-mark hold kubelet kubeadm kubectl
 
# 启动并启用 kubelet
systemctl enable kubelet && systemctl start kubelet

详细配置步骤

UFW 与 Pod 转发

Kubernetes 依赖节点转发和 CNI 写入的 iptables/nftables 规则。仅开放端口并不能保证 Pod 通信;启用 UFW 前确认 /etc/default/ufw 的 DEFAULT_FORWARD_POLICY、CNI 文档要求和现有转发规则,先在测试节点验证 kubectl exec、Service 和跨节点 Pod 通信,再推广到整个集群。

1. 安装和启用 ufw

apt-get install -y ufw
ufw enable

2. 允许 Kubernetes 核心端口

Kubernetes 必需端口

以下端口是 Kubernetes 集群正常运行所必需的:

端口协议用途
6443TCPAPI 服务器
2379-2380TCPetcd 服务器
10257、10259TCPcontroller-manager、scheduler HTTPS;kubeadm 默认仅本机绑定,通常不开放
10250TCPkubelet
53TCP/UDP仅在节点实际运行 DNS/NodeLocal DNS 监听时开放
8472UDP仅 Flannel VXLAN 节点间通信
NODE_CIDR="192.0.2.1.0/24"
CONTROL_PLANE_CIDR="192.0.2.1.0/28"
ufw allow from "$NODE_CIDR" to any port 6443 proto tcp
ufw allow from "$CONTROL_PLANE_CIDR" to any port 6443 proto tcp
ufw allow from "$ADMIN_CIDR" to any port 6443 proto tcp
ufw allow from "$CONTROL_PLANE_CIDR" to any port 2379:2380 proto tcp
ufw allow from "$CONTROL_PLANE_CIDR" to any port 10250 proto tcp
ufw allow from "$NODE_CIDR" to any port 8472 proto udp

3. 允许 NodePort 端口范围

NodePort 配置

Kubernetes 的 NodePort 服务默认使用 30000-32767 范围的端口。

按客户端网段允许 NodePort:

ufw allow from 192.0.2.8/24 to any port 30000:32767 proto tcp

如 Service 使用 UDP,另加对应 UDP 规则;没有 NodePort Service 时不要开放整个范围。

4. 允许本地和内部网络流量

内网通信

不要笼统允许全部 RFC1918 网段。根据 Node CIDR、Pod CIDR、Service 实现和 CNI 文档精确配置;Pod 转发通常还涉及 FORWARD 链,而不只是主机 INPUT。

NODE_CIDR="192.0.2.1.0/24"
ufw allow from "$NODE_CIDR"
# 是否需要允许 Pod CIDR 取决于 CNI 和实际数据路径

5. 重载配置并验证

# 重载 ufw 使规则生效
ufw reload
 
# 查看防火墙状态和规则
ufw status verbose

总结

配置完成

通过以上步骤,可以为 Ubuntu 上的 Kubernetes 节点建立防火墙基线:

  • 只有授权的流量可以访问必要的端口
  • 提高集群的安全性
  • 减少潜在的攻击面

相关文档


返回: Kubernetes