温馨提示×

为什么ubuntu iptables不生效

小樊
37
2026-10-18 14:40:14
栏目: 智能运维

在 Ubuntu 上 iptables 配置“不生效”,通常不是 iptables 本身的问题,而是系统机制或配置方式不对。下面按最常见原因逐一说明,并给出解决办法。


一、Ubuntu 默认使用 nftables(最常见原因)

从 Ubuntu 18.04+ 开始:

  • iptables 命令仍然存在
  • 但底层其实是 nftables
  • 你看到的 iptables 是 iptables-nft 兼容层

问题表现

  • iptables -L 能看到规则
  • 但流量根本没被拦截
  • 重启后规则消失

检查方式

ls -l /usr/sbin/iptables

如果指向:

/usr/sbin/iptables-nft

说明你用的是 nftables 后端。

解决方式(任选其一)

✅ 方案 1:直接用 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

✅ 方案 2:强制使用 legacy iptables

sudo update-alternatives --config iptables

选择:

iptables-legacy

然后:

sudo systemctl stop nftables
sudo systemctl disable nftables

二、规则没保存(重启后失效)

iptables 本身不会自动保存

你加了规则:

iptables -A INPUT -p tcp --dport 22 -j DROP

重启后: ❌ 规则没了

解决办法

Ubuntu(legacy iptables)

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

开机恢复:

sudo apt install iptables-persistent

三、Docker 干扰 iptables(非常常见)

如果你装了 Docker:

  • Docker 会 自动修改 iptables
  • 你的规则可能被 Docker 的链绕过

现象

  • 端口明明 DROP 了
  • 但容器端口仍然能访问

检查

iptables -L DOCKER-USER

正确做法

✅ 把规则加到 DOCKER-USER 链

iptables -I DOCKER-USER -p tcp --dport 80 -j DROP

四、规则顺序错误(被前面的 ACCEPT 绕过)

iptables 是 顺序匹配,命中即停

错误示例:

iptables -A INPUT -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

✅ 正确:

iptables -I INPUT -p tcp --dport 22 -j DROP

五、UFW 正在管理 iptables

Ubuntu 默认启用 UFW

sudo ufw status

如果 active:

  • 你手动写的 iptables 可能被 UFW 覆盖

建议

✅ 要么用 UFW:

sudo ufw deny 22

❌ 要么关掉 UFW 再用手动 iptables


六、网络命名空间 / 容器环境

如果你在:

  • Docker
  • LXC
  • Kubernetes
  • 云服务器安全组

那么:

  • 宿主机 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

如果你愿意,可以告诉我:

  • Ubuntu 版本
  • 是否装了 Docker
  • 你想实现什么规则(例如“禁止某 IP”)

我可以直接帮你写可生效的配置。

0 踩