web-dev-qa-db-ja.com

Docker&Shorewall

私のサーバーでは Shorewall を単純な standalone firewall として使用していますが、 Docker も使用したいと考えています。

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

誰かが岸壁の再起動時にDockerルールを保存/復元できましたか、それとも別の回避策がありますか?

以下も参照してください。

17
jaltek

次の構成変更により、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コンテナに到達することを明示的に許可していません。他のゾーン/ポリシー/ルールを確認してください。

20
fazy

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

  • 岸壁とドッカーを任意の順序で開始/停止/再開することができます
  • 拡張スクリプトを維持する必要性を回避
7
linuxhackerman

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

2
womble

私の箱でそれを理解しました。 /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

2

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

Sudo shorewall refresh

もちろん、本当に海岸壁を再起動する必要がある場合でも、問題は解決しません。次に、Dockerを再起動してコンテナを再起動する必要があります。

0
lenybernard

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

0
DukeLion

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

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

0
atom