docker-ce
我刚刚在 CentOS 上安装了最新版本,但我无法从相邻服务器访问已发布的端口,也无法从容器本身到达外部。
运行启用了 NetworkManager 和 FirewallD 的普通 CentOS 8。默认防火墙区域是public
.
版本:
docker-ce
19.03.3(官方 Docker RPM)containerd.io
1.2.6(CentOS 7 的官方 Docker RPM - CentOS 8 尚不可用)- CentOS 8.0.1905(最小安装)
docker-ce
我刚刚在 CentOS 上安装了最新版本,但我无法从相邻服务器访问已发布的端口,也无法从容器本身到达外部。
运行启用了 NetworkManager 和 FirewallD 的普通 CentOS 8。默认防火墙区域是public
.
版本:
docker-ce
19.03.3(官方 Docker RPM)containerd.io
1.2.6(CentOS 7 的官方 Docker RPM - CentOS 8 尚不可用)
在花了几天时间查看相关组件的日志和配置之后,我正要认输并返回到 Fedora 30,这似乎可以直接开箱即用。
专注于防火墙,我意识到禁用
firewalld
似乎可以解决问题,但我不想这样做。在检查网络规则时iptables
,我意识到切换到nftables
意味着iptables
现在是一个抽象层,只显示规则的一小部分nftables
。这意味着大多数(如果不是全部)firewalld
配置将在iptables
.我曾经能够在 中找到全部真相
iptables
,所以这需要一些时间来适应。长话短说 - 为此,我必须启用伪装。看起来
dockerd
已经这样做了iptables
,但显然这需要专门为防火墙区域启用才能iptables
伪装工作:重启或重启
dockerd
,入口和出口都应该工作。之前的答案中缺少的事实是,您首先需要将 docker 接口添加到您配置的区域,例如公共(或将其添加到此处建议的“受信任”区域,但从安全角度来看,我怀疑这是明智的) )。因为默认情况下它没有分配给区域。还记得在完成后重新加载 docker 守护进程。
为了能够为 Docker 设置细粒度的规则,我不需要将 docker0 设置为任何区域。
这以 /etc/firewalld/direct.xml 中定义的规则结束:
缺点仍然是您需要从 CentOS7 安装 containerd.io,如 Saustrup 所述
我再次将 FirewallBackend 变量更改为 iptables,它对我有用。
链接:Centos8 Deprecated_functionality
我没有太多关于这种行为改变的信息。根据 CentOS8 日志,Docker 尝试使用的一些 iptables 规则不起作用: