Docker&Shorewall


16

サーバーでShorewallを単純なスタンドアロンファイアウォールとして使用していますが、Dockerも使用したいと考えています。

Dockerコンテナとそのポートリダイレクションドッカーを使用することにより、独自のiptablesルール/チェーンをセットアップします。これは、shorewallが再起動されると強制終了されます。そのため、コンテナは到達不能になります。

誰かが岸壁の再起動時にドッカールールを保存/復元できましたか?または別の回避策がありますか?

こちらもご覧ください:

回答:


19

次の構成変更により、DockerとShorewallホスト間のトラフィックフローが確保されます。Shorewall 4.5.21.9でテスト済みですが、最新バージョンに適用する必要があります。

/etc/shorewall/shorewall.conf

IP転送が有効になっていることを確認します(ほとんどの設定項目は「はい/いいえ」ですが、これは「オン」です)。

IP_FORWARDING=On

/ etc / shorewall / masq

プライベートDockerネットワークのマスカレーディング(NAT)を有効にします(別のネットワークを使用する場合、つまりでdockerを起動し--bip=#.#.#.#/#、それに応じて変更します)。eth0外部接続のあるホストマシン上の任意のインターフェイスに変更します。

#INTERFACE:DEST         SOURCE
eth0                    172.17.0.0/16

/ etc / shorewall / interfaces

インターフェイスエントリを追加して、dockゾーンがどのインターフェイスに関連するかをShorewallが把握できるようにします。

#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あなたは既にでそれを開かなかった場合は、fwall

必要に応じて、ポリシーまたはルールファイルでこれをさらに強化できます。たとえば、上記は外部トラフィックがDockerコンテナに到達することを明示的に許可しません。他のゾーン/ポリシー/ルールを確認してください。


1
IP_FORWARDING=YesIP_FORWARDING=True同様に動作します。私はいくつかの本番ルーターでそれを持っていますが、あなたの答えは私のものよりもはるかに明確です。すごい仕事。
アーロンC.デブルーン14

私の無知を許してください-与えられたルールを追加した後、岸壁を再起動すると、ドックが「空のインターフェース」であるという警告が表示されます...そして実際、上記を読んで、岸壁がどのように172.17アドレスとゾーン「ドック」。shorewallがどのように機能するかについて明らかな何かを見逃していますか?
ジョンクレメンツ

申し訳ありませんが、interfacesファイルの変更を見逃しました。回答を編集しました/etc/shorewall/interfaces。新しいセクションをご覧ください。
ファジー

ありがとうございました。また、ホストをコンテナに参加させるために、shorewall 5(docker対応)でもうまく機能しています。
ドラシル

それがブロックされてしまいます-マスカレードの設定は、それ以外のドッキングウィンドウ・コンテナは、外部IPを使用して他の容器にアクセスすることができなくなり、非常に重要です
オイゲン・メイヤー

6

Dockerにネットワーク分離機能が導入されたため、カスタムネットワークを使用する場合、ここで説明した他のソリューションでは不十分です。Shorewall 5.0.6では、Dockerネットワークを含むDockerのサポートが導入されています。この:

  • 岸壁とドッカーを任意の順序で開始/停止/再起動できます
  • 拡張スクリプトを維持する必要がありません

2

ちょうど私の箱でそれを考え出した。/etc/shorewall.confに以下が含まれていることを確認します。

IP_FORWARDING=Yes

Dockerは転送に依存しており、すべてのサーバーで「パペット」が「いいえ」に設定する間隔を空けています。

更新:おそらく、ドッカーからのトラフィックをWANインターフェイスにマスカレードする必要があります。

編集する/etc/shorewall/masqと、次のような行が必要になります。

br0 172.17.0.0/12

この場合、WANインターフェイスは実際にはbr0(ブリッジ)ですが、おそらくeth0のようなものになります。(ifconfigインターフェイスとそのIPアドレスを表示するために使用します)。私のマシンでは、DockerはRFC1918プライベートアドレス範囲である172.17.0.0/24を使用します。これは他のシステムでは異なる場合がありますが、ifconfigもう一度使用してインターフェイスを探すことで範囲を確認できますdocker0


2

再起動のDOCKER前にチェーンを保存し、その後再びそれを復元する拡張スクリプトを作成することにより、Dockerルールセットがショアウォールの再起動に耐えることができます。これを行う方法の例を投稿しましたが、可能な唯一の方法とはほど遠いものと確信しています。


0

Dockerサービスは、実行中のコンテナーに影響を与えることなく再起動でき、Shorewallの再起動後に実行して、Docker固有のルールを再ロードできます。コンテナへのネットワークが中断される時間は明らかに短いでしょう。

これは、少なくとも私のいくつかのArchlinuxインストールでは当てはまります。


0

更新アクションはiptableをパージしないため、ルールまたはポリシーを更新するだけの場合は、restartの代わりにrefreshを実行するだけです。

sudo shorewall refresh

ショアウォールを本当に再起動する必要がある場合、明らかに問題は残ります。次に、Dockerを再起動して、コンテナを再起動する必要があります。


0

可能なオプションの1つは、Dockerを--net = hostオプションで実行して、IP転送とNATなしでコンテナー化されたアプリケーションがホストネットワークにアクセスできるようにすることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.