在 Ubuntu 系统中使用 firewalld 时,默认情况下,firewalld 不会对 Docker 容器的网络流量生效。这是因为 Docker 在启动时会自动创建自己的 iptables 规则来管理网络,绕过了 firewalld 的规则。这种行为可以确保 Docker 容器的网络功能正常,但也会导致 firewalld 的规则无法控制 Docker 端口。
具体原因有以下几点:
1. Docker 使用 iptables
Docker 默认会直接操作 iptables 来管理网络连接,而不是通过 firewalld。因此,firewalld 中的规则不会影响 Docker 创建的容器的网络流量。
2. Docker 配置覆盖 firewalld
Docker 会修改 iptables 规则,以确保容器能够进行网络连接和端口转发。这些规则可能与 firewalld 的设置发生冲突,导致 firewalld 对 Docker 的流量无效。
解决方案
如果你希望 firewalld 可以控制 Docker 容器的网络流量,可以尝试以下几种方法。
方法 1: 配置 Docker 使用 firewalld 管理规则
可以通过修改 Docker 的配置,禁用 Docker 自己管理 iptables,让 firewalld 接管。
打开 Docker 配置文件(如果文件不存在,可以新建一个):
1
sudo nano /etc/docker/daemon.json
添加以下配置,禁用 Docker 自动修改
iptables:1
2
3{
"iptables": false
}重启 Docker 服务:
1
sudo systemctl restart docker
通过禁用 Docker 的 iptables 规则,网络流量将由 firewalld 进行控制。
注意:禁用
iptables后,你需要手动管理网络规则,确保容器仍然可以正常访问外部网络。
方法 2: 使用 iptables 自定义规则
如果你不希望禁用 Docker 的 iptables 管理,你可以通过手动添加 iptables 规则来配合 firewalld。
确认 Docker 的网络桥接接口(通常是
docker0):1
ifconfig
在
firewalld中允许或限制该接口的流量。例如:1
2sudo firewall-cmd --zone=trusted --add-interface=docker0 --permanent
sudo firewall-cmd --reload
这样可以将 docker0 接口添加到 firewalld 的 trusted 区域,允许其网络流量。
总结
firewalld 对 Docker 容器的端口没有生效,是因为 Docker 默认直接操作 iptables,绕过了 firewalld 的规则。你可以通过禁用 Docker 的 iptables 管理功能,或手动配置 iptables 来使 firewalld 生效。