¿iptables enruta todo el tráfico a dos cadenas diferentes?

¿iptables enruta todo el tráfico a dos cadenas diferentes?

Estoy depurando una configuración de iptables que no escribí. Se supone que esta configuración proporciona un firewall alrededor de algunos contenedores Docker (Portainer y Nginx Proxy Manager) que se ejecutan en el enrutador, pero algo va mal y ninguno de los contenedores Docker puede servir sitios web a la WAN. iptables -L -v -nla salida se ve así:

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           

Parece que al comienzo de la cadena "adelante", todo el tráfico se envía a la cadena "docker-user" y luego, en la siguiente regla, todo el tráfico restante se envía a la cadena "docker-isolation-stage-1". . Supongo que después de enviar todo al "usuario de Docker", no quedará más tráfico para ordenar y el resto de la cadena quedará completamente sin uso. Pero parece que cada regla captura cantidades iguales de tráfico, y luego algo más de tráfico continúa hacia la línea 3. ¿Qué está pasando aquí? ¿Qué se pone realmente a prueba en las dos primeras líneas de "forward"?

Respuesta1

En el móvil y demasiado largo para un comentario.

Parece que asume que enviar un paquete a una cadena nueva/personalizada significa que no regresará desde allí. Eso es algo incorrecto.

Las reglas en iptables se verifican secuencialmente

El procesamiento se detiene cuando un paquete coincide con una regla que da una decisión final sobre el destino de ese paquete (generalmente ACCEPT, DROP, REJECT y tal vez otras que pasé por alto).

Cuando una regla es saltar a una cadena nueva/personalizada, entonces:

  • esa cadena se entra
  • Todas las reglas de esa cadena se verifican secuencialmente hasta que se toma una decisión final sobre el destino de ese paquete.
  • Si no se toma una decisión final sobre el destino del paquete:
    VOLVER a la cadena anterior

Eso es lo que sucede en tu Cadena DOCKER-USER, solo un puñado de paquetes coinciden con una regla en la cadena DOCKER-MAN o la regla REJECT posterior que resulta en una decisión final. Casi todos los paquetes que ingresaron no cumplen con una decisión final y regresan a la cadena FORWARD donde son procesados ​​por la siguiente regla, ingresarán a la cadena DOCKER-ISOLATION-STAGE-1

información relacionada