ノート PC 一台で VPN クライアントを一本接続した状態では、Linux コンテナ同士は通信を続け、Windows コンテナは止まります。変数はイメージではなく、パケットがホストへ入る経路です。既定のネットワーク上の Windows コンテナはホストのルートテーブルと変換を借りるため、ホストのルーティングを変えるポリシーはコンテナにも及びます。何かを再インストールする前に、ルート検索でそれを確認してください。

Windows コンテナのパケットがホストへ入る場所

既定の nat ネットワーク上のコンテナは、Host Networking Service のプレフィックスからアドレスを取得し、通常は 172.16.0.0/12 の内側のどこかになり、仮想アダプターを通じてホストに到達します。ホストがそのプレフィックスのルートを所有し、現在有効なアダプターに向けてトラフィックを変換します。この経路の途中に別の仮想マシンはありません。

この設計が障害を機械的にしています。コンテナがパケットを送ると、ホストはコンテナのプレフィックスについてルート検索を行います。勝ったルートがパケットの行き先になり、コンテナ側に選択の余地はありません。

VPN クライアントがその経路に加える変更

企業向けクライアントは多くの場合、広い範囲のルートと、トンネルが有効な間はローカルサブネットへのアクセスを拒否するフィルターをインストールします。意図は防御的で、侵害されたローカルネットワークが保護されたマシンに届いてはならないというものです。副作用として、ホストからコンテナのプレフィックスへのルートはローカル NAT ネットワークではなくなります。

代わりに、検索はトンネルに一致し、パケットはそのコンテナアドレスを聞いたことのないゲートウェイに渡されます。Ping は失敗し、アプリケーションはタイムアウトし、VPN アイコンが光っているのにコンテナは壊れて見えます。接続中にホストのテーブルを見れば、競合するルートを確認できます。

Container modeOutbound pathTypical result behind the VPN
Windows, default natHost routes and translates container trafficContainer prefix follows the tunnel and fails
Windows, transparentContainer sits on the physical linkDepends on the local subnet being allowed
Linux engine on Docker DesktopVM egress proxied by a host processOften keeps working

Linux コンテナの挙動が異なる理由

Linux エンジンはコンテナを軽量な仮想マシンの内側で実行し、そのマシンからの外向き接続はコンテナの代理としてホスト側のプロキシが開きます。ソケットを開始するのはホストなので、コンテナのプレフィックスに関する VPN のルールは同じようには適用されず、ワークロードはネットワークに届き続けます。

この違いは、Linux のレシピがそのまま持ち込めない理由でもあります。独自のトンネルが必要な Linux コンテナには TUN デバイスと NET_ADMIN 権限が与えられます。Windows コンテナはインターフェースをデバイスとして公開しないため、その手法に対応するものはこちら側にありません。

ルートを証明してから設計を選ぶ

証拠はコンテナからではなくホストから集めます(検索を行うのはホストだからです):

docker network inspect nat --format "{{range .IPAM.Config}}{{.Subnet}}{{end}}"
route print -4
Get-NetRoute -AddressFamily IPv4 | Where-Object DestinationPrefix -like "172.16.*"

VPN が接続する前に一度、接続後に一度、ルート出力を実行します。二度目の出力でコンテナのプレフィックスがトンネルアダプターを指していれば、診断は完了しており、コンテナを再起動しても解決しません。

最初の選択肢はポリシーの判断です。ネットワークの所有者に、このデバイスでローカル LAN へのアクセスを許可できるか尋ねてください。多くの企業向けクライアントはそれを設定として公開していますが、意図的に引いた境界を弱めます。所有者と見直し日を記した文書化された例外として求めてください。誰も見直さないデバイスごとのトグルは、防御的なポリシーが静かに消えていく道です。

ポリシーを維持しなければならない場合は、ルートと戦うのではなくワークロードを移します。明示的なサブネットとゲートウェイを持つ透過ネットワークはコンテナをローカルリンクに置き、Linux のワークロードは仮想マシンのプロキシの背後で動き、独自のクライアントを持つ別の仮想マシン は独自のポリシーを保ちます。どれか一つを意図的に選び、コンテナの内側から検証してください。ユーザーの要求はそこで生まれるからです。

関連記事