나는 2 대의 기계를 가지고 있습니다.
- 192.168.0.10
- 192.168.0.20
몇 가지 도커 서비스를 실행합니다.
두 번째 머신에서는 몇 개의 포트에서 첫 번째 머신의 서비스로부터 들어오는 트래픽이 보입니다.
하지만 첫 번째 호스트를 확인하면 해당 포트가 사용 중인 것으로 표시되지 않습니다.
예를 들어 다음과 같이 표시됩니다.
192.168.0.10:48002 -> 192.168.0.20
192.168.0.10:51364 -> 192.168.0.20
192.168.0.10:52502 -> 192.168.0.20
그러나 해당 포트를 확인하기 위해 192.168.0.10으로 이동하면 해당 포트가 사용 중인 것으로 표시되지 않습니다.
따라서 이것은 비어 있습니다.
sudo netstat -tulpan | grep '52502'
이 문제의 원인은 무엇이며 어떻게 조사합니까? 도커 컨테이너 및 포트 매핑과 관련이 있다고 생각합니다. 아마도?
편집하다:
서비스 자체를 검색하면 다음과 같은 내용이 표시됩니다.
tcp6 0 0 127.0.0.1:48806 127.0.0.1:8088 ESTABLISHED 1065071/java
내부 포트가 도커 네트워크의 다른 포트로 이동하고... 그 다음에는 아무것도 없습니다. 이것이 다른 모든 트래픽이 통과하는 일종의 터널이라고 가정해야 합니까? 이것을 어떻게 매핑합니까?
답변1
TCP 서비스에 연결할 때 대상 포트는 미리 알려져 있지만(예: 80
http 서비스의 경우) 소스 포트는 일반적으로 32767 이상의 포트 번호를 사용하여 소켓을 생성할 때 무작위로 선택됩니다.
에 보이는 세 개의 포트 192.160.0.10
는 연결의 소스 포트입니다.192.168.0.20
답변2
컨테이너 트래픽이 Docker에서 시작되거나 종료되지 않습니다.주인Docker에서 또는 Docker로 라우팅되기 때문입니다.컨테이너. 호스트 자체는 라우터 역할을 하며 이 트래픽에 사용되는 소켓이 없습니다 docker-proxy
.NAT 헤어핀로 비활성화되지 않은 경우 --userland-proxy=false
NAT 헤어핀 설정은 다음과 같이 수행됩니다.iptables그리고route_localnet
).
Docker가 사용하는 것처럼iptablesNAT, 이 모든 것은 Netfilter에 의해 추적됩니다.콘트랙.
추적된 흐름을 보려면conntrack
명령( conntrack
필요한 경우 패키지 설치) 이 모든 트래픽은 NAT로 연결되므로 이 명령은 관련된 모든 흐름을 표시합니다.
conntrack -L --any-nat -d 192.168.0.20
이는 주소가 192.168.0.10인 시스템에서 실행되어야 하며, 주소가 192.168.0.20인 시스템에서 본 소스 NAT 흐름(클라이언트로서의 컨테이너)을 표시해야 합니다.
주소가 192.168.0.20인 시스템의 대상 애플리케이션이 Docker 컨테이너에도 있는 경우 해당 시스템에서 실행될 때 동일한 명령을 실행하면 대상 NAT 흐름(서버로서의 컨테이너)이 표시됩니다. 그렇지 않은 경우 표시할 NAT가 없으므로 아무 것도 표시되지 않습니다.