
TL;DR 嘗試手動偽裝所有Docker
內容firewalld
。
我剛開始在我的 Debian 10 機器上使用,firewalld
因為我想了解它是如何運作的。
我已經Docker
在主機上安裝了,我想自己管理防火牆,以了解更多關於 Docker 的作用、創建容器時它應用的規則等以及 firewalld 的工作原理。
由於 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
在firewalld中,需要在通往Internet的區域上設定偽裝。就你而言,這似乎是該public
區域。