Leitet iptables den gesamten Datenverkehr an zwei verschiedene Ketten weiter?

Leitet iptables den gesamten Datenverkehr an zwei verschiedene Ketten weiter?

Ich debugge ein iptables-Setup, das ich nicht geschrieben habe. Dieses Setup soll eine Firewall um einige Docker-Container (Portainer und Nginx Proxy Manager) bereitstellen, die auf dem Router selbst laufen, aber etwas läuft schief und keiner der Docker-Container kann Websites an das WAN senden. Die iptables -L -v -nAusgabe sieht folgendermaßen aus:

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           

Es sieht so aus, als ob am Anfang der „Forward“-Kette der gesamte Datenverkehr an die „Docker-User“-Kette gesendet wird und dann in der nächsten Regel der gesamte verbleibende Datenverkehr an die „Docker-Isolation-Stage-1“-Kette. Ich würde annehmen, dass nach dem Senden von allem an „Docker-User“ kein Datenverkehr mehr zum Sortieren übrig wäre und der Rest der Kette völlig ungenutzt wäre. Aber es scheint, als ob von jeder Regel gleiche Mengen Datenverkehr abgefangen werden und dann etwas mehr Datenverkehr in Zeile 3 weitergeht. Was ist hier los? Was wird in den ersten beiden Zeilen von „Forward“ eigentlich getestet?

Antwort1

Auf dem Handy und zu lang für einen Kommentar

Sie gehen anscheinend davon aus, dass das Senden eines Pakets an eine benutzerdefinierte/neue Kette bedeutet, dass es von dort nicht zurückkehrt. Das ist etwas falsch.

Die Regeln in iptables werden sequentiell überprüft

Die Verarbeitung wird beendet, wenn ein Paket einer Regel entspricht, die eine endgültige Entscheidung über das Schicksal dieses Pakets vorgibt (normalerweise ACCEPT, DROP, REJECT und möglicherweise andere, die ich übersehen habe).

Wenn eine Regel den Sprung zu einer neuen/benutzerdefinierten Kette vorsieht, dann gilt:

  • diese Kette wird eingegeben
  • Alle Regeln in dieser Kette werden nacheinander überprüft, bis eine endgültige Entscheidung über das Schicksal dieses Pakets getroffen wird
  • Wenn keine endgültige Entscheidung über das Schicksal des Pakets getroffen wird:
    ZURÜCK zur vorherigen Kette

Das ist, was in Ihrer Kette DOCKER-USER passiert. Nur eine Handvoll Pakete erfüllen eine Regel in der Kette DOCKER-MAN oder die nachfolgende REJECT-Regel, die zu einer endgültigen Entscheidung führt. Fast alle eingehenden Pakete erfüllen keine endgültige Entscheidung und kehren zur Kette FORWARD zurück, wo sie von der nächsten Regel verarbeitet werden. Sie gelangen in die Kette DOCKER-ISOLATION-STAGE-1

verwandte Informationen