it-swarm.com.de

Wie konfiguriere ich Centos 7 FirewallD, um Docker-Containern freien Zugriff auf die Netzwerkports des Hosts zu ermöglichen?

Ich habe Docker unter CentOS 7 installiert und verwende FirewallD.

Gehen Sie in meinem Container zum Host (Standard 172.17.42.1).

Mit eingeschalteter Firewall

container# nc -v  172.17.42.1  4243
nc: connect to 172.17.42.1 port 4243 (tcp) failed: No route to Host

mit Firewall herunterfahren

container# nc -v  172.17.42.1  4243
Connection to 172.17.42.1 4243 port [tcp/*] succeeded!

Ich habe die Dokumente auf firewalld gelesen und verstehe sie nicht vollständig. Gibt es eine Möglichkeit, einfach alles in einem Docker-Container (ich denke auf dem Docker0-Adapter) uneingeschränkten Zugriff auf den Host zuzulassen?

36
adapt-dev

Vielleicht besser als die frühere Antwort;

firewall-cmd --permanent --zone=trusted --change-interface=docker0
firewall-cmd --permanent --zone=trusted --add-port=4243/tcp
firewall-cmd --reload
38
kjetildm

Diese Befehle haben es geschafft:

firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --permanent --zone=trusted --add-port=4243/tcp
12
adapt-dev

Ein Grund, warum die akzeptierte Lösung für einige Leute funktioniert, für andere jedoch nicht, liegt in einem Designproblem von firewalld. Firewalld verarbeitet nur die erste übereinstimmende Zone für Verbindungen. Es verarbeitet auch Zonen basierend auf der IP-Adresse vor Zonen basierend auf Schnittstellen. Solange eine Ihrer Zonen die vom Docker verwendeten IP-Adressen enthält, wird die ACCEPT-Regel in der vertrauenswürdigen Zone niemals verarbeitet.

Um dies zu überprüfen, können Sie sich die generierten iptables-Regeln ansehen, es sei denn, Sie verwenden das nbt-Backend:

iptables -vnL | less

Die Lösung besteht darin, anstelle der vertrauenswürdigen Zone eine direkte Firewall-Regel zu verwenden. Direkte Regeln werden immer zuerst verarbeitet. Für Port 3306 (d. H. Mysqld auf dem lokalen Host) benötigen Sie beispielsweise diese Regel:

/bin/firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 10 -p tcp --dport 3306 -i docker0 -j ACCEPT

Wenn Sie denselben Befehl ohne den Schalter --permanent wiederholen, nimmt firewalld die Änderung im laufenden Betrieb für Sie vor, und Sie sollten Docker nicht neu starten müssen.

Ein zweiter Grund ist, dass abhängig von der Docker-Version und dem von Ihnen konfigurierten Netzwerk der Datenverkehr möglicherweise nicht über die Docker0-Schnittstelle, sondern über eine separate Bridge-Schnittstelle fließt. Sie können diese Schnittstelle mit dem Befehl sehen

ip address show

Sie müssen die obige Direktregelanweisung mit dieser Bridge-Schnittstelle wiederholen.

Sie können im Docker auch Ihr eigenes Netzwerk angeben. Dieser Beitrag beschreibt den Prozess: https://serverfault.com/questions/885470/how-to-configure-firewall-on-user-defined-docker-bridge

Die Kurzversion ist, dass Sie den Netzwerkabschnitt in einer Docker-Datei wie folgt angeben:

version: '3'
  .
  .
  .
networks:
  mynetwork:
    driver_opts:
      com.docker.network.bridge.name: mynetwork_name

Sie können dies auch über die Befehlszeile tun.

2
Kevin Keane

das Folgende ermöglichte Docker den Zugriff auf das Internet unter CentOS 7 mit Firewalld

firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 4 -i docker0 -j ACCEPT
firewall-cmd --reload
systemctl restart docker
1
Jared Onnen