マシンが2台あります。
- 192.168.0.10
- 192.168.0.20
いくつかの Docker サービスを実行します。
2 台目のマシンでは、いくつかのポートで 1 台目のマシンのサービスからの着信トラフィックを確認しています。
しかし、最初のホストを確認すると、それらのポートが使用中であることがわかりません。
たとえば、次のようなものが表示されます。
192.168.0.10:48002 -> 192.168.0.20
192.168.0.10:51364 -> 192.168.0.20
192.168.0.10:52502 -> 192.168.0.20
しかし、192.168.0.10 にアクセスしてそれらのポートを確認すると、使用中であることが示されません。
つまり、これは空になります:
sudo netstat -tulpan | grep '52502'
この原因は何でしょうか。また、どのように調査すればよいでしょうか。おそらく、Docker コンテナとポート マッピングに関係しているのではないかと思います。
編集:
サービス自体をスキャンすると、次のような結果が表示されます。
tcp6 0 0 127.0.0.1:48806 127.0.0.1:8088 ESTABLISHED 1065071/java
内部ポートが docker ネットワーク上の別のポートに接続されています... その後は何も起こりません。 これは、他のすべてのトラフィックが通過する何らかのトンネルであると想定してよいでしょうか? これをマッピングするにはどうすればよいですか?
答え1
TCP サービスに接続する場合、宛先ポートは事前にわかっています (たとえば、80
http サービスの場合) が、送信元ポートはソケットの作成時にランダムに選択され、通常は 32767 を超えるポート番号が使用されます。
表示されている3つのポートは、192.160.0.10
接続のソースポートです。192.168.0.20
答え2
コンテナトラフィックはDocker上で発生または終了しないホストDockerからまたはDockerへルーティングされるためコンテナホスト自体はルーターとして機能し、このトラフィックに使用するソケットはありません(例外docker-proxy
はNAT ヘアピンで無効にされていない場合--userland-proxy=false
、NATヘアピンニングは次のように実行されます。iptablesそしてroute_localnet
)。
DockerはiptablesそしてNAT、これらすべてはNetfilterの接続トラック。
追跡されたフローを確認するには、conntrack
コマンドを実行します (conntrack
必要な場合はパッケージをインストールしてください)。このトラフィックはすべて NAT されるため、このコマンドは関連するフローをすべて表示します。
conntrack -L --any-nat -d 192.168.0.20
これは、アドレス 192.168.0.10 のシステムで実行し、アドレス 192.168.0.20 のシステムから見たソース NAT フロー (コンテナをクライアントとして) を表示する必要があります。
アドレス 192.168.0.20 のシステム上の宛先アプリケーションも Docker コンテナ内にある場合、そのシステムで同じコマンドを実行すると、宛先 NAT フロー (コンテナをサーバーとして) が表示されます。そうでない場合は、表示する NAT がないため、何も表示されません。