Docker コンテナはサブネットと通信できませんが、Docker ホストは通信できます。パケットがドロップされている場所を見つけるにはどうすればよいでしょうか?

Docker コンテナはサブネットと通信できませんが、Docker ホストは通信できます。パケットがドロップされている場所を見つけるにはどうすればよいでしょうか?

IPv6 経由で VPN (openvpn) 上のデバイスと通信する必要がある Docker コンテナのセットアップがあります。これは、Docker ネットワークとホスト上の tap0 インターフェイスの間にブリッジを構築することによって行われます。

エンド デバイスはメッセージを Docker コンテナーにプッシュし、確認応答メッセージを受信することを期待します。ただし、これらは異なるサブネット上にあり、コンテナーとホストはサブネットにありbbbb::/64、デバイスはabcd::/64(説明のため) にあります。1 つのサブネットから別のサブネットにトラフィックをルーティングするゲートウェイがありbbbb::abcd:2、Docker ホストにはこのためのゲートウェイ構成があります。

明確に言うと:

bbbb::4001 <--> bbbb::2105 <--> bbbb::abcd:2 <--> abcd::/64

bbbb::4001コンテナのアドレス、bbbb::2105はホストのアドレス、bbbb::abcd2はゲートウェイ デバイスのアドレス、abcd::/64はエンド デバイスが配置されているサブネットです。

tsharkホストとゲートウェイで を使用すると、次のことが観察されます。

  1. ホストは abcd サブネット上のエンド デバイスと直接通信できます (traceroute で確認済み、ホストとゲートウェイ上のパケットを確認できます)。
  2. Docker コンテナはゲートウェイと通信できます (ping で確認し、ホストとゲートウェイ上のパケットを確認できました)。
  3. Dockerコンテナできなかったabcd サブネット上のエンド デバイスと直接通信します。ホストの通信の場合と同じように、ホスト上のパケットを確認できましたが、ゲートウェイには何も到着しませんでした。

転送されたパケットを許可するようにルールを変更しようとしましたがiptables(たとえば、チェーンのデフォルトポリシーをFORWARDに設定するなどACCEPT)、効果はありませんでした。

この問題はどこを調べればよいのか不明です。Dockerコンテナから、そのコンテナが存在しないサブネット宛てのパケットがドロップされるようです。どこかホスト上で、またはおそらく間違った場所に送信されますが、ホストのbr0インターフェイス上では表示されますが、ゲートウェイに到着することはありません。Docker コンテナが同じサブネット上のものと通信しようとすると、機能します。

どこから探し始めればいいのでしょうか?

答え1

問題は、docker のネットワークに関係していました。VPN に接続するためにネットワーク ブリッジを使用するように docker ネットワークを設定していました。そのブリッジは ( 経由で/etc/network/interfaces.d/br0.cfg) ゲートウェイ アドレス で設定されbbbb::2105、docker ネットワークはブリッジ インターフェイスの後に作成されました。docker ネットワークが作成されたとき、ゲートウェイ アドレスが指定されていなかったため、docker はデフォルトで をbbbb::1ゲートウェイ アドレスとして使用し、これを強制的br0に使用しました。そのアドレスは、VPN サーバーと同じアドレスです。その結果、パケットは実際にはホスト上でドロップされず、VPN サーバーのtapインターフェイスに転送され、VPN サーバーにはそれらのパケットの処理方法がわかるようにルーティング テーブルが設定されていなかったため、パケットは VPN サーバーに到達すると事実上ブラックホール化されました。

これは、tshark を使用して VPN サーバーのtapインターフェース、tapゲートウェイおよび Docker ホスト マシンのインターフェースを監視することで明らかになりました。次に、Docker コンテナー内からエンド デバイスに ping を実行したところ、Docker ホストと VPN サーバーではパケットが確認されましたが、ゲートウェイでは確認されませんでした。Docker ホストで同じことを試したところ、Docker ホストとゲートウェイではパケットが確認されましたが、VPN サーバーでは確認されませんでした。つまり、Docker コンテナーは、ホスト ネットワーク インターフェースではなく VPN サーバーにトラフィックを送信するように構成されていることが示されました。

この問題は、--gatewaydocker ネットワークの作成にオプションを導入することで解決されました。

未解決の部分はなぜこの設定は 2016 年から動作していたが、2022 年 6 月のある日突然動作しなくなったため、突然このように動作し始めたことになります。

関連情報