ドッカーコンテナとソケットについて質問があります。今日、ホストシステムにマップされたポート(または他のポート)を持つドッカーコンテナがorを使用しても表示されないことがわかりました-p 80:80
。その後、ポート80でリスナーを開いてテストしようとしましたが、チャンスはありませんでした。ポート80への接続を拒否しましたが、このポートは一部のプロセスによって開いているとマークされていません。netstat
ss
lsof -i
sudo
sudo 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
またはで表示されない理由ですss
。lsof
同様の理由で表示されません。コンテナlsof
の実行中のプロセスを表示し、そのファイル記述子の一部がソケットであることを確認できますが、ローカルネットワークスタックのソケットにあるソケットを接続することはできません。ネットワークネームスペース)、これらのソケットの実際の意味は見つかりません。
Dockerがコンテナ用のローカルソケットを生成できる唯一のケースは、Dockerが実行中で、オプションで次のようにdocker-proxy
処理できる場合です。NATヘアピン。最新の基本設定はすべて機能するため、使用されなくなりました。iptables。
Dockerは通常NATも行います。これを行うには、次の点に依存します。iptablesそしてWebフィルタ~のつながるNAT接続を覚えておいてください。これつながる次のコマンドを使用して項目を照会できます。conntrack
conntrack
ツール(通常または名前のパッケージとして提供されます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の情報と相関し、実際のターゲットコンテナを見つけることができます。