温馨提示×

如何调试debian iptables问题

小樊
42
2026-10-04 16:48:54
栏目: 智能运维

在 Debian 上调试 iptables 问题,通常可以从规则检查、日志、连接跟踪、系统状态几个层面入手。下面是一套比较实用的排查思路和命令。


一、确认 iptables 是否真正生效

1. 查看当前规则

iptables -L -n -v
iptables -t nat -L -n -v
iptables -t mangle -L -n -v
  • -n:不解析域名
  • -v:显示数据包/字节计数(很重要,可看规则是否命中)

2. 确认默认策略

iptables -S

重点看:

-P INPUT DROP
-P FORWARD DROP

如果默认是 DROP,很容易“自以为放行其实没放”。


二、确认 iptables 后端(很重要)

Debian 10+ 默认可能用 nftables 或 iptables-nft,而不是传统 iptables-legacy。

查看当前使用的后端

iptables --version

输出可能是:

  • iptables v1.8.7 (legacy)
  • iptables v1.8.7 (nf_tables)

切换后端(如需要)

update-alternatives --config iptables

三、检查网络是否真的被 iptables 拦截

1. 临时清空规则测试

iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

⚠️ 仅用于测试,生产环境谨慎

如果清空后网络正常,说明问题在规则。


四、使用日志定位被丢弃的包

1. 添加 LOG 规则

iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: "

或更精确:

iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH-TRY: "

2. 查看日志

dmesg | grep IPTABLES
journalctl -k | grep IPTABLES

五、检查连接跟踪(conntrack)

很多问题出在 ESTABLISHED,RELATED 没放行。

正确基础规则示例

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

查看连接状态

conntrack -L

或

cat /proc/net/nf_conntrack

六、检查接口和地址是否正确

1. 确认网卡名

ip addr

常见坑:

  • 规则写在 eth0,实际是 ens33

2. 检查源/目的地址

iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT

七、Docker / K8s 干扰(非常常见)

Docker 会自动修改 iptables。

查看 Docker 规则

iptables -L DOCKER-USER -v

在 Docker 前插入规则

iptables -I DOCKER-USER -i eth0 -j DROP

八、持久化问题(规则没保存)

Debian 重启后规则可能丢失。

保存规则

iptables-save > /etc/iptables/rules.v4

安装持久化工具

apt install iptables-persistent

九、常见典型问题速查表

现象 可能原因
SSH 连不上 INPUT 没放行 22
能 ping 不能访问服务 只放 ICMP
本机能访问,外部不能 没放 ESTABLISHED
Docker 端口异常 Docker 改了规则
重启后失效 没保存

十、调试建议总结

  1. 先看计数(-v)
  2. 再看日志(LOG)
  3. 最后对比规则顺序
  4. 注意 Docker / nftables 干扰

如果你有具体现象(比如“Debian 无法访问 80 端口”或“Docker 容器不能上网”),可以把:

  • iptables -S
  • ip addr
  • 错误表现

发出来,我可以帮你精确分析。

0 踩