netstat
試してみましたが、lsof
LXCゲストへの接続を見ることができないようです。
これを達成する方法はありますか?みんなすぐにゲストが来ますか?
本質的に私を混乱させることは、私がスーパーユーザーとして実行している間にゲストのプロセスを見ることができるということです。また、veth
各訪問者に対してインターフェイスが動的に作成されていることがわかります。他の方法では、表示されるプロセスで接続が表示されないのはなぜですか?
ベストアンサー1
カーネルはetcに接続状態を表示します/proc/net/tcp
が、/proc/net/udp
名前空間はネットワークスタックを分離するため、アプリケーションがコンテナ(別のユーザースペース)内で実行され、ネットワークに接続されている場合、ホストは/proc/net/tcp
接続を表示しません。
conntrack
マシン全体の接続を表示するために使用できます。しかし、Wireguardなどの一部のインターフェイスでは機能しません。
ip -all netns exec command
任意のユーザー空間内でコマンドを実行するために使用できます。しかし、これはip
、コマンドを使用して作成されたユーザースペースに制限されます。
コンテナで実行されているアプリケーションの観点からは、ネットワークスタックの状態はその場所のホストシステムに表示され続けるため、/proc/$pid/net/tcp
適切なツールがcで書かれるのを待つ回避策にループする小さなbashスクリプトを作成しました/proc/$pid/net/tcp[udp]
。システム全体の接続を一覧表示できるように、すべての状態を接続します。
スクリプトは最初にすべてを連結または/proc/$pid/net/tcp
ソート/proc/$pid/net/udp
し、重複を削除し、値を読み取り可能なテキストに変換して印刷します(スクリプトにはfind
、、、、、grep
およびがxargs
必要です)。awk
strtonum
sort
uniq
TCPの場合
find /proc/ 2>/dev/null | grep tcp | grep -v task | grep -v sys/net | xargs grep -v rem_address 2>/dev/null | awk '{x=strtonum("0x"substr($3,index($3,":")-2,2)); y=strtonum("0x"substr($4,index($4,":")-2,2)); for (i=5; i>0; i-=2) x = x"."strtonum("0x"substr($3,i,2)); for (i=5; i>0; i-=2) y = y"."strtonum("0x"substr($4,i,2))}{printf ("%s\t:%s\t ----> \t %s\t:%s\t%s\n",x,strtonum("0x"substr($3,index($3,":")+1,4)),y,strtonum("0x"substr($4,index($4,":")+1,4)),$1)}' | sort | uniq --check-chars=25
UDPの場合
find /proc/ 2>/dev/null | grep udp | grep -v task | grep -v sys/net | xargs grep -v rem_address 2>/dev/null | awk '{x=strtonum("0x"substr($3,index($3,":")-2,2)); y=strtonum("0x"substr($4,index($4,":")-2,2)); for (i=5; i>0; i-=2) x = x"."strtonum("0x"substr($3,i,2)); for (i=5; i>0; i-=2) y = y"."strtonum("0x"substr($4,i,2))}{printf ("%s\t:%s\t ----> \t %s\t:%s\t%s\n",x,strtonum("0x"substr($3,index($3,":")+1,4)),y,strtonum("0x"substr($4,index($4,":")+1,4)),$1)}' | sort | uniq --check-chars=25
出力は次のとおりです。 (pidは正確ではなく、コンテナを識別するためにのみ使用されます。)
127.0.0.1 :80 ----> 0.0.0.0 :0 /proc/10176/net/tcp:
192.168.0.2 :33882 ----> 192.30.253.125 :443 /proc/10176/net/tcp
192.168.0.2 :34020 ----> 192.30.253.125 :443 /proc/10176/net/tcp:
192.168.0.2 :34162 ----> 192.30.253.125 :443 /proc/10176/net/tcp:
192.168.0.2 :36242 ----> 192.30.253.124 :443 /proc/10176/net/tcp:
192.168.0.2 :37324 ----> 192.30.253.124 :443 /proc/10176/net/tcp:
192.168.0.2 :40122 ----> 216.239.38.21 :80 /proc/10176/net/tcp:
192.168.0.2 :40124 ----> 216.239.38.21 :80 /proc/10176/net/tcp:
また、非常に便利なコマンドを使用して名前空間を管理する優れたツールも見つかりました。nsutils