netstat -anpt | grep LISTEN ou ss -lntu : pour voir les ports TCP ouverts sur la machine ss -lnue : pour voir les ports UDP ouverts sur la machine.ip link show : pour trouver les noms des interfaces réseaux de la machine (ex. : eth0, eth1, …).apt install firewalldvi /etc/firewalld/firewalld.conf'iptables sur le système et donc de l'utiliser avec Firewalld. Voir les explications détaillées.# Pour corriger le bug : https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=914694 IndividualCalls=yes # Forcer l'utilisation de Nftables quand il sera supporté par Docker avec la valeur suivante : # FirewallBackend=nftables # En attendant le support de Nftables par Docker nous utilisons iptables : FirewallBackend=iptables
iptables avec la commande : update-alternatives --config iptables : choisir le mode iptables-nft.systemctl start firewalldsystemctl enable firewalldsystemctl status firewalld firewall-cmd --version firewall-cmd --state firewall-cmd --get-active-zones firewall-cmd --zone=<ma-zone> --list-all firewall-cmd --list-all firewall-cmd --get-default-zone firewall-cmd --get-active-zones firewall-cmd --zone=<zone-name> --change-interface=<interface-name> firewall-cmd --get-zone-of-interface=<interface-name> firewall-cmd --get-services firewall-cmd --permanent --zone="<zone-name>" --add-service="<service-name>" --add-<port|service> ou --remove-<port|service> --permanent sont sauver, les autres sont annulées) : firewall-cmd --reload Activer les services suivant pour la zone public :
ip a firewall-cmd --set-default-zone=public firewall-cmd --zone=public --permanent --change-interface=ens3 #+-------------------------------------------------------------------+ # Spécifique web-srv firewall-cmd --zone=public --permanent --add-port=<port-ssh-web>/tcp firewall-cmd --zone=public --permanent --add-service={http,https} firewall-cmd --zone=public --permanent --remove-service={dhcpv6-client,ssh} # 2020-08-27 - Activer "masquerade" si vous obtenez un "502 Bad Gateway" par le Nginx des Dockers firewall-cmd --zone=public --permanent --add-masquerade #+-------------------------------------------------------------------+ # Spécifique db-srv firewall-cmd --zone=public --permanent --add-port=<port-ssh-db>/tcp firewall-cmd --zone=public --permanent --remove-service={dhcpv6-client,http,https,ssh} #+-------------------------------------------------------------------+ # Spécifique bkp-srv firewall-cmd --zone=public --permanent --add-port=<port-ssh-bkp>/tcp firewall-cmd --zone=public --permanent --add-service={http,https} firewall-cmd --zone=public --permanent --remove-service={dhcpv6-client,ssh} # 2020-08-27 - Activer "masquerade" si vous obtenez un "502 Bad Gateway" par le Nginx des Dockers firewall-cmd --zone=public --permanent --add-masquerade #+-------------------------------------------------------------------+ firewall-cmd --reload # Afficher le résultat : firewall-cmd --info-zone=public
Activer les services suivant pour la zone internal (VPN entre les 2 serveurs) :
ip a firewall-cmd --zone=internal --permanent --change-interface=ens7 firewall-cmd --zone=internal --permanent --remove-service={dhcpv6-client,mdns,ssh,samba-client} #+-------------------------------------------------------------------+ # Spécifique web-srv firewall-cmd --zone=internal --permanent --add-port=<port-ssh-web>/tcp # InfluxDb (si encore présent sur web-srv, normalement devrait être basculer sur bkp-srv) # firewall-cmd --zone=internal --permanent --add-port=8086/tcp # firewall-cmd --zone=internal --permanent --add-port=8089/udp # Docker API firewall-cmd --zone=internal --permanent --add-port=2376/tcp #+-------------------------------------------------------------------+ # Spécifique db-srv firewall-cmd --zone=internal --permanent --add-port=<port-ssh-db>/tcp # Postgresql firewall-cmd --zone=internal --permanent --add-service=postgresql # Docker API firewall-cmd --zone=internal --permanent --add-port=2376/tcp #+-------------------------------------------------------------------+ # Spécifique bkp-srv firewall-cmd --zone=internal --permanent --add-port=<port-ssh-bkp>/tcp # InfluxDb firewall-cmd --zone=internal --permanent --add-port=8086/tcp firewall-cmd --zone=internal --permanent --add-port=8089/udp #+-------------------------------------------------------------------+ firewall-cmd --reload firewall-cmd --info-zone=internal
Zone spécifique pour Docker qui sera nommée docker :
ip a # Commencé par créer le réseau Docker si ce n'est pas déjà fait ! # Pour vérifier la présence du réseau utiliser : 'docker network ls' et le détail avec 'docker network inspect nginx-proxy' docker network create --driver=bridge --subnet=172.18.5.0/24 --ip-range=172.18.5.0/24 --gateway=172.18.5.1 nginx-proxy # Zone docker # Depuis la version v20.10.0 Docker créé automatiquement la zone "docker" et y associe ses interfaces (docker0, br-...) # firewall-cmd --permanent --new-zone=docker # firewall-cmd --zone=docker --permanent --change-interface=docker0 firewall-cmd --zone=docker --permanent --add-source=172.18.5.0/24 # Permettre l'accès aux sites web public depuis un container (en entrée et sortie). Ici valable uniquement pour le réseau "nginx-proxy" qui est fixe. Nécessite d'ajouter des entrées pour chaque réseau d'IP => peut être plus simple d'ouvrir les services "http,https" sur toute la zone. firewall-cmd --zone=docker --permanent --add-rich-rule='rule family=ipv4 source address=172.18.5.0/24 accept' # Donner l'accès au web en entré et sortie sur toute la zone Docker (utile si les containers ne sont pas tous dans le réseau "nginx-proxy") # firewall-cmd --zone=docker --permanent --add-service={http,https} # Il est peut être nécessaire d'ajouter la règle suivante sur la zone "docker" en plus/à la place de celle existant sur "public". firewall-cmd --zone=docker --permanent --add-masquerade # Le 10-04-2022, l'accès à l'IP privée 10.0.1.30 (ping 10.0.1.30) fonctionnait sur l'hôte mais plus dans le docker Borgmatic. Pour résoudre le problème, ajout des 2 règles suivantes: firewall-cmd --permanent --zone=docker --add-source=10.0.1.0/24 firewall-cmd --permanent --zone=docker --add-rich-rule='rule family=ipv4 source address=10.0.1.0/24 accept' #+-------------------------------------------------------------------+ # Spécifique web-srv # Accéder au status du Nginx installé sur l'hôte firewall-cmd --zone=docker --permanent --add-port=9090/tcp # Si nécessaire, ajouter d'autres port TCP comme 50081 (cms-adminer), 50080 (cms-nginx), 50084 (wiki-sinp-nginx) avec la commande suivante : #firewall-cmd --zone=docker --permanent --add-port=<YOUR-PORT>/tcp #+-------------------------------------------------------------------+ # Spécifique bkp-srv # Accéder au status du Nginx installé sur l'hôte firewall-cmd --zone=docker --permanent --add-port=9090/tcp #+-------------------------------------------------------------------+ firewall-cmd --reload firewall-cmd --info-zone=docker # ATTENTION : penser à redémarrer le service Docker après : systemctl restart docker
update-alternatives --config iptables : choisir le mode legacysystemctl stop firewalld ; systemctl stop nftables ; systemctl disable nftables ; systemctl stop dockervi /etc/firewalld/firewalld.conf et remettre : FirewallBackend=iptables
rm -fR /etc/firewalld/zones/systemctl start firewalld ; systemctl start dockertelnet avec : telnet <ip> <port>. Si le service est bien accessible, vous pouvez appliquer les solutions suivantes. firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 4 -i docker0 -j ACCEPT firewall-cmd --reload systemctl restart dockerip a. Ainsi, associer l'interface docker0 à une zone ne suffit pas, il semble plus pertinent de créer une zone spécifique et d'y associer en source les IP du réseau Docker que nous créons. A noter que depuis sa version 20.10.0, Docker créé automatiquement dans Firewalld la zone "docker" dans laquelle il associe les interfaces qu'il créé. Procédure : --subnet=172.18.5.0/24 ) et la référence à l'IP de l'hôte dans ce réseau ( --gateway=172.18.5.1 ) : docker network create --driver=bridge --subnet=172.18.5.0/24 --gateway=172.18.5.1 nginx-proxy firewall-cmd --permanent --new-zone=docker firewall-cmd --permanent --zone=docker --change-interface=docker0 firewall-cmd --permanent --zone=docker --add-source=172.18.5.0/24 firewall-cmd --zone=docker --permanent --add-rich-rule='rule family=ipv4 source address=172.18.5.0/24 accept' : fonctionne correctement au 2021-03-26 avec la version 20.10.5 de Docker et Firewalld 0.6.3. firewall-cmd --zone=public --permanent --add-masquerade firewall-cmd --reload systemctl restart firewalldsystemctl restart dockerERROR: for manager-portainer Cannot start service manager-portainer: driver failed programming external connectivity on endpoint 0f0a6417f223_manager-portainer (55e5c1439a5f2d8880f8e65676b492263223a2ea649aac87d72c4a0a98aac21c): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 127.0.0.1 --dport 9000 -j DNAT --to-destination 172.18.5.2:9000 ! -i br-e8fc729a5e58: iptables: No chain/target/match by that name.
docker-compose upmars 26 02:00:00 sinp-paca-web dockerd[8322]: time="2021-03-26T02:00:00.644589374+01:00" level=info msg="ignoring event" container=c6e9cd33b6eb6f60edec8e645541de8d20afb15a7d911197c9bc89ab7a49e780 module=libcontain mars 26 02:00:00 sinp-paca-web dockerd[8322]: time="2021-03-26T02:00:00.880242322+01:00" level=info msg="ignoring event" container=0c0f81af4cc08fa364adee66ee9202e7c28b883056e26db51d7b144a35f26ccc module=libcontain mars 26 02:00:02 sinp-paca-web dockerd[8322]: time="2021-03-26T02:00:02.873481139+01:00" level=info msg="ignoring event" container=3a2ce9ad82ea0c1299ebce75e84707dc562a21eb9b2cb05696a1b4807042e6cb module=libcontain mars 26 02:00:03 sinp-paca-web dockerd[8322]: time="2021-03-26T02:00:03.105072289+01:00" level=info msg="ignoring event" container=e15f443ce2a865ae783689bf103990bdf9804ac533d5772e2c14fbf6f102d354 module=libcontain mars 26 02:00:24 sinp-paca-web dockerd[8322]: time="2021-03-26T02:00:24.468115748+01:00" level=warning msg="Failed to allocate and map port 50081-50081: (iptables failed: iptables --wait -t nat -A DOCKER -p tcp - mars 26 02:00:24 sinp-paca-web dockerd[8322]: time="2021-03-26T02:00:24.544748120+01:00" level=error msg="e15f443ce2a865ae783689bf103990bdf9804ac533d5772e2c14fbf6f102d354 cleanup: failed to delete container from c mars 26 02:00:24 sinp-paca-web dockerd[8322]: time="2021-03-26T02:00:24.544792461+01:00" level=error msg="Handler for POST /v1.24/containers/cms-adminer/start returned error: driver failed programming external con mars 26 02:00:24 sinp-paca-web dockerd[8322]: time="2021-03-26T02:00:24+01:00" level=info msg="Firewalld: docker zone already exists, returning" mars 26 02:00:25 sinp-paca-web dockerd[8322]: time="2021-03-26T02:00:25+01:00" level=info msg="Firewalld: docker zone already exists, returning" mars 26 02:00:25 sinp-paca-web dockerd[8322]: time="2021-03-26T02:00:25.711870702+01:00" level=warning msg="Failed to allocate and map port 50080-50080: (iptables failed: iptables --wait -t nat -A DOCKER -p tcp - mars 26 02:00:25 sinp-paca-web dockerd[8322]: time="2021-03-26T02:00:25.784483347+01:00" level=error msg="c6e9cd33b6eb6f60edec8e645541de8d20afb15a7d911197c9bc89ab7a49e780 cleanup: failed to delete container from c mars 26 02:00:25 sinp-paca-web dockerd[8322]: time="2021-03-26T02:00:25.784525338+01:00" level=error msg="Handler for POST /v1.24/containers/cms-nginx/start returned error: driver failed programming external conne
iptables -t nat -nvL | grep DOCKER ne retourne rien alors qu'elle devrait affiché ceci : 2118 93277 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
psql -h 172.18.5.1 -p 5432 -U postgres --no-password génère l'erreur :psql: error: could not connect to server: Connection refused Is the server running on host "172.18.5.1" and accepting TCP/IP connections on port 5432?
ss -lntu et vérifier qu'il y ait bien une ligne : tcp LISTEN 0 128 172.18.0.1:5432 0.0.0.0:*
Il faut Postgresql (port 5432) écoute sur l'IP de la gateway du bridge de Docker (ici 172.18.0.1). Si cette ligne est absente, redémarrer Postgresql systemctl restart postgresql. Elle devrait apparaitre. Si pour une raison ou une autre le service Docker n'est pas démarré au moment du démarrage de Postgresql (ordre du démarrage des services par la machine lors de son lancement), Postgresql n'écoutera pas sur l'IP 172.18.0.1 car non existante…
# Curl Info: Could not resolve host: acme-v02.api.letsencrypt.org # Ping bad address 'www.google.com'
ping 172.18.5.1).reboot.