GNU/Linux >> Linux Esercitazione >  >> Linux

Nessuna connettività di rete da/verso il contenitore Docker CE su CentOS 8

Soluzione 1:

Dopo aver trascorso un paio di giorni a esaminare i registri e le configurazioni dei componenti coinvolti, stavo per gettare la spugna e tornare a Fedora 30, dove sembra funzionare immediatamente.

Concentrandomi sul firewall, mi sono reso conto che disabilitando firewalld sembrava funzionare, ma preferirei non farlo. Durante l'ispezione delle regole di rete con iptables , mi sono reso conto che il passaggio a nftables significa che iptables è ora un livello di astrazione che mostra solo una piccola parte del nftables regole. Ciò significa la maggior parte, se non tutti, dei firewalld la configurazione verrà applicata al di fuori dell'ambito di iptables .

Ero abituato a trovare tutta la verità in iptables , quindi ci vorrà un po' di tempo per abituarsi.

Per farla breve:perché funzioni, ho dovuto abilitare il mascheramento. Sembrava dockerd lo ha già fatto tramite iptables , ma a quanto pare questo deve essere specificamente abilitato per la zona firewall per iptables mascherarsi per lavorare:

# 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

Riavvia o riavvia dockerd , e sia l'ingresso che l'uscita dovrebbero funzionare.

Soluzione 2:

Ciò che manca nelle risposte precedenti è il fatto che devi prima aggiungere la tua interfaccia docker alla zona che configuri, ad es. public (o aggiungerlo alla zona "affidabile" che è stata suggerita qui ma dubito che sia saggio, dal punto di vista della sicurezza). Perché per impostazione predefinita non è assegnato a una zona. Ricorda inoltre di ricaricare il demone docker quando hai finito.

# 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

Soluzione 3:

Per poter impostare regole dettagliate per Docker, non avevo bisogno di impostare docker0 su nessuna zona.

# 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

Questo termina con le regole definite in /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>

Lo svantaggio è ancora che devi installare containerd.io da CentOS7 come dichiarato da Saustrup


Linux
  1. Telnet su una porta per testare la connettività di rete

  2. Estrarre il file dall'immagine Docker?

  3. Aggiorna Ubuntu all'interno di Docker dal 14.04 al 16.04 utilizzando l'aggiornamento del rilascio?

  4. Un'introduzione a Docker

  5. Verifica la connettività di rete su un server Linux

Come installare Rancher Docker Container Manager su CentOS 7

Come creare un'immagine Docker da un contenitore in esecuzione

Come ottenere l'indirizzo IP del contenitore Docker

Come SSH in un Docker Container

Come creare un'immagine Docker da un contenitore e un file Docker

Come accedere allo spazio dei nomi di rete di Docker Container dall'host