在 Ubuntu 上 iptables 配置“不生效”,通常不是 iptables 本身的问题,而是系统机制或配置方式不对。下面按最常见原因逐一说明,并给出解决办法。
从 Ubuntu 18.04+ 开始:
iptables 命令仍然存在iptables 是 iptables-nft 兼容层iptables -L 能看到规则ls -l /usr/sbin/iptables
如果指向:
/usr/sbin/iptables-nft
说明你用的是 nftables 后端。
sudo nft list ruleset
编辑:
sudo nft add table inet filter
sudo nft add chain inet filter input { type filter hook input priority 0 \; }
sudo nft add rule inet filter input drop
开机自启:
sudo systemctl enable nftables
sudo update-alternatives --config iptables
选择:
iptables-legacy
然后:
sudo systemctl stop nftables
sudo systemctl disable nftables
你加了规则:
iptables -A INPUT -p tcp --dport 22 -j DROP
重启后: ❌ 规则没了
sudo iptables-save > /etc/iptables/rules.v4
开机恢复:
sudo apt install iptables-persistent
如果你装了 Docker:
iptables -L DOCKER-USER
✅ 把规则加到 DOCKER-USER 链
iptables -I DOCKER-USER -p tcp --dport 80 -j DROP
iptables 是 顺序匹配,命中即停
错误示例:
iptables -A INPUT -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
✅ 正确:
iptables -I INPUT -p tcp --dport 22 -j DROP
Ubuntu 默认启用 UFW
sudo ufw status
如果 active:
✅ 要么用 UFW:
sudo ufw deny 22
❌ 要么关掉 UFW 再用手动 iptables
如果你在:
那么:
# 1. 看 iptables 后端
ls -l /usr/sbin/iptables
# 2. 看当前规则
sudo iptables -S
sudo nft list ruleset
# 3. 看是否 Docker
docker ps
# 4. 看是否 UFW
sudo ufw status
如果你愿意,可以告诉我:
我可以直接帮你写可生效的配置。