배경
나는 docker 컨테이너 네트워킹과 iptables 사이의 관계를 이해하고, (컨테이너에 있는) eth0 인터페이스에서 기본 브리지 docker0 인터페이스를 거쳐 호스트의 네트워크 인터페이스로 패킷이 어떻게 흐르는지 대략적으로 알고 싶습니다. 현재 기본 Docker 컨테이너 네트워크에 대한 iptables 규칙 및 체인 필터링을 이해하는 데 문제가 있습니다. 컨테이너를 실행하지 않고 명령은 다음을 sudo iptables -t filter -L -v -n
표시합니다.
$ sudo iptables -t filter -L -v -n
Chain INPUT (policy ACCEPT 108K packets, 12M bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
183K 304M DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0
183K 304M DOCKER-ISOLATION-STAGE-1 all -- * * 0.0.0.0/0 0.0.0.0/0
107K 301M ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
76705 3634K ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 98618 packets, 14M bytes)
pkts bytes target prot opt in out source destination
Chain DOCKER (1 references)
pkts bytes target prot opt in out source destination
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
pkts bytes target prot opt in out source destination
76705 3634K DOCKER-ISOLATION-STAGE-2 all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
183K 304M RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-ISOLATION-STAGE-2 (1 references)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * docker0 0.0.0.0/0 0.0.0.0/0
76705 3634K RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-USER (1 references)
pkts bytes target prot opt in out source destination
183K 304M RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
~에 따르면문서, Docker는 DOCKER-USER
명명된 두 개의 사용자 지정 iptables 체인을 추가하고 DOCKER
수신 패킷이 항상 이 두 체인에서 먼저 확인되도록 합니다. 그러나 그것은 결코 언급되지 않았습니다 DOCKER-ISOLATION-STAGE-1
. 이렇게 정의된 체인과 규칙을 통한 패킷의 흐름을 이해할 수 없습니다.
이것이 지금까지 나의 이해입니다.
- 에서
Chain FORWARD
첫 번째 규칙은 모든 소스 및 대상의 모든 트래픽이 체인으로 전송된다는 것을 명시합니다DOCKER-USER
. - 체인 에는
DOCKER-USER
하나의 규칙만 있습니다. 즉, 모든 소스에서 대상으로의 모든 트래픽은FORWARD
체인으로 다시 돌아가는 대상 RETURN을 갖습니다. - 그런 다음 두 번째 규칙은 모든 소스와 대상의 모든 트래픽이 체인
Chain FORWARD
으로 전송된다는 것을 나타냅니다.DOCKER-ISOLATION-STAGE-1
- 이
DOCKER-ISOLATION-STAGE-1
체인에는 두 가지 규칙이 있습니다.- 규칙 1: docker0 인터페이스에서 자체 인터페이스(!docker0)가 아닌 다른 인터페이스로의 모든 트래픽은 DOCKER-ISOLATION-STAGE-2 체인으로 전송됩니다.
- 규칙 2: 다른 모든 트래픽은 원래 체인(예: FORWARD 또는 INPUT)으로 돌아갑니다.
- 이
DOCKER-ISOLATION-STAGE-2
체인에도 두 가지 규칙이 있습니다.- 규칙 1: 모든 인터페이스에서 docker0 인터페이스로의 모든 트래픽이 삭제됩니다.
- 규칙 2: 다른 모든 트래픽은 원래 체인으로 돌아갑니다.
질문
체인 연결의 첫 번째 규칙을 이해할 수 없습니다 DOCKER-ISOLATION-STAGE-1
. "docker0 인터페이스에서 자체 인터페이스(!docker0)를 제외한 모든 인터페이스로의 모든 트래픽이 DOCKER-ISOLATION-STAGE-2 체인으로 전송됩니다"라는 것은 무엇을 의미합니까?
좀 더 정확하게 알고 싶습니다.
- "docker0 인터페이스"는 정확히 무엇을 의미합니까?
- 첫 번째 규칙으로 인해 패킷이 삭제되는 패킷 흐름 시나리오는 무엇입니까
DOCKER-ISOLATION-STAGE-2
?
후속 조치
iptables에 대한 내 이해에 따르면 docker0 네트워크의 Docker 컨테이너에서 나가는 트래픽이 동일한 네트워크의 다른 컨테이너에 적합하지 않은 DOCKER-ISOLATION-STAGE-1
규칙은 삭제됩니다. DOCKER-ISOLATION-STAGE-2
여기에는 Docker 호스트 또는 외부 네트워크의 다른 인터페이스에 대한 트래픽이 포함됩니다.
도커 컨테이너 네트워크와 IP 테이블에 대한 나의 이해가 정확합니까?
PS 그러나 3000, 3001에 열린 포트가 있는 두 개의 도커 컨테이너를 실행한 후 DOCKER 체인이 변경되었습니다.
Chain DOCKER (1 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:3000
0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.3 tcp dpt:3001
두 컨테이너 모두 서로와 호스트를 ping할 수 있습니다.
편집하다아마도 nat
iptable도 도움이 될 것입니다
sudo iptables -t nat -L -v -n
Chain PREROUTING (policy ACCEPT 2 packets, 168 bytes)
pkts bytes target prot opt in out source destination
5 340 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 47 packets, 3607 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT 49 packets, 3775 bytes)
pkts bytes target prot opt in out source destination
110 6860 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0
0 0 MASQUERADE tcp -- * * 172.17.0.2 172.17.0.2 tcp dpt:3000
0 0 MASQUERADE tcp -- * * 172.17.0.3 172.17.0.3 tcp dpt:3001
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
1 84 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3000 to:172.17.0.2:3000
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3001 to:172.17.0.3:3001
답변1
문제 DOCKER-ISOLATION-STAGE-1 체인의 첫 번째 규칙을 이해할 수 없습니다. "docker0 인터페이스에서 자체 인터페이스(!docker0)를 제외한 모든 인터페이스로의 모든 트래픽이 DOCKER-ISOLATION-STAGE-2 체인으로 전송됩니다"라는 것은 무엇을 의미합니까?
당신은 옳은 일을 했습니다.
DOCKER-ISOLATION-STAGE-2 링크를 통해 나가는 각 패킷을 라우팅합니다. 컨테이너에서 인터넷으로의 패킷을 제한하기 위한 별도의 규칙 사양이 있을 가능성이 높습니다.
docker0은 모든 컨테이너가 연결되는 기본 이더넷 브리지입니다.