在 Centos 7 上,我希望 Docker 容器能够访问主机,因此我尝试将 docker0 添加到受信任区域:
# firewall-cmd --permanent --zone=trusted --add-interface=docker0
The interface is under control of NetworkManager and already bound to 'trusted'
The interface is under control of NetworkManager, setting zone to 'trusted'.
success
# firewall-cmd --get-zone-of-interface=docker0
no zone
这曾经可以工作,但由于某种原因无法在此服务器上工作。我也试过了firewall-cmd --reload
,没什么。就好像完全忽略了firewalld命令一样。该 NetworkManager 消息似乎很可疑,firewalld 和 NetworkManager 是否可能存在某种冲突?
出于绝望,我也尝试了: 在接口配置中nmcli connection modify docker0 connection.zone trusted
正确设置了,ZONE=trusted
但firewalld仍然显示接口不在受信任区域中。
这里发生了什么?
答案1
据我所知,除非有一个使用由firewalld(即eth0)直接识别的受信任区域的接口,否则受信任区域不会被标记为活动状态。为了解决这个问题,您可以使用以下命令显式设置 iptables 规则:
firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 3 -i docker0 -j ACCEPT
firewall-cmd --reload
systemctl restart docker
这里的“3”是在您的输入链中插入规则的位置,您的里程可能会有所不同。运行这些命令后,我能够从容器访问主机端口。
答案2
您应该将端口或服务添加到trusted
区域并重新加载防火墙配置。
有一个例子:
要在内部区域中暂时允许 443/tcp 端口,请键入:
systemctl start firewalld
systemctl enable firewalld
firewall-cmd --zone=trusted --add-port=443/tcp
firewall-cmd --reload
核实:
firewall-cmd --get-active-zones
允许端口永久存在:
firewall-cmd --permanent --zone=trusted --add-port=443/tcp
另外以下命令应该返回:
firewall-cmd --get-zone-of-interface=docker0
trusted