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