
你有没有遇到过这种情况?Kubernetes集群的NodePort服务突然访问不上了,但Pod之间通信却正常。
排查了半天,最后发现是iptables规则被误删了。
说实话,iptables这个老牌工具虽然强大,但学习曲线确实陡峭。特别是那"四表五链"的概念,第一次接触时真让人头大。
今天咱们就来彻底搞懂iptables,从基础架构到Kubernetes故障排查实战,一篇讲透。
iptables是Linux内核级的防火墙工具,它通过用户空间的iptables命令来配置内核空间的netfilter框架,实现对数据包的精准控制。
iptables的核心结构就是"四表五链"。
四表指的是四个功能表,每个表负责不同的任务:
记忆口诀:raw → mangle → nat → filter,缩写是"rmnf",记成"热米饭"就很 easy 了。
五链是数据包流经的五个关键节点:
不同类型的数据包,经过的链也不一样:
流量类型 | 流经链顺序 |
|---|---|
入站流量(到本机) | PREROUTING → INPUT |
转发流量(经本机) | PREROUTING → FORWARD → POSTROUTING |
出站流量(从本机) | OUTPUT → POSTROUTING |
以入站流量为例,完整流程是这样的:
数据包到达 → PREROUTING链(raw表检查是否启用连接跟踪 → mangle表修改元数据 → nat表做DNAT)→ 路由决策 → INPUT链(mangle表再次处理 → filter表决定是否允许)
iptables命令的基本格式:
iptables -t <表名> <操作命令> <链名> [匹配条件] -j <动作>比如想添加一条规则:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT这条规则的意思是:在INPUT链末尾添加(-A)一条规则,匹配(-p)tcp协议且目标端口是(--dport)22的数据包,执行动作(-j)是接受(ACCEPT)。
-A追加规则(加到链的末尾)-I插入规则(可以指定位置)-D删除规则-L列出规则(加上--line-numbers可以显示行号)-F清空链中的所有规则-p tcp/udp/icmp # 指定协议类型
-s 192.168.1.0/24 # 指定源IP网段
-d 10.0.0.1 # 指定目标IP
--dport 80 # 指定目标端口
-i eth0 # 指定入站网卡
-m state --state ESTABLISHED # 匹配已建立的连接--log-prefix "FW_LOG: "前缀)1. 放行SSH访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT2. 端口转发(DNAT)
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-dest 192.168.1.100:80这条规则的意思是:将访问本机8080端口的流量,转发到192.168.1.100的80端口。
3. 动态IP出口(MASQUERADE)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE这适合IP地址经常变化的场景,比如ADSL拨号。
4. 防御SYN洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT这条规则限制SYN包每秒只能有1个,多余的会被丢弃。
在Kubernetes环境中,iptables是网络通信的核心组件,很多网络问题都和它有关。
现象:NodePort服务访问失败,但Pod间通信正常 根因:节点iptables规则被误删或DOCKER链策略冲突
1. 检查NodePort规则是否存在
iptables -t nat -L KUBE-NODEPORTS -nv --line-numbers如果KUBE-NODEPORTS链不存在或规则为空,说明kube-proxy没有正常工作。
2. 验证FORWARD链策略
iptables -L FORWARDFORWARD链的策略必须是ACCEPT,否则转发流量会被阻断。
3. 跟踪数据包路径
tcpdump -i eth0 port 30080观察数据包是否到达节点,以及节点是否发出回应。
4. 检查conntrack状态
conntrack -L -d确认连接跟踪记录是否正常。
说实话,用传统的iptables -L命令排查问题,确实挺让人头疼的:
-j KUBE-SVC-XXX)难以追溯cali-FORWARD)缺乏上下文说明为了解决这些痛点,我们可以开发一个链关系拓扑分析脚本。
功能 | 实现方式 | 价值 |
|---|---|---|
树状拓扑展示 | 递归解析-j/-g跳转目标 | 直观呈现链间依赖关系 |
规则语法高亮 | 颜色标记匹配条件/动作 | 快速定位关键元素 |
循环引用检测 | 访问路径跟踪+深度限制 | 防止无限递归导致崩溃 |
安全交互式选择 | select菜单选择表/链 | 避免误操作关键链 |
# 1. 执行脚本
./show_iptables.sh
# 2. 选择表(比如filter)和链(比如INPUT)
可用iptables表:
1) raw 2) mangle 3) filter 4) nat
? 3
表 filter 的可用链:
1) INPUT 2) FORWARD 3) OUTPUT ...
? 1
# 3. 获取拓扑图
■ iptables链关系拓扑 ■
├── INPUT
│ ├─ ▪ -p tcp --dport 22 -j ACCEPT # 灰色为规则
│ └─ ▪ -j cali-INPUT # 红色跳转目标
└── cali-INPUT # 子链(颜色循环标记)
├─ ▪ -m set --match-set src_allowed src -j ACCEPT
└─ ▪ -j DROP这样就能清楚地看到链之间的跳转关系,排查起来方便多了。
KUBE-前缀的链net.ipv4.ip_forward=1iptables-save > iptables.bak遇到问题时,按这个思路排查:
iptables虽然复杂,但它是Linux网络安全的基石。掌握了四表五链架构与数据流路径,再配合可视化工具进行规则分析,能显著提升Kubernetes等复杂环境的网络排障效率。
当传统命令行无法应对海量规则时,拓扑可视化是破局关键。
说实话,学习iptables确实需要一些时间,但一旦你掌握了它,就会发现它在排查网络问题时是多么好用。
“无他,惟手熟尔”!有需要的用起来!
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!