GNU/Linux >> Znalost Linux >  >> Linux

Žádné síťové připojení do/z kontejneru Docker CE na CentOS 8

Řešení 1:

Po pár dnech strávených prohlížením protokolů a konfigurací příslušných komponent jsem se chystal hodit ručník do ringu a vrátit se zpět k Fedoře 30, kde to vypadá, že to funguje hned po vybalení.

Když jsem se zaměřil na firewall, uvědomil jsem si, že vypnutí firewalld Zdálo se, že to dělá trik, ale raději bych to nedělal. Při kontrole síťových pravidel pomocí iptables , uvědomil jsem si, že přepnutí na nftables znamená, že iptables je nyní abstraktní vrstva, která zobrazuje pouze malou část nftables pravidla. To znamená většinu – ne-li všechny – z firewalld konfigurace bude použita mimo rozsah iptables .

Byl jsem zvyklý najít celou pravdu v iptables , takže si na to budete muset trochu zvyknout.

Zkrátka – aby to fungovalo, musel jsem povolit maskování. Vypadalo to jako dockerd již to udělal přes iptables , ale zjevně to musí být výslovně povoleno pro zónu brány firewall pro iptables maskování do práce:

# 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

Restartujte nebo restartujte dockerd a vstup i výstup by měly fungovat.

Řešení 2:

Co v předchozích odpovědích chybí, je skutečnost, že nejprve musíte přidat rozhraní dockeru do zóny, kterou konfigurujete, např. public (nebo ji přidejte do „důvěryhodné“ zóny, která zde byla navržena, ale pochybuji, že je to z hlediska bezpečnosti rozumné). Protože ve výchozím nastavení není přiřazena k zóně. Po dokončení také nezapomeňte znovu načíst démona dockeru.

# 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

Řešení 3:

Abych mohl nastavit jemná pravidla pro Docker, nemusel jsem nastavit docker0 na žádnou zónu.

# 1. Stop Docker
systemctl stop docker
# 2. Recreate DOCKER-USER chain in firewalld. 
firewall-cmd --permanent \
             --direct \
             --remove-chain ipv4 filter DOCKER-USER

firewall-cmd --permanent \
             --direct \
             --remove-rules ipv4 filter DOCKER-USER

firewall-cmd --permanent \
             --direct \
             --add-chain ipv4 filter DOCKER-USER

# (Ignore any warnings)

# 3. Docker Container <-> Container communication

firewall-cmd --permanent \
             --direct \
             --add-rule ipv4 filter DOCKER-USER 1 \
             -m conntrack --ctstate RELATED,ESTABLISHED \
             -j ACCEPT \
             -m comment \
             --comment 'Allow docker containers to connect to the outside world'

firewall-cmd --permanent \
             --direct \
             --add-rule ipv4 filter DOCKER-USER 1 \
             -j RETURN \
             -s 172.17.0.0/16 \
             -m comment \
             --comment 'allow internal docker communication'

# Change the Docker Subnet to your actual one (e.g. 172.18.0.0/16)
# 4. Add rules for IPs allowed to access the Docker exposed ports.

firewall-cmd --permanent \
             --direct \
             --add-rule ipv4 filter DOCKER-USER 1 \
             -o docker0 \
             -p tcp \
             -m multiport \
             --dports 80,443 \
             -i eth0 \
             -o docker0 \
             -s 1.2.3.4/32 \
             -j ACCEPT \
             -m comment \
             --comment 'Allow IP 1.2.3.4 to docker ports 80 and 443'
# 5. log docker traffic (if you like)

firewall-cmd --direct \
             --add-rule ipv4 filter DOCKER-USER 0 \
             -j LOG \
             --log-prefix ' DOCKER: '
# 6. Block all other IPs. 
This rule has lowest precedence, so you can add allowed IP rules later.

firewall-cmd --permanent \
             --direct \
             --add-rule ipv4 filter DOCKER-USER 10 \
             -j REJECT \
             -m comment \
             --comment 'reject all other traffic to DOCKER-USER'
# 7. Reload firewalld, Start Docker again
firewall-cmd --reload
systemctl start docker

To končí pravidly definovanými v /etc/firewalld/direct.xml:

<?xml version="1.0" encoding="utf-8"?>
<direct>
  <chain ipv="ipv4" table="filter" chain="DOCKER-USER"/>
  <rule ipv="ipv4" table="filter" chain="DOCKER-USER" priority="0">-m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -m comment --comment 'Allow docker containers to connect to the outside world'</rule>
  <rule ipv="ipv4" table="filter" chain="DOCKER-USER" priority="0">-j RETURN -s 172.17.0.0/16 -m comment --comment 'allow internal docker communication'</rule>
  <rule ipv="ipv4" table="filter" chain="DOCKER-USER" priority="0">-p tcp -m multiport --dports 80,443 -s 1.2.3.4/32 -j ACCEPT -m comment --comment 'Allow IP 1.2.3.4 to docker ports 80 and 443'</rule>
  <rule ipv="ipv4" table="filter" chain="DOCKER-USER" priority="0">-j LOG --log-prefix ' DOCKER TCP: '</rule>
  <rule ipv="ipv4" table="filter" chain="DOCKER-USER" priority="10">-j REJECT -m comment --comment 'reject all other traffic to DOCKER-USER'</rule>
</direct>

Nevýhodou stále je, že musíte nainstalovat containerd.io z CentOS7, jak uvádí Saustrup


Linux
  1. Upgradujte na CentOS 6.2 z CentOS 6.1 / CentOS 6.0

  2. Upgradujte na CentOS 6.4 z CentOS 6.3

  3. Extrahovat soubor z obrázku Dockeru?

  1. Upgradovat Ubuntu v rámci Dockeru z 14.04 na 16.04 pomocí Do-release-upgrade?

  2. Jak se odpojit od dockerového kontejneru bez zastavení

  3. Jak vytvořit vlastní obrázek z kontejneru Docker

  1. Zkontrolujte připojení k síti na serveru Linux

  2. Spuštěný docker na Ubuntu:připojený svazek hostitele nelze zapisovat z kontejneru

  3. Instalace docker-ce v Ubuntu 18.04 přeruší internetové připojení hostitele