DockerコンテナからホストIPへのパケットルーティング

DockerコンテナからホストIPへのパケットルーティング

src(自分で「ドッカー化された」IPを持つドッカーコンテナ)で、そのドッカープロセスを実行している仮想マシンのIPアドレスに送信されたパケットのパスが何であるかを知りたいです。パケットは仮想マシンを離れますか、それともローカルにルーティングされますか?

これは、サーバー側のプロセスがすべてのインターフェイスとポートXXXをリッスンし、クライアントがホスト_ip:XXXにパケットを送信するのと似ています。

答え1

パケットは仮想マシンを離れますか、それともローカルにルーティングされますか?

質問を理解したかどうかはわかりません。 「VM」は、ネットワークネームスペースを含むネームスペースの束です。 Dockerホストはデフォルトのネットワーク名前空間を使用します。コンテナがパケットを送信すると、そのパケットはコンテナのネットワークネームスペースに存在し、ホストのデフォルトネットワークネームスペースで処理されます。持つ最終的にコンテナを残してください。はい、これは「ローカル」で、つまりすべての名前空間を含む物理システムで発生します。

実際、プロセスは非常に複雑です。ネイティブネットワークネームスペースとコンテナネットワークネームスペースの両方に多くのiptablesルールがあります(dockerのインストールで確認してください)。

答え2

これらのパケットは、デフォルトのDockerブリッジネットワークを介してローカルにルーティングされます。

docker0たとえば、Docker CEのデフォルトのブリッジネットワーク設定を持つCentOS 8ホストでは、次のようになります。

on-the-host$ ip a sh
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 0a:b4:8e:4b:9d:e3 brd ff:ff:ff:ff:ff:ff
    inet 172.20.8.151/24 brd 172.20.8.255 scope global dynamic noprefixroute eth0
       valid_lft 3175sec preferred_lft 3175sec
102: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:cd:4e:e9:51 brd ff:ff:ff:ff:ff:ff
    inet 10.200.0.1/24 brd 10.200.0.255 scope global docker0
       valid_lft forever preferred_lft forever

これで、Dockerコンテナ内のホストインスタンスにアクセスしようとしています。

within-docker-container$ ip a eth0
212: eth0@if213: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:0a:c9:08:09 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.201.8.9/24 brd 10.201.8.255 scope global eth0
       valid_lft forever preferred_lft forever

within-docker-container$ traceroute -Un 172.20.8.151
traceroute to 172.20.8.151 (172.20.8.151), 30 hops max, 60 byte packets
 1  172.20.8.151  0.054 ms  0.010 ms  0.010 ms

パケットがホストのeth0ネットワークカードに直接到着していることがわかります。

ただし、多くの低レベルの操作がホストインスタンスで発生することに注意してください。iptablesルール、ネットワークネームスペースなど!

関連情報