도커 컨테이너와 소켓에 대해 질문이 있습니다. 오늘 호스트 시스템에 매핑된 포트(또는 다른 포트)가 있는 도커 컨테이너가 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그리고웹 필터~의연결하다NAT 연결을 기억하세요. 이것연결하다다음 명령을 사용하여 항목을 쿼리할 수 있습니다.conntrack
conntrack
도구(일반적으로 또는 이름의 패키지로 제공됨 conntrack-tools
)
Docker의 기본 모드인 NAT를 사용하면 Docker 뒤의 트래픽을 쉽게 알 수 있습니다. 응답 대상이 쿼리 소스와 다른 항목은 SNAT(MASQUERADE 포함)이 수행되었음을 의미합니다. 어느연결하다쿼리 대상과 소스가 다른 항목에 응답한다는 것은 DNAT(리디렉션 포함)가 수행되었음을 의미합니다. conntrack
이는 충분한 옵션을 사용하여 수행할 수 있습니다.
conntrack -L --src-nat
conntrack -L --dst-nat
conntrack -L --any-nat
첫 번째는 일반적으로 MASQUERADE가 수행되는 컨테이너에서 외부로 나가는 연결 연결을 표시합니다. 두 번째는 일반적으로 외부에서 DNATed 컨테이너로 들어오는 연결 연결을 표시하고 세 번째는 모든 것을 표시합니다. 물론 더 많은 필터를 추가할 수도 있습니다.
이벤트 모드에서 이러한 상관 관계를 모니터링하려면 -E
재정의를 사용하십시오 .-L
물론 Docker가 NAT를 수행하지 않도록 구성한 경우에는연결하다상태 저장 방화벽에 계속 사용되므로 필터링 옵션이 제공되지 않는 한 소스와 대상이 계속 표시됩니다.
그런 다음 컨테이너 네임스페이스 주소의 일부인 IP 주소(예: 일반적으로 172.17.0.0/16)에 대해도커 0, 그리고 추가로 172.18.0.0/16 또는 구성된 대로), 이는 Docker의 정보와 상호 연관되어 실제 대상 컨테이너를 찾을 수 있습니다.