温馨提示×

debian防火墙如何兼容docker

小樊
54
2026-09-20 16:11:23
栏目: 智能运维

在 Debian 上部署 Docker 后,经常会遇到“防火墙把 Docker 容器流量也挡了”或者“Docker 自己改了 iptables 规则,导致 ufw/firewalld 失效”的问题。根本原因是:Docker 默认直接操作 iptables(底层 netfilter),而不是走 ufw / nftables 前端。

下面按常见场景说明如何“兼容”。


一、先搞清楚 Debian 的防火墙体系

Debian 常见防火墙方案:

  1. iptables(传统)
  2. nftables(Debian 10+ 默认)
  3. ufw(基于 iptables 的封装,最常用)

Docker 默认:

  • 使用 iptables
  • 在 DOCKER / DOCKER-USER 链中写规则
  • 不会读 ufw 规则

二、推荐方案(最重要)

✅ 使用 DOCKER-USER 链(官方推荐)

Docker 预留了一个链:

DOCKER-USER

所有进入容器的流量都会经过它,你可以把防火墙规则写在这里。

示例(只允许 80/443 对外):

iptables -I DOCKER-USER -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -I DOCKER-USER -i eth0 -p tcp --dport 443 -j ACCEPT
iptables -I DOCKER-USER -i eth0 -j DROP

⚠️ 不要直接改 DOCKER 链,Docker 重启会覆盖


三、如果你用 ufw(最常见坑)

问题表现

  • ufw 显示了 deny,但 Docker 端口还是能访问
  • 或 ufw 一开,Docker 网络全断

正确做法

1️⃣ 让 ufw 不管理 Docker 的桥接接口

编辑:

sudo vim /etc/ufw/after.rules

在文件末尾加上:

# BEGIN UFW AND DOCKER
*docker
:ufw-user-forward - [0:0]
:ufw-docker-allow - [0:0]
-A ufw-user-forward -j ufw-docker-allow
-A ufw-docker-allow -o docker0 -j ACCEPT
COMMIT
# END UFW AND DOCKER

2️⃣ 禁止 ufw 默认放行 Docker

sudo ufw default deny routed

3️⃣ 重启

sudo systemctl restart ufw

四、如果你用 nftables(Debian 新版)

Docker 默认不兼容 nftables 的前端规则

方案 A(推荐):Docker 继续用 iptables

确保:

sudo update-alternatives --set iptables /usr/sbin/iptables-legacy

然后:

sudo systemctl restart docker

方案 B:完全用 nftables(进阶)

需要在 Docker 中:

{
  "iptables": false
}

然后自己写 nftables 规则(不推荐新手)


五、Docker 配置建议(关键)

编辑或新建:

sudo vim /etc/docker/daemon.json
{
  "iptables": true,
  "bridge": "docker0"
}

如果你完全不想 Docker 动防火墙:

{
  "iptables": false
}

⚠️ 但这样你需要自己保证容器能上网


六、常见排错命令

# 看 Docker 写的规则
iptables -L DOCKER-USER -n -v

# 看 nat
iptables -t nat -L -n -v

# Docker 网络
docker network ls

七、一句话总结

Debian + Docker 防火墙兼容的核心:

  • 不要指望 ufw 直接管 Docker
  • 把规则写在 DOCKER-USER
  • 或明确让 Docker 用 iptables-legacy

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

  • Debian 版本(11 / 12?)
  • 用 ufw 还是 nftables
  • Docker 用途(web / 数据库 / 内网)

我可以给你一套可直接复制粘贴的配置。

0 踩