LXC 게스트에 대한 연결을 포함하여 내 호스트에 대한 모든 연결을 어떻게 나열합니까?

LXC 게스트에 대한 연결을 포함하여 내 호스트에 대한 모든 연결을 어떻게 나열합니까?

netstat시도해 보았지만 lsofLXC 게스트에 대한 연결을 볼 수 없는 것 같습니다.

이것을 달성할 수 있는 방법이 있습니까?모두곧 손님이 오나요?


본질적으로 나를 혼란스럽게 하는 것은 내가 슈퍼유저로 실행하는 동안 게스트의 프로세스를 볼 수 있다는 것입니다. 또한 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필요함 ).awkstrtonumsortuniq

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

답변2

제 생각에는https://stackoverflow.com/a/40352004/1951468당신에게 대답해야합니다.

따라서 기본적으로 유일한 방법은 컨테이너와 nsenter.

답변3

사용하시면 될 것 같아요sudo conntrack -L

conntrack은 시스템 관리자를 위한 사용자 공간 명령줄 프로그램입니다. 이를 통해 커널 내 연결 추적 상태 테이블을 보고 관리할 수 있습니다.

설치되지 않은 경우 필요한 패키지는 conntrack-tools(Fedora 등) 또는 conntrack(Debian, Ubuntu 등)입니다.

답변4

지금까지는 컨테이너에서 netstat를 실행하여 컨테이너를 연결하는 데 행운이 있었습니다.

sudo docker exec -it <containerIdOrName> netstat

당연히 컨테이너에 이를 설치해야 합니다.

관련 정보