Docker をfirewalld で使用する

Docker をfirewalld で使用する

TL;DR すべてを手動Dockerで偽装しようとしていますfirewalld

firewalldどのように動作するかを学びたいので、Debian 10 マシンで使い始めました。

Dockerホストにインストールして、Docker の機能、コンテナの作成時に適用されるルールなど、firewalld の動作について詳しく知るために、ファイアウォールを自分で管理したいと考えています。

Debian 10 はデフォルトで を使用し、コマンドを使用してファイアウォール ルールを作成できるようにnftables何らかのiptablesラッパーを使用するため、 が有効になっていると正常に実行されます。iptablesDocker--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

関連情報