将 Docker 与 Firewalld 结合使用

将 Docker 与 Firewalld 结合使用

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=falseDocker 以免干扰防火墙。我刷新了所有 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区域。

相关内容