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 firewalld
vi /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 firewalld
systemctl enable firewalld
systemctl 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 (voir si la règle ci-dessous fonctionne dans le temps) firewall-cmd --zone=docker --permanent --add-rich-rule='rule family=ipv4 source address=172.18.5.0/24 accept' # 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 docker
vi /etc/firewalld/firewalld.conf
et remettre : FirewallBackend=iptables
rm -fR /etc/firewalld/zones/
systemctl start firewalld ; systemctl start docker
telnet
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 docker
ip 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 firewalld
systemctl restart docker
ERROR: 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 up
mars 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
.