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 -n
la 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