
Ich habe ein Problem, bei dem Ports, die für Anwendungen verfügbar sind, die in Docker-Containern auf unserem System ausgeführt werden, für die Welt offen bleiben, obwohl die iptables-Konfiguration den Zugriff einschränken soll.
Mir scheint, dass das Problem damit zusammenhängt, dass der Docker-Daemon beim Start Regeln zu iptables hinzufügt. Ich kenne auch die Flags --icc=true|false
, bin mir aber nicht sicher, welche Kombination dieser Flags ich anwenden soll. Ich habe es versucht --ip-forward=true|false
, aber keines von beiden hatte den gewünschten Effekt. Ich verwende es nur ungern, weil der Docker-Daemon eindeutig eine Reihe von Regeln hinzufügt, die ich manuell konfigurieren müsste, wenn ich sie noch benötige.--iptables=true|false
--icc=false
--ip-forward=false
--iptables=false
Dies ist der Status der Regeln vor dem Start des Docker-Daemons:
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 REJECT all -- !lo any anywhere loopback/8 reject-with icmp-port-unreachable
0 0 DROP tcp -- any any anywhere anywhere tcpflags:! FIN,SYN,RST,ACK/SYN state NEW
0 0 DROP all -f any any anywhere anywhere
0 0 DROP tcp -- any any anywhere anywhere tcpflags: FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
0 0 DROP tcp -- any any anywhere anywhere tcpflags: FIN,SYN,RST,PSH,ACK,URG/NONE
82 8831 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- any any anywhere anywhere icmp echo-request
0 0 ACCEPT tcp -- any any anywhere anywhere multiport dports ssh
0 0 ACCEPT tcp -- any any <IP ADDRESS RANGE 1> anywhere multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
0 0 ACCEPT tcp -- any any <IP ADDRESS RANGE 2> anywhere multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
0 0 LOG all -- any any anywhere anywhere limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
0 0 REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
24 2489 REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
77 10080 ACCEPT all -- any any anywhere anywhere
Und so sieht es aus, wenn der Docker-Daemon läuft:
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 REJECT all -- !lo any anywhere loopback/8 reject-with icmp-port-unreachable
0 0 DROP tcp -- any any anywhere anywhere tcpflags:! FIN,SYN,RST,ACK/SYN state NEW
0 0 DROP all -f any any anywhere anywhere
0 0 DROP tcp -- any any anywhere anywhere tcpflags: FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
0 0 DROP tcp -- any any anywhere anywhere tcpflags: FIN,SYN,RST,PSH,ACK,URG/NONE
1335 230K ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
1 32 ACCEPT icmp -- any any anywhere anywhere icmp echo-request
7 380 ACCEPT tcp -- any any anywhere anywhere multiport dports ssh
0 0 ACCEPT tcp -- any any <IP ADDRESS RANGE 1> anywhere multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
0 0 ACCEPT tcp -- any any <IP ADDRESS RANGE 2> anywhere multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
35 2016 LOG all -- any any anywhere anywhere limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
62 3672 REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
54492 21M DOCKER all -- any docker0 anywhere anywhere
51882 20M ACCEPT all -- any docker0 anywhere anywhere ctstate RELATED,ESTABLISHED
58371 9122K ACCEPT all -- docker0 !docker0 anywhere anywhere
0 0 DROP all -- docker0 docker0 anywhere anywhere
1186 121K REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
2090 263K ACCEPT all -- any any anywhere anywhere
Chain DOCKER (1 references)
pkts bytes target prot opt in out source destination
86 7048 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.2 tcp dpt:7990
1639 395K ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.2 tcp dpt:7999
791 151K ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.3 tcp dpt:http-alt
20 1898 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.4 tcp dpt:8090
49 4561 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.5 tcp dpt:18080
25 3642 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.6 tcp dpt:8095
Es gibt außerdem eine Reihe von POSTROUTING- und MASQUERADE-Regeln, die nicht mit angezeigt werden iptables -L
, sondern nur, wenn Sie verwenden iptables-save
. Ich bin mir auch nicht sicher, welche Bedeutung diese haben.
Ich vermute, dass die DOCKER-Zielregel in der FORWARD-Kette die Ursache des Problems ist, sehe aber keine Möglichkeit, dieses Problem zu lösen, da sie anscheinend vom Docker-Daemon am Anfang der Kette eingefügt wird.
Kann mir also jemand einen Rat geben, was ich tun muss, um sicherzustellen, dass die Ports 7990, 8090 usw. beim Ausführen von Docker nicht der Öffentlichkeit zugänglich sind?
Danke
Richard
Antwort1
Die DOCKER
Kette ist eine benutzerdefinierte Kette, die in der FORWARD-Kette definiert ist. Wenn ein Paket any
die Schnittstelle erreicht und an die Docker0-Bridge-Schnittstelle gebunden ist, wird es an die benutzerdefinierte DOCKER-Kette gesendet.
Pakete Bytes Ziel Schutz Opt-in Out Quelle Ziel 54492 21M DOCKER alle -- alle Docker0 überall überall
Jetzt nimmt die DOCKER-Kette alle eingehenden Pakete, außer denen von Docker0, und sendet sie an eine Container-IP (172.xxx) und einen Port, in diesem Fall etwa 7990.
Pakete Bytes Ziel Schutz Opt-in Out Quelle Ziel 86 7048 ACCEPT tcp -- !docker0 docker0 überall 172.17.0.2 tcp dpt:7990
Wenn Sie die Ausgabe von posten würden iptables -t nat -L -n
, würden Sie die DNAT
Regel sehen, die die Portweiterleitung vom Host zum Container durchführt. Beispielsweise würden Pakete, die die Hostschnittstelle auf 49154 erreichen, an die Container-IP 172.17.0.2 und Port 7990 weitergeleitet.
DNAT tcp – 0.0.0.0/0 0.0.0.0/0 tcp dpt:49154 bis:172.17.0.2:7990
Sie können verhindern, dass Pakete den Container erreichen, indem Sie beispielsweise die Quell-IP von 0.0.0.0 so beschränken, dass nur Pakete zugelassen werden, die aus Ihrem internen Netzwerk stammen. Um Verbindungen zum Container-Port 7990 nur von Ihrem internen Netzwerk, beispielsweise 192.168.1.0/24, zuzulassen, können Sie den folgenden Befehl ausführen -
/sbin/iptables -I WEITER '!' -s 192.168.1.0/24 -d 172.17.0.2 -p tcp --dport 7990 -j DROP
Dies würde die Weiterleitung von Paketen an einen Container mit der angegebenen IP:Port-Adresse verhindern, es sei denn, sie kommen aus dem internen Netzwerk. Sie können die Quell-/Ziel-IP und den Port je nach Ihrer Konfiguration ändern.
Antwort2
Dies wäre also ein Kommentar, aber kein Stree... Serverfault-Rep dafür.
Haben Sie die hier veröffentlichte Lösung ausprobiert:http://blog.viktorpetersson.com/post/101707677489/die-Gefahren-des-ufw-docker
--iptables=false
diese Flagge auf diese Weise zu verwenden DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"
?