it-swarm.com.de

Keine Netzwerkverbindung zum / vom Docker CE-Container unter CentOS 8

Ich habe gerade die neueste Version von docker-ce Unter CentOS installiert, aber ich kann veröffentlichte Ports von einem benachbarten Server nicht erreichen und kann nicht nach außen gelangen von der Container selbst.

Ausführen eines einfachen Vanilla CentOS 8 mit aktiviertem NetworkManager und FirewallD. Die Standard-Firewall-Zone ist public.

Versionen:

  • docker-ce 19.03.3 (offizielle Docker-RPM)
  • containerd.io 1.2.6 (offizielles Docker-RPM für CentOS 7 - noch nicht für CentOS 8 verfügbar)
  • CentOS 8.0.1905 (minimale Installation)
10
Saustrup

Nachdem ich ein paar Tage damit verbracht hatte, Protokolle und Konfigurationen für die beteiligten Komponenten zu untersuchen, wollte ich gerade das Handtuch werfen und zu Fedora 30 zurückkehren, wo dies sofort zu funktionieren scheint.

Als ich mich auf die Firewall konzentrierte, wurde mir klar, dass das Deaktivieren von firewalld den Trick zu tun schien, aber ich würde es vorziehen, dies nicht zu tun. Bei der Überprüfung der Netzwerkregeln mit iptables wurde mir klar, dass der Wechsel zu nftables bedeutet, dass iptables jetzt eine Abstraktionsschicht ist, die nur einen kleinen Teil der nftables Regeln. Das bedeutet, dass die meisten - wenn nicht alle - der firewalld -Konfiguration außerhalb des Bereichs von iptables angewendet werden.

Ich war es gewohnt, die ganze Wahrheit in iptables zu finden, daher ist dies gewöhnungsbedürftig.

Lange Rede, kurzer Sinn - damit dies funktioniert, musste ich das Maskieren aktivieren. Es sah so aus, als hätte dockerd dies bereits über iptables getan, aber anscheinend muss dies speziell für die Firewall-Zone aktiviert werden, damit iptables maskiert funktioniert:

# Masquerading allows for docker ingress and egress (this is the juicy bit)
firewall-cmd --zone=public --add-masquerade --permanent

# Specifically allow incoming traffic on port 80/443 (nothing new here)
firewall-cmd --zone=public --add-port=80/tcp
firewall-cmd --zone=public --add-port=443/tcp

# Reload firewall to apply permanent rules
firewall-cmd --reload

Starten Sie dockerd neu oder starten Sie es neu, und sowohl Ingress als auch Egress sollten funktionieren.

17
Saustrup

Was in den vorherigen Antworten fehlt, ist die Tatsache, dass Sie zuerst Ihre Docker-Schnittstelle zu der von Ihnen konfigurierten Zone hinzufügen müssen, z. public (oder fügen Sie es der "vertrauenswürdigen" Zone hinzu, die vorgeschlagen wurde hier , aber ich bezweifle, dass dies aus Sicherheitsgründen sinnvoll ist). Weil es standardmäßig keiner Zone zugeordnet ist. Denken Sie auch daran, den Docker-Daemon neu zu laden, wenn Sie fertig sind.

# Check what interface docker is using, e.g. 'docker0'
ip link show

# Check available firewalld zones, e.g. 'public'
Sudo firewall-cmd --get-active-zones

# Check what zone the docker interface it bound to, most likely 'no zone' yet
Sudo firewall-cmd --get-zone-of-interface=docker0

# So add the 'docker0' interface to the 'public' zone. Changes will be visible only after firewalld reload
Sudo nmcli connection modify docker0 connection.zone public

# Masquerading allows for docker ingress and egress (this is the juicy bit)
Sudo firewall-cmd --zone=public --add-masquerade --permanent
# Optional open required incomming ports (wasn't required in my tests)
# Sudo firewall-cmd --zone=public --add-port=443/tcp
# Reload firewalld
Sudo firewall-cmd --reload
# Reload dockerd
Sudo systemctl restart docker

# Test ping and DNS works:
docker run busybox ping -c 1 172.16.0.1
docker run busybox cat /etc/resolv.conf
docker run busybox ping -c 1 yourhost.local
2
masi

Ich habe die Variable FirewallBackend wieder in iptables geändert und es funktioniert für mich.

Mit diesem Update ist das nftables-Filter-Subsystem das Standard-Firewall-Backend für den Firewalld-Daemon. Verwenden Sie zum Ändern des Backends die Option FirewallBackend in der Datei /etc/firewalld.conf.

Link: Centos8 Deprecated_functionality

Ich habe nicht zu viele Informationen über diese Verhaltensänderung. Einige der iptables-Regeln, die Docker zu verwenden versucht, funktionieren nicht gemäß den CentOS8-Protokollen:

WARNUNG: COMMAND_FAILED: '/ usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' fehlgeschlagen: iptables: Ungültige Regel (gibt es in dieser Kette eine übereinstimmende Regel?).

0
TawHK