我刚刚在docker-ce
上安装了最新版本的CentOS,但我无法从邻近的服务器访问已发布的端口,也无法从容器本身到达外部。
运行一个普通的普通CentOS 8,启用NetworkManager和FirewallD。默认防火墙区域是public
。
版本:
docker-ce
19.03.3 (官方码头管理人员)containerd.io
1.2.6 ( CentOS 7的官方码头RPM - CentOS 8尚未提供)发布于 2019-10-11 19:19:41
在花了几天时间查看涉及到的组件的日志和配置之后,我准备认输,然后返回到Fedora 30,在那里,这似乎是开箱即用的。
专注于防火墙,我意识到禁用firewalld
似乎能起作用,但我不想这么做。在使用iptables
检查网络规则时,我意识到切换到nftables
意味着iptables
现在是一个抽象层,只显示了nftables
规则的一小部分。这意味着大部分--如果不是全部-- firewalld
配置将应用在iptables
范围之外。
我曾经能够在iptables
中找到全部真相,所以这需要一些习惯。
长话短说--要想让这件事奏效,我必须要伪装。看起来dockerd
已经通过iptables
实现了这一点,但显然需要为防火墙区域启用此功能,以使iptables
伪装才能工作:
# Masquerading allows for docker ingress and egress (this is the juicy bit)
firewall-cmd --zone=public --add-masquerade --permanent
# Specifically allow incoming traffic on port 80/443 (nothing new here)
firewall-cmd --zone=public --add-port=80/tcp
firewall-cmd --zone=public --add-port=443/tcp
# Reload firewall to apply permanent rules
firewall-cmd --reload
重新启动或重新启动dockerd
,入口和出口都应该工作。
发布于 2019-12-07 11:17:03
之前的答案所缺少的是,您首先需要将您的坞接口添加到您配置的区域,例如公共区域(或者将其添加到建议为这里的“受信任”区域,但从安全性的角度来看,我怀疑这是明智的)。因为在默认情况下,它没有分配给一个区域。还记得重新加载码头守护进程时,完成。
# Check what interface docker is using, e.g. 'docker0'
ip link show
# Check available firewalld zones, e.g. 'public'
sudo firewall-cmd --get-active-zones
# Check what zone the docker interface it bound to, most likely 'no zone' yet
sudo firewall-cmd --get-zone-of-interface=docker0
# So add the 'docker0' interface to the 'public' zone. Changes will be visible only after firewalld reload
sudo nmcli connection modify docker0 connection.zone public
# Masquerading allows for docker ingress and egress (this is the juicy bit)
sudo firewall-cmd --zone=public --add-masquerade --permanent
# Optional open required incomming ports (wasn't required in my tests)
# sudo firewall-cmd --zone=public --add-port=443/tcp
# Reload firewalld
sudo firewall-cmd --reload
# Reload dockerd
sudo systemctl restart docker
# Test ping and DNS works:
docker run busybox ping -c 1 172.16.0.1
docker run busybox cat /etc/resolv.conf
docker run busybox ping -c 1 yourhost.local
发布于 2019-11-20 17:19:45
我再次将FirewallBackend变量更改为iptable,它对我有用。
使用此更新,nftable过滤子系统是firewalld守护进程的默认防火墙后端。若要更改后端,请在/etc/firewalld.conf文件中使用FirewallBackend选项。
关于这种行为的改变,我没有太多的信息。Docker尝试使用的一些iptables规则不符合CentOS8日志:
警告: COMMAND_FAILED:'/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP‘失败: iptables:坏规则(该链中存在匹配规则吗?)
https://serverfault.com/questions/987686
复制相似问题