在 Debian 上调试 iptables 问题,通常可以从规则检查、日志、连接跟踪、系统状态几个层面入手。下面是一套比较实用的排查思路和命令。
iptables -L -n -v
iptables -t nat -L -n -v
iptables -t mangle -L -n -v
-n:不解析域名-v:显示数据包/字节计数(很重要,可看规则是否命中)iptables -S
重点看:
-P INPUT DROP
-P FORWARD DROP
如果默认是 DROP,很容易“自以为放行其实没放”。
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 -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
⚠️ 仅用于测试,生产环境谨慎
如果清空后网络正常,说明问题在规则。
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: "
或更精确:
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH-TRY: "
dmesg | grep IPTABLES
journalctl -k | grep IPTABLES
很多问题出在 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
ip addr
常见坑:
eth0,实际是 ens33iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
Docker 会自动修改 iptables。
iptables -L DOCKER-USER -v
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 改了规则 |
| 重启后失效 | 没保存 |
如果你有具体现象(比如“Debian 无法访问 80 端口”或“Docker 容器不能上网”),可以把:
iptables -Sip addr发出来,我可以帮你精确分析。