web-dev-qa-db-fra.com

Comment configurer Centos 7 firewallD pour permettre aux conteneurs Docker d'accéder gratuitement aux ports réseau de l'hôte?

J'ai docker installé sur CentOS 7 et j'utilise firewallD.

De l'intérieur de mon conteneur, aller à l'hôte (par défaut 172.17.42.1)

Avec pare-feu activé

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

avec arrêt du pare-feu

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

J'ai lu les documents sur firewalld et je ne les comprends pas complètement. Existe-t-il un moyen d'autoriser tout simplement dans un conteneur Docker (je suppose sur l'adaptateur Docker0) un accès illimité à l'hôte?

36
adapt-dev

Peut-être mieux que la réponse précédente;

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

Ces commandes ont fait l'affaire:

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

L'une des raisons pour lesquelles la solution acceptée fonctionne pour certaines personnes mais pas pour d'autres réside dans un problème de conception de firewalld. Firewalld traite uniquement la première zone correspondante pour toutes les connexions. Il traite également les zones basées sur l'adresse IP avant les zones basées sur les interfaces. Tant que l'une de vos zones inclut les adresses IP que Docker utilise, la règle ACCEPT dans la zone de confiance ne sera jamais traitée.

Pour vérifier cela, vous pouvez consulter les règles iptables générées sauf si vous utilisez le backend nbt:

iptables -vnL | less

La solution consiste à utiliser une règle directe firewalld au lieu de la zone de confiance. Les règles directes sont toujours traitées en premier. Par exemple, pour le port 3306 (c'est-à-dire, mysqld sur l'hôte local), vous auriez besoin de cette règle:

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

Si vous répétez la même commande sans le commutateur --permanent, firewalld effectuera la modification à la volée pour vous, et vous ne devriez pas avoir besoin de redémarrer docker.

Une deuxième raison est que, selon la version de docker et la mise en réseau que vous avez configurée, le trafic peut ne pas réellement transiter par l'interface docker0, mais via une interface de pont distincte. Vous pouvez voir cette interface avec la commande

ip address show

Vous devrez répéter l'instruction de règle directe ci-dessus avec cette interface de pont.

Vous pouvez également spécifier votre propre réseau dans Docker. Cet article décrit le processus: https://serverfault.com/questions/885470/how-to-configure-firewall-on-user-defined-docker-bridge

La version courte est que vous spécifiez la section réseaux dans un fichier docker, comme ceci:

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

Vous pouvez également le faire sur la ligne de commande.

2
Kevin Keane

le docker suivant a autorisé l'accès à Internet sur CentOS 7 avec firewalld

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