温馨提示×

ubuntu iptables怎样兼容ufw

小樊
48
2026-10-06 21:32:54
栏目: 智能运维

在 Ubuntu 上,ufw(Uncomplicated Firewall)本质是对 iptables(或 nftables)的前端封装。只要使用方式正确,它们是“天然兼容”的。下面从原理、使用建议、常见冲突与解决方法几个方面说明。


一、核心结论(先说重点)

✅ 推荐做法:只用 ufw,不要直接改 iptables
✅ ufw 的规则最终都会写入 iptables
❌ 不要一边用 ufw,一边手写 iptables -A/-I 乱改规则
❌ 不要在 ufw 规则之外直接清空 iptables(iptables -F)


二、ufw 与 iptables 的关系

在 Ubuntu 中:

  • ufw → 用户友好工具
  • iptables → 真正的内核防火墙规则
  • ufw 启动后,会:
    • 清空并接管 filter 表
    • 使用 ufw-* 链(如 ufw-before、ufw-after)

查看真实规则:

sudo iptables -L -n -v

你会看到大量 ufw-* 链。


三、正确使用方式(兼容关键)

1️⃣ 启用 ufw(前提)

sudo ufw enable

2️⃣ 只用 ufw 管理规则

sudo ufw allow 22
sudo ufw allow 80/tcp
sudo ufw deny 3306

✅ 这些规则会自动同步到 iptables


四、如果“必须”用 iptables,怎么办?

✅ 正确方式:写进 ufw 的 before/after 规则

编辑对应文件:

sudo nano /etc/ufw/before.rules
# 或
sudo nano /etc/ufw/after.rules

示例(放行特定内网):

-A ufw-before-input -s 10.0.0.0/8 -j ACCEPT

然后:

sudo ufw reload

✅ 这样完全兼容 ufw


五、常见“不兼容”问题 & 解决

❌ 问题 1:直接 iptables -A INPUT -j DROP

结果:

  • ufw reload 后规则被清掉
  • 或 ufw 顺序错乱

✅ 解决:

  • 不要直接用 iptables
  • 或放进 before.rules / after.rules

❌ 问题 2:ufw 没生效

检查:

sudo ufw status
sudo ufw status verbose

确保:

  • ufw enabled
  • 没被 Docker 覆盖(见下)

❌ 问题 3:Docker 打乱 ufw

Docker 会直接写 iptables,可能绕过 ufw。

✅ 解决(二选一):

  1. Docker 使用 ufw 兼容模式(复杂)
  2. 在 /etc/docker/daemon.json 禁用 iptables:
{
  "iptables": false
}

⚠️ 不推荐新手这么做


六、排查 & 调试命令

# 查看 ufw 规则
sudo ufw status numbered

# 查看真实 iptables
sudo iptables -S
sudo iptables -L -n -v

# 查看 ufw 日志
sudo tail -f /var/log/ufw.log

七、最佳实践总结 ✅

场景 建议
普通服务器 只用 ufw
需要复杂规则 写 before/after.rules
Docker 谨慎处理
云平台 同时看安全组

如果你有具体场景(比如:Docker + ufw、K8s、端口转发、NAT),可以贴出来,我可以给你一份可直接用的配置示例。

0 踩