iptables 규칙을 통해 Docker 컨테이너 브리지 네트워크의 패킷 흐름을 이해하시나요?

iptables 규칙을 통해 Docker 컨테이너 브리지 네트워크의 패킷 흐름을 이해하시나요?

배경 나는 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. 이렇게 정의된 체인과 규칙을 통한 패킷의 흐름을 이해할 수 없습니다.

이것이 지금까지 나의 이해입니다.

  1. 에서 Chain FORWARD첫 번째 규칙은 모든 소스 및 대상의 모든 트래픽이 체인으로 전송된다는 것을 명시합니다 DOCKER-USER.
  2. 체인 에는 DOCKER-USER하나의 규칙만 있습니다. 즉, 모든 소스에서 대상으로의 모든 트래픽은 FORWARD체인으로 다시 돌아가는 대상 RETURN을 갖습니다.
  3. 그런 다음 두 번째 규칙은 모든 소스와 대상의 모든 트래픽이 체인 Chain FORWARD으로 전송된다는 것을 나타냅니다.DOCKER-ISOLATION-STAGE-1
  4. DOCKER-ISOLATION-STAGE-1체인에는 두 가지 규칙이 있습니다.
    1. 규칙 1: docker0 인터페이스에서 자체 인터페이스(!docker0)가 아닌 다른 인터페이스로의 모든 트래픽은 DOCKER-ISOLATION-STAGE-2 체인으로 전송됩니다.
    2. 규칙 2: 다른 모든 트래픽은 원래 체인(예: FORWARD 또는 INPUT)으로 돌아갑니다.
  5. DOCKER-ISOLATION-STAGE-2체인에도 두 가지 규칙이 있습니다.
    1. 규칙 1: 모든 인터페이스에서 docker0 인터페이스로의 모든 트래픽이 삭제됩니다.
    2. 규칙 2: 다른 모든 트래픽은 원래 체인으로 돌아갑니다.

질문 체인 연결의 첫 번째 규칙을 이해할 수 없습니다 DOCKER-ISOLATION-STAGE-1. "docker0 인터페이스에서 자체 인터페이스(!docker0)를 제외한 모든 인터페이스로의 모든 트래픽이 DOCKER-ISOLATION-STAGE-2 체인으로 전송됩니다"라는 것은 무엇을 의미합니까?

좀 더 정확하게 알고 싶습니다.

  1. "docker0 인터페이스"는 정확히 무엇을 의미합니까?
  2. 첫 번째 규칙으로 인해 패킷이 삭제되는 패킷 흐름 시나리오는 무엇입니까 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할 수 있습니다.

편집하다아마도 natiptable도 도움이 될 것입니다

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은 모든 컨테이너가 연결되는 기본 이더넷 브리지입니다.

관련 정보