主题
RKE2 新增 master 节点失败:iptables 防火墙拦截 RKE2/Calico 端口
问题现象
在已有 RKE2 集群中新增 master(control-plane + etcd)节点时,rke2-server 服务不断重启,无法加入集群。
新增节点日志循环出现:
text
time="..." level=fatal msg="Error: preparing server: failed to bootstrap cluster data:
failed to check if bootstrap data has been initialized:
failed to validate token:
failed to get CA certs:
Get \"https://<现有master-ip>:9345/cacerts\":
dial tcp <现有master-ip>:9345: connect: no route to host"如果网络层通了但 token 没问题,etcd 加入后可能继续报错:
text
time="..." level=error msg="Failed to check local etcd status for learner management:
rpc error: code = Unavailable desc = connection error: desc =
\"transport: authentication handshake failed: context deadline exceeded\""Calico 节点启动后也可能报:
text
Failed to connect to typha endpoint <现有master-ip>:5473. error=dial tcp <现有master-ip>:5473: connect: no route to host环境信息
- RKE2 版本:
v1.35.6+rke2r1 - 操作系统:Rocky Linux 9.8 (Blue Onyx)
- CNI:Calico
- 私有镜像仓库:
192.168.122.156:30000 - 涉及节点示例:
- 现有 master:
192.168.122.216(rancher-ctrl-vm2) - 新增 master:
192.168.122.164(rancher-ctrl-vm3) - 新增 master:
192.168.122.101(rancher-ctrl-vm5)
- 现有 master:
根因分析
Rocky Linux 9 虚拟机模板或初始化脚本预置了 iptables-nft-services,并在 /etc/sysconfig/iptables 中写入了一条默认拒绝所有入站流量、仅放行 22 端口的规则:
text
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
...
REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibitedRKE2 control-plane 节点之间需要开放的端口被全部拦截,导致:
- 新节点无法通过
9345注册到现有 control-plane - 新节点 etcd 无法通过
2380与现有 etcd 建立 raft 连接 - Calico Felix 无法通过
5473连接到 Typha - kube-apiserver / kubelet / scheduler / controller-manager 健康检查端口也无法互通
排查步骤
1. 确认服务状态
在新增节点上:
bash
systemctl status rke2-server --no-pager -l
journalctl -u rke2-server --no-pager -n 1002. 检查端口连通性
从新节点测试到现有 master 的 RKE2 端口:
bash
for port in 9345 6443 2379 2380 10250; do
timeout 3 bash -c "</dev/tcp/<现有master-ip>/$port" >/dev/null 2>&1 && echo "$port open" || echo "$port blocked"
done3. 检查防火墙规则
在两台节点上都执行:
bash
iptables -L INPUT -n -v --line-numbers如果看到末尾有:
text
REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited而前面没有放行 RKE2 相关端口的 ACCEPT 规则,即可确认是防火墙问题。
4. 确认服务已监听端口
在现有 master 上:
bash
ss -tlnp | grep -E "9345|6443|2379|2380|10250|5473"如果服务已监听但外部连不上,进一步确认是防火墙拦截。
修复方法
方案 A:在现有 master 和新节点上添加白名单规则(推荐)
在所有 control-plane 节点上执行:
bash
# RKE2 控制面端口
iptables -I INPUT -s 192.168.122.0/24 -p tcp --dport 9345 -j ACCEPT
iptables -I INPUT -s 192.168.122.0/24 -p tcp --dport 6443 -j ACCEPT
iptables -I INPUT -s 192.168.122.0/24 -p tcp --dport 2379 -j ACCEPT
iptables -I INPUT -s 192.168.122.0/24 -p tcp --dport 2380 -j ACCEPT
iptables -I INPUT -s 192.168.122.0/24 -p tcp --dport 10250 -j ACCEPT
iptables -I INPUT -s 192.168.122.0/24 -p tcp --dport 10257 -j ACCEPT
iptables -I INPUT -s 192.168.122.0/24 -p tcp --dport 10259 -j ACCEPT
# Calico 相关端口
iptables -I INPUT -s 192.168.122.0/24 -p tcp --dport 9099 -j ACCEPT
iptables -I INPUT -s 192.168.122.0/24 -p tcp --dport 5473 -j ACCEPT
iptables -I INPUT -s 192.168.122.0/24 -p udp --dport 4789 -j ACCEPT
iptables -I INPUT -s 192.168.122.0/24 -p udp --dport 8472 -j ACCEPT
# 保存规则(Rocky Linux 9 通过 iptables.service 开机恢复)
iptables-save > /etc/sysconfig/iptables注意:
-s 192.168.122.0/24限定为集群内网,可按实际网段调整。如果是公网环境或需要更严格的访问控制,请仅允许已知节点 IP。
方案 B:彻底关闭 iptables(仅测试/隔离环境)
bash
systemctl stop iptables.service
systemctl disable iptables.service
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT⚠️ 生产环境不建议关闭防火墙。
3. 重启新增节点 rke2-server
在新增节点上:
bash
systemctl restart rke2-server然后观察日志:
bash
journalctl -u rke2-server -f验证结果
节点状态
在现有 master 上执行:
bash
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
/var/lib/rancher/rke2/bin/kubectl get nodes -o wide预期输出:
text
NAME STATUS ROLES AGE VERSION INTERNAL-IP
rancher-ctrl-vm2 Ready control-plane,etcd,worker 19h v1.35.6+rke2r1 192.168.122.216
rancher-ctrl-vm3 Ready control-plane,etcd,worker 5m v1.35.6+rke2r1 192.168.122.164
rancher-ctrl-vm5 Ready control-plane,etcd,worker 2m v1.35.6+rke2r1 192.168.122.101组件状态
bash
/var/lib/rancher/rke2/bin/kubectl get cs预期输出:
text
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy ok节点 Pod 状态
bash
/var/lib/rancher/rke2/bin/kubectl get pods -A --field-selector spec.nodeName=<新节点主机名>预期所有关键 Pod 为 1/1 Running:
text
NAMESPACE NAME READY STATUS
kube-system etcd-xxx 1/1 Running
kube-system kube-apiserver-xxx 1/1 Running
kube-system kube-controller-manager-xxx 1/1 Running
kube-system kube-proxy-xxx 1/1 Running
kube-system kube-scheduler-xxx 1/1 Running
calico-system calico-node-xxx 1/1 Running
kube-system rke2-traefik-xxx 1/1 Running常见问题
Q: 为什么 ping 能通但 TCP 端口不通?
A: ping 使用 ICMP,而目标防火墙规则只放行 ICMP 和 22 端口,TCP 连接会被 REJECT 并返回 ICMP host-prohibited,所以出现 no route to host。
Q: 为什么 rke2-server 已经 active (running) 了,外部还是连不上 9345?
A: 服务在监听不代表防火墙放行。ss -tlnp 能看到 *:9345 监听,但 INPUT 链的 REJECT 规则会阻止外部访问。
Q: 为什么 etcd 加入后还报 authentication handshake failed?
A: 新节点 etcd 作为 learner 加入集群后,需要与现有 etcd 节点通过 2380 端口进行 peer TLS 握手。如果新节点或旧节点的 2380 被防火墙拦截,就会出现这个错误。
Q: Calico 节点为什么一直 0/1 Running?
A: Calico Felix 需要连接 Typha(端口 5473)。如果 Typha 所在节点没有放行 5473,Felix 就无法同步策略和路由信息,readiness probe 会持续 503。
预防措施
- 模板标准化:在制作 Rocky Linux 9 VM 模板时,不要预置 restrictive iptables 规则,或预置完整的 RKE2 端口白名单。
- 自动化配置:使用 Ansible / cloud-init 在节点初始化时统一写入
/etc/sysconfig/iptables或切换到firewalld管理。 - firewalld 方案(更规范):
bash
dnf install -y firewalld
systemctl enable --now firewalld
firewall-cmd --permanent --add-port=9345/tcp
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379/tcp
firewall-cmd --permanent --add-port=2380/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10257/tcp
firewall-cmd --permanent --add-port=10259/tcp
firewall-cmd --permanent --add-port=5473/tcp
firewall-cmd --permanent --add-port=4789/udp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --reload- 加入前检查:新增节点前,先用
bash -c '</dev/tcp/<ip>/<port>'检查所有 RKE2 端口是否可达。
参考命令汇总
bash
# 查看服务状态
systemctl status rke2-server --no-pager -l
# 查看日志
journalctl -u rke2-server --no-pager -n 200
# 查看节点
/var/lib/rancher/rke2/bin/kubectl --kubeconfig /etc/rancher/rke2/rke2.yaml get nodes -o wide
# 查看防火墙规则
iptables -L INPUT -n -v --line-numbers
# 保存防火墙规则
iptables-save > /etc/sysconfig/iptables
# 重启 rke2-server
systemctl restart rke2-server
# 扫描网段内 RKE2 supervisor
for i in $(seq 1 254); do
ip="192.168.122.$i"
timeout 1 bash -c "</dev/tcp/$ip/9345" >/dev/null 2>&1 && echo "$ip:9345 OPEN" &
done
wait记录时间:2026-07-16
涉及版本:RKE2 v1.35.6+rke2r1, Rocky Linux 9.8