
TL;DR すべてを手動Docker
で偽装しようとしていますfirewalld
。
firewalld
どのように動作するかを学びたいので、Debian 10 マシンで使い始めました。
Docker
ホストにインストールして、Docker の機能、コンテナの作成時に適用されるルールなど、firewalld の動作について詳しく知るために、ファイアウォールを自分で管理したいと考えています。
Debian 10 はデフォルトで を使用し、コマンドを使用してファイアウォール ルールを作成できるようにnftables
何らかのiptables
ラッパーを使用するため、 が有効になっていると正常に実行されます。iptables
Docker
--iptables
firewalld
ただし、バックエンドで使用し、混乱を招くだけなので、nftables
関係するものはすべてスキップします。そのため、Docker がファイアウォールを混乱させないように を追加しました。すべての iptables ルールなどをフラッシュしましたが、これまでのところすべて問題ありません。iptables
/etc/systemd/system/multi-user.target.wants/docker.service
--iptables=false
さて、私の問題です。
すべてのコンテナはホストと相互にアクセスできますが、インターネットにはアクセスできません。コンテナはすべて 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 では、インターネットにつながるゾーンにマスカレードを設定する必要があります。あなたの場合、それがゾーンのようですpublic
。