TL;DR 尝试手动伪装Docker
一切firewalld
。
我刚刚开始在我的 Debian 10 机器上使用它,firewalld
因为我想了解它是如何工作的。
我已经Docker
在主机上安装了,我想自己管理防火墙,以了解有关 Docker 的作用、创建容器时适用的规则等以及防火墙的工作原理的更多信息。
由于 Debian 10nftables
默认使用某种iptables
包装器来使用iptables
命令来创建防火墙规则。启用Docker
后运行良好。--iptables
但是我想使用firewalld
后端nftables
并跳过与之相关的所有内容,iptables
因为它很混乱。所以/etc/systemd/system/multi-user.target.wants/docker.service
我添加了--iptables=false
Docker 以免干扰防火墙。我刷新了所有 iptables 规则等。到目前为止一切都很好。
现在说说我的问题。
所有容器都可以访问主机和彼此,但不能访问互联网。由于它们都在 172.17.0.0/16 上运行,而我的主机在 192.168.9.0/24 上,所以我需要伪装来自容器的流量。
我找不到太多有关使用 Docker 时手动管理防火墙的信息,而且由于我是 Firewalld 的新手,所以我只是猜测。
我的接口如下:
eno1 (main interface)
docker0 (docker bridge)
veth******* (one for each container)
所有veth
接口都在docker0
桥中。
所以我想我可以创建一个名为的新区域docker
,并从docker0
桥上伪装一切。
~# firewall-cmd --permanent --new-zone=docker
~# firewall-cmd --permanent --zone=docker --change-interface=docker0
~# firewall-cmd --permanent --zone=docker --add-rich-rule='rule family="ipv4" source address=172.17.0.0/16 masquerade'
~# firewall-cmd --reload
列出活动区域可以得到以下信息:
~# firewall-cmd --get-active-zones
docker
interfaces: docker0
public
interfaces: eno1
我仍然无法从容器访问互联网。我不知道这是不是正确的方法,也不知道我遗漏了什么。任何帮助我都感激不尽。
答案1
在防火墙中,需要在通向互联网的区域上设置伪装。就您而言,这似乎就是该public
区域。