將 Docker 與 Firewalld 結合使用

將 Docker 與 Firewalld 結合使用

TL;DR 嘗試手動偽裝所有Docker內容firewalld

我剛開始在我的 Debian 10 機器上使用,firewalld因為我想了解它是如何運作的。

我已經Docker在主機上安裝了,我想自己管理防火牆,以了解更多關於 Docker 的作用、創建容器時它應用的規則等以及 firewalld 的工作原理。

由於 Debian 10nftables預設使用某種iptables包裝器,以便能夠使用iptables命令建立防火牆規則。啟用Docker後運行良好。--iptables

然而,我想firewalldnftables後端一起使用並跳過所有與之相關的內容,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

在firewalld中,需要在通往Internet的區域上設定偽裝。就你而言,這似乎是該public區域。

相關內容