在 Ubuntu 上 iptables“看起来失效” 是很常见的问题,通常不是 iptables 本身坏了,而是被其他机制接管或规则没真正生效。下面按最常见原因逐一说明,并给出排查方法。
ufwUbuntu 桌面/服务器默认启用 ufw(基于 iptables 的封装)。
sudo ufw status
如果显示 active,你直接写的 iptables 规则可能被 ufw 覆盖。
✅ 解决:
sudo ufw allow 22
sudo ufw disable
Ubuntu 20.04+ 很多版本:
iptables 实际是 iptables-nft检查:
iptables -V
如果显示:
iptables v1.8.x (nf_tables)
说明是 nft 后端。
✅ 排查:
sudo nft list ruleset
如果你用 iptables 写规则,但 nftables 有冲突规则,就会“失效”。
iptables -A INPUT -p tcp --dport 80 -j DROP
但:
✅ 正确思路:
iptables -I INPUT 1 -p tcp --dport 80 -j DROP
检查顺序:
iptables -L INPUT -n --line-numbers
Docker 会自动管理 iptables,并插入自己的规则。
现象:
原因:
DOCKER-USER 链DOCKER-USER 里写规则✅ 正确做法:
iptables -I DOCKER-USER -p tcp --dport 3306 -j DROP
查看:
iptables -L DOCKER-USER -n
iptables 默认不持久化
sudo apt install iptables-persistent
sudo netfilter-persistent save
否则:
如果你在:
你看到的 iptables 不是宿主机的
✅ 检查:
ip netns
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
如果你后面才加 DROP,已建立的连接不会断。
# 1. 是否启用 ufw
sudo ufw status
# 2. iptables 后端
iptables -V
# 3. 查看规则
sudo iptables -S
sudo iptables -L -n -v
# 4. 是否有 nftables
sudo nft list ruleset
# 5. 是否 Docker
docker ps
iptables -L DOCKER-USER
ufwnftablesDOCKER-USER如果你愿意,可以告诉我:
我可以直接帮你写正确可用的规则。