私のサーバーでは Shorewall を単純な standalone firewall として使用していますが、 Docker も使用したいと考えています。
Dockerコンテナーとそのポートリダイレクトを使用することにより、Dockerは独自のiptablesルール/チェーンをセットアップします。これは、shorewallが再起動されると強制終了されます。したがって、コンテナはunreachableになります。
誰かが岸壁の再起動時にDockerルールを保存/復元できましたか、それとも別の回避策がありますか?
以下も参照してください。
次の構成変更により、DockerとShorewallホスト間のトラフィックフローが確保されます。 Shorewall 4.5.21.9でテスト済みですが、最新バージョンに適用されるはずです。
/ etc/shorewall/shorewall.conf
IP転送が有効になっていることを確認します(ほとんどの構成項目は「はい/いいえ」ですが、これは「オン」です)。
IP_FORWARDING=On
/ etc/shorewall/masq
プライベートDockerネットワークのマスカレード(NAT)を有効にします(別のネットワークを使用している場合、つまり、--bip=#.#.#.#/#
、次に変更します)。変化する eth0
外部接続を備えたホストマシン上の任意のインターフェース:
#INTERFACE:DEST SOURCE
eth0 172.17.0.0/16
/ etc/shorewall/interfaces
インターフェースエントリを追加して、Shorewallがdock
ゾーンが関連するインターフェースを認識できるようにします。
#ZONE INTERFACE OPTIONS
dock docker0
/ etc/shorewall/zones
新しいゾーンを作成します。 docker
は長すぎるため、「無効なゾーン名」エラーが発生することに注意してください。
#ZONE INTERFACE
dock ipv4
/ etc/shorewall/policy
おそらく、Dockerコンテナーがホストマシンおよびと通信できるようにする必要があるので、これは良い出発点です。
#SOURCE DEST POLICY
# ...(other policies)...
dock all ACCEPT
# ...(other policies, catch-all)...
ACCEPT
からfw
でまだ開いていない場合は、dock
からfw
へのトラフィックにも同様のall
ポリシーが必要になる場合があります。
policyまたはrulesファイルで、必要に応じてこれをさらに引き締めることができます。たとえば、上記では外部トラフィックがDockerコンテナに到達することを明示的に許可していません。他のゾーン/ポリシー/ルールを確認してください。
Dockerがネットワーク分離機能を導入したため、カスタムネットワークを使用する場合、ここで説明する他のソリューションでは不十分です。 Shorewall 5.0.6では、Dockerネットワークを含む Dockerのサポート が導入されています。この:
再起動の前にDOCKER
チェーンを保存し、その後で再び復元する拡張スクリプトを作成することにより、Dockerルールセットがショアウォールの再起動に耐えることを確認できます。 これを行う方法の例 を付けて投稿を投稿しましたが、唯一可能な方法とは程遠いと確信しています。
私の箱でそれを理解しました。 /etc/shorewall.confに以下が含まれていることを確認してください:
IP_FORWARDING=Yes
Dockerは転送に依存しており、すべてのサーバーで「パペット」がそれを「いいえ」に設定する間隔をあけました。
更新:DockerからのトラフィックをWANインターフェースから出力することも必要になるでしょう。
/etc/shorewall/masq
を編集すると、次のような行が必要になります。
br0 172.17.0.0/12
この場合、my WANインターフェイスは実際にはbr0(ブリッジ)ですが、おそらくeth0のようになります(ifconfig
を使用して、インターフェイスとそのIPアドレスを確認してください)。 。私のマシンでは、dockerは172.17.0.0/24を使用しています。これはRFC1918プライベートアドレス範囲です。これは他のシステムでは異なる場合がありますが、ifconfig
をもう一度使用して範囲を確認できます。インターフェースdocker0
。
更新アクションはiptableを実行しないため、ルールまたはポリシーを更新するだけの場合は、再起動する代わりに更新を実行します。
Sudo shorewall refresh
もちろん、本当に海岸壁を再起動する必要がある場合でも、問題は解決しません。次に、Dockerを再起動してコンテナを再起動する必要があります。
1つの可能なオプションは、-net = Hostオプションを指定してDockerを実行し、コンテナー化されたアプリケーションがIP転送およびNATなしでホストネットワークにアクセスできるようにすることです。
Dockerサービスは、実行中のコンテナに影響を与えることなく再起動でき、Shorewallの再起動後に実行して、docker固有のルールを再ロードできます。明らかに、コンテナーへのネットワークが中断される短時間があります。
これは、少なくとも私のいくつかのArchlinuxインストールでは当てはまります。