iptables는 모든 트래픽을 두 개의 다른 체인으로 라우팅합니까?

iptables는 모든 트래픽을 두 개의 다른 체인으로 라우팅합니까?

내가 작성하지 않은 iptables 설정을 디버깅하고 있습니다. 이 설정은 라우터 자체에서 실행되는 일부 Docker 컨테이너(Portainer 및 Nginx Proxy Manager) 주변에 방화벽을 제공하기로 되어 있지만 문제가 발생하여 두 Docker 컨테이너 모두 WAN에 웹사이트를 제공할 수 없습니다. iptables -L -v -n출력은 다음과 같습니다:

root@FriendlyWrt:/proc/sys/net/bridge# iptables -L -v -n
# Warning: iptables-legacy tables present, use iptables-legacy to see them
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
1400K  251M DOCKER-USER  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
1397K  251M DOCKER-ISOLATION-STAGE-1  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
 5815  404K ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
 2580  116K DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0           
15447 7639K 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 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain DOCKER (1 references)
 pkts bytes target     prot opt in     out     source               destination         
   83  4836 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.2           tcp dpt:9443
    1    60 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.2           tcp dpt:8000
   29  1740 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.3           tcp dpt:443
    1    60 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.3           tcp dpt:81
    2   120 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.3           tcp dpt:80

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
 pkts bytes target     prot opt in     out     source               destination         
15447 7639K DOCKER-ISOLATION-STAGE-2  all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           
1397K  251M 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           
15447 7639K RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain DOCKER-MAN (1 references)
 pkts bytes target     prot opt in     out     source               destination         
 8395  519K RETURN     all  --  br-lan docker0  0.0.0.0/0            0.0.0.0/0           
 2805  167K DROP       all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate INVALID,NEW
  236 59251 RETURN     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
1388K  251M 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         
1400K  251M DOCKER-MAN  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
  236 59251 REJECT     all  --  eth0   docker0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
1397K  251M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

"전달" 체인의 시작 부분에서는 모든 트래픽이 "docker-user" 체인으로 전송되고 다음 규칙에서는 나머지 모든 트래픽이 "docker-isolation-stage-1" 체인으로 전송되는 것처럼 보입니다. . 모든 것을 "docker-user"로 보낸 후에는 정렬할 트래픽이 더 이상 남지 않고 체인의 나머지 부분은 완전히 사용되지 않을 것이라고 가정합니다. 하지만 각 규칙에 따라 동일한 양의 트래픽이 포착된 다음 3호선으로 더 많은 트래픽이 발생하는 것처럼 보입니다. 여기서 무슨 일이 일어나고 있는 걸까요? "forward"의 처음 두 줄에서 실제로 테스트되고 있는 것은 무엇입니까?

답변1

모바일에서는 댓글이 너무 깁니다.

사용자 정의/새 체인으로 패킷을 보내는 것은 그곳에서 패킷이 반환되지 않는다는 것을 의미한다고 가정하는 것 같습니다. 그것은 다소 정확하지 않습니다.

iptables의 규칙은 순차적으로 확인됩니다.

패킷이 해당 패킷의 운명에 대한 최종 결정을 내리는 규칙(보통 ACCEPT, DROP, REJECT 및 내가 간과한 다른 항목)과 일치하면 처리가 중지됩니다.

규칙이 새/사용자 지정 체인으로 이동하는 경우 다음을 수행합니다.

  • 그 체인이 입력되었습니다
  • 해당 체인의 모든 규칙은 해당 패킷의 운명에 대한 최종 결정이 내려질 때까지 순차적으로 확인됩니다.
  • 패킷의 운명에 대한 최종 결정이 내려지지 않은 경우:
    이전 체인으로 돌아가기

이것이 DOCKER-USER 체인에서 일어나는 일입니다. 소수의 패킷만이 DOCKER-MAN 체인의 규칙이나 최종 결정을 내리는 후속 REJECT 규칙과 일치합니다. 입력된 거의 모든 패킷은 최종 결정을 충족하지 못하고 FORWARD 체인으로 돌아가 다음 규칙에 따라 처리되며 DOCKER-ISOLATION-STAGE-1 체인에 입력됩니다.

관련 정보