Dockerマッピングポートが 'netstat'、 'ss'、および 'lsof'に表示されない

Dockerマッピングポートが 'netstat'、 'ss'、および 'lsof'に表示されない

ドッカーコンテナとソケットについて質問があります。今日、ホストシステムにマップされたポート(または他のポート)を持つドッカーコンテナがorを使用しても表示されないことがわかりました-p 80:80。その後、ポート80でリスナーを開いてテストしようとしましたが、チャンスはありませんでした。ポート80への接続を拒否しましたが、このポートは一部のプロセスによって開いているとマークされていません。netstatsslsof -isudosudo nc -l -p 80

この問題は、コンテナ化またはネットワーク名前空間によって引き起こされると思います。しかし、使用されているソケットを低レベル、カーネルレベル別にリストできるコマンドが必要ですか?

ps:portmap()でdockerホストネットワークインターフェイスのIPアドレスを使用しようとすると、-p 172.17.0.1:80:80上記のコマンドを使用して表示されます。

ps-2:lsof | grep -w 80出力:

lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
Xorg        718                             root   37u      CHR              13,80       0t0      10891 /dev/input/event16
Xorg        718   749 Xorg:disk             root   37u      CHR              13,80       0t0      10891 /dev/input/event16
Xorg        718   778 Xorg:disk             root   37u      CHR              13,80       0t0      10891 /dev/input/event16
Xorg        718   787 Xorg:disk             root   37u      CHR              13,80       0t0      10891 /dev/input/event16
Xorg        718   841 InputThre             root   37u      CHR              13,80       0t0      10891 /dev/input/event16

答え1

Dockerを使用すると、システムは外部の世界と実行中のコンテナの間でルーターとして機能できます。ルータはルーティングを実行するためにソケットを使用しません(セルフサービスのみ、またはリモートサービスにアクセスするためにのみ)。これがコンテナ接続がnetstatまたはで表示されない理由ですsslsof同様の理由で表示されません。コンテナlsofの実行中のプロセスを表示し、そのファイル記述子の一部がソケットであることを確認できますが、ローカルネットワークスタックのソケットにあるソケットを接続することはできません。ネットワークネームスペース)、これらのソケットの実際の意味は見つかりません。

Dockerがコンテナ用のローカルソケットを生成できる唯一のケースは、Dockerが実行中で、オプションで次のようにdocker-proxy処理できる場合です。NATヘアピン。最新の基本設定はすべて機能するため、使用されなくなりました。iptables

Dockerは通常NATも行います。これを行うには、次の点に依存します。iptablesそしてWebフィルタ~のつながるNAT接続を覚えておいてください。これつながる次のコマンドを使用して項目を照会できます。conntrackconntrackツール(通常または名前のパッケージとして提供されますconntrack-tools

DockerのネイティブモードであるNATを使用すると、Dockerの背後にあるトラフィックを簡単に把握できます。応答の宛先 この照会ソースとは異なる項目は、SNAT (MASQUERADE を含む) が実行されたことを意味します。どのつながるクエリのターゲットとソースが異なるエントリに応答するということは、DNAT(リダイレクトを含む)が行われたことを意味します。conntrackこれは十分なオプションを使用して行うことができます。

conntrack -L --src-nat
conntrack -L --dst-nat
conntrack -L --any-nat

1 つ目は、通常、MASQUERADE が実行されるコンテナから外部への接続接続を表示します。 2 番目は通常、外部から DNATed コンテナに入る接続接続を示し、3 番目はすべてを表示します。もちろん、より多くのフィルタを追加することもできます。

イベントモードでこれらの相関関係を監視するには、-Eオーバーライドを使用します。-L

もちろん、DockerがNATを実行しないように設定した場合は、つながるステートフルファイアウォールで引き続き使用されるため、フィルタリングオプションが提供されていない限り、ソースとターゲットは引き続き表示されます。

次に、コンテナの名前空間アドレスの一部であるIPアドレス(通常は172.17.0.0/16)についてドッカー0、そしてさらに172.18.0.0/16または設定されているように)、これはDockerの情報と相関し、実際のターゲットコンテナを見つけることができます。

関連情報