2016-12-12 2 views
4

Einige der Dienste, die wir auf unseren Servern mit Docker ausführen, versuchen, eine Verbindung zu privaten IP-Adressen herzustellen (10.0.0.0/8, 192.0.0.0/16, 172.16.0.0/12 , 100.64.0.0/10).Ausgehende Verbindungen zu privaten IPs von Docker-Containern blockieren

Dieses Verhalten ist normal, aber unser Serveranbieter erkennt diesen Datenverkehr und sendet uns Warnungen.

Wir möchten nur den ausgehenden Verkehr stoppen, nicht die eingehenden mit iptables.

Dies ist unsere aktuelle Setup:

-A OUTPUT -d 192.168.0.0/16 -m owner --uid-owner `id -u dockeruser` -j REJECT --reject-with icmp-port-unreachable 
-A OUTPUT -d 100.64.0.0/10 -m owner --uid-owner `id -u dockeruser` -j REJECT --reject-with icmp-port-unreachable 
-A OUTPUT -d 172.16.0.0/12 -m owner --uid-owner `id -u dockeruser` -j REJECT --reject-with icmp-port-unreachable 
-A OUTPUT -d 10.0.0.0/8 -m owner --uid-owner `id -u dockeruser` -j REJECT --reject-with icmp-port-unreachable 

aber dies scheint nicht zu funktionieren, weil Docker die folgenden Regeln erstellt:

Chain FORWARD (policy ACCEPT) 
target  prot opt source    destination 
DOCKER-ISOLATION all -- anywhere    anywhere 
DOCKER  all -- anywhere    anywhere 

Für die Leistungen:

Chain DOCKER (1 references) 
target  prot opt source    destination 
ACCEPT  tcp -- anywhere    172.17.0.2   tcp dpt:1234 
ACCEPT  tcp -- anywhere    172.17.0.4   tcp dpt:1234 

Schließlich:

Chain DOCKER-ISOLATION (1 references) 
target  prot opt source    destination 
RETURN  all -- anywhere    anywhere 

Jede Rückmeldung wird geschätzt.

+0

Ich bin kein Iptables-Experte, aber Sie können verhindern, dass Docker Ihre iptables ändert, indem Sie 'iptables = false 'als Flag an den Daemon übergeben, wenn Sie ihn starten. – johnharris85

+0

Danke für den Rat, aber wir wollen, dass Docker seine eigenen Firewall-Regeln hinzufügt –

+0

Alles oder nichts atm afaik. – johnharris85

Antwort

3

Sie fügen die Regeln in der falschen Kette hinzu. Der Datenverkehr, der von einem Andock-Container stammt, durchläuft die FORWARD-Kette der filter-Tabelle, nicht die OUTPUT-Kette. Dies liegt daran, dass aus Sicht des Hostcomputers der Datenverkehr von der docker0-Schnittstelle eingeht und der Host-Computer lediglich als Weiterleitung fungiert.

Um zwischen eingehenden und ausgehenden Datenverkehr zu unterscheiden, verwenden Sie die Optionen -i und -o, um die Schnittstelle anzugeben. Außerdem können Sie mit uid nicht feststellen, ob der Datenverkehr von einem Andock-Container kommt (da die Daten nicht lokal stammen). Die Überprüfung der eingehenden Schnittstelle ist dafür ausreichend.

So fügen Sie die folgenden Regeln für die DOCKER-ISOLATION Kette (die sich aus der FORWARD Kette genannt wird):

-A DOCKER-ISOLATION -d 192.168.0.0/16 -i docker0 ! -o docker0 -j REJECT --reject-with icmp-port-unreachable 
-A DOCKER-ISOLATION -d 100.64.0.0/10 -i docker0 ! -o docker0 -j REJECT --reject-with icmp-port-unreachable 
-A DOCKER-ISOLATION -d 172.16.0.0/12 -i docker0 ! -o docker0 -j REJECT --reject-with icmp-port-unreachable 
-A DOCKER-ISOLATION -d 10.0.0.0/8 -i docker0 ! -o docker0 -j REJECT --reject-with icmp-port-unreachable 

ersetzen docker0 durch Namen des virtuellen von Docker geschaffene Schnittstelle.

(Hinweis: Wenn die Kette DOCKER-ISOLATION nicht existiert, direkt an FORWARD Kette anhängen).

Schauen Sie sich auch die Ausgabe von iptables -vL und iptables -t nat -vL an, um besser zu verstehen, wie Adressen übersetzt werden.

+0

Die ursprüngliche Antwort funktionierte nicht, bis wir die Regeln in der ersten Position mit '-I FORWARD 1' in die 'FORWARD'-Kette einfügen. Ich habe Ihre Antwort bearbeitet, aber wenn es gegen die Regeln verstößt, aktualisieren Sie sie bitte selbst, damit andere davon profitieren können. –

+0

Das Einfügen dieser Regeln in den Anfang der 'FORWARD'-Kette ist keine gute Idee, da es eingehenden Datenverkehr aus diesen IP-Bereichen verhindern würde (die Sie zulassen möchten). Hängen Sie entweder am Ende der 'FORWARD'-Kette an oder, wenn Sie eine Kette namens 'DOCKER-ISOLATION' haben, hängen Sie daran an. – Tanmay

+0

Die ursprüngliche Antwort funktionierte nicht, da die 'DOCKER'-Kette nur für ausgehenden Verkehr verwendet wird (docker0 to physical interface). Ich habe die Antwort bearbeitet. – Tanmay

Verwandte Themen