在 Ubuntu 上调试 iptables 通常可以从查看规则、日志、流量跟踪、常见坑点几个方面入手。下面按实用顺序给你一套调试方法。
sudo iptables -L -n -v
sudo iptables -t nat -L -n -v
sudo iptables -t mangle -L -n -v
说明:
-n:不解析域名(更快)-v:显示流量统计(pkts / bytes)sudo iptables -L INPUT -n -v
sudo iptables -L FORWARD -n -v
sudo iptables -S
重点看:
-P INPUT DROP
-P FORWARD DROP
⚠️ 如果是 DROP,但没写放行规则,就会“莫名其妙不通”。
sudo iptables -I INPUT 1 -p tcp --dport 22 -j LOG --log-prefix "IPTABLES-SSH: "
然后观察日志:
sudo dmesg | grep IPTABLES
# 或
sudo tail -f /var/log/syslog
sudo tail -f /var/log/kern.log
例如:
iptables -A INPUT -j LOG --log-prefix "INPUT-START: "
iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "HTTP-IN: "
iptables -A INPUT -j LOG --log-prefix "INPUT-END: "
通过日志顺序判断规则走到哪一步。
sudo iptables -t raw -A PREROUTING -p tcp --dport 22 -j TRACE
sudo tail -f /var/log/kern.log
你会看到类似:
TRACE: raw:PREROUTING:rule:1
TRACE: filter:INPUT:rule:3
✅ 可以清楚看到包走了哪些表、链、规则
Ubuntu 20.04+ 默认可能用 nftables:
sudo iptables -V
如果看到:
iptables v1.8 (nf_tables)
说明 iptables 只是 nftables 的兼容层。
查看真实规则:
sudo nft list ruleset
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
并确认:
sudo ufw status
Ubuntu 默认可能用 ufw:
sudo ufw disable
sudo sysctl net.ipv4.ip_forward
如果不是 1:
sudo sysctl -w net.ipv4.ip_forward=1
iptables 自上而下匹配,例如:
❌ 错误:
iptables -A INPUT -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
✅ 正确:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP
sudo iptables -F
sudo iptables -X
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
⚠️ 生产环境谨慎
iptables -L -n -v 看是否命中iptables -S 看策略LOG 规则TRACEufw / nftablesip_forward如果你愿意,可以把:
iptables -S 输出发给我,我可以直接帮你定位问题。