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
답변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
당연히 컨테이너에 이를 설치해야 합니다.