Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente |
serveurs:installation:parefeu [2023/05/23 12:46] – [Zone "internal"] jpmilcent | serveurs:installation:parefeu [2024/08/02 13:15] (Version actuelle) – [Problème : "psql: error: could not connect to server: Connection refused"] jpmilcent |
---|
* '' ss -lnue '' : pour voir les ports UDP 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, ...). | * ''ip link show'' : pour trouver les noms des interfaces réseaux de la machine (ex. : eth0, eth1, ...). |
* Pour utiliser Nftables directement, préparer sa configuration comme indiqué ci-dessous mais ce n'est pas nécessaire si vous utilisez ''Firewalld'' : | |
* [[https://wiki.nftables.org/wiki-nftables/index.php/Quick_reference-nftables_in_10_minutes|Documentation des commandes de nft]] | |
* Le fichier de configuration principal : ''/etc/nftables.conf'' | |
* Installer Nftables en version backports (v1.8.3 - le 2020-01-03) si nécessaire (par défaut sous Debian Buster) : ''aptitude install -t buster-backports nftables'' | |
* Activer automatiquement Ntables au démarrage : ''systemctl enable nftables'' | |
* Voir la liste des règles : ''nft list ruleset'' | |
* Créer la table IP FILTER : ''nft add table ip filter'' | |
* Y créer la chaine INPUT : ''nft add chain ip filter INPUT'' | |
* Y créer la chaine OUTPUT : ''nft add chain ip filter OUTPUT'' | |
===== Installer et configurer Firewalld ===== | ===== Installer et configurer Firewalld ===== |
* Ressources : | * Ressources : |
* [[https://www.linuxjournal.com/content/understanding-firewalld-multi-zone-configurations|Understanding Firewalld in Multi-Zone Configurations]] | * [[https://www.linuxjournal.com/content/understanding-firewalld-multi-zone-configurations|Understanding Firewalld in Multi-Zone Configurations]] |
* Installer le paquet : ''apt install firewalld'' | * Installer le paquet : ''apt install firewalld'' |
* Nftables est disponible en v0.9.8 sous Debian 11 (le 2023-05-12) : ''apt install nftables'' | |
* Installer [[https://tracker.debian.org/pkg/nftables|Nftables en version backports]] (v0.9.3 - le 2021-03-26) : ''apt install -t buster-backports nftables'' | |
* Configurer : ''vi /etc/firewalld/firewalld.conf'' | * Configurer : ''vi /etc/firewalld/firewalld.conf'' |
* **ATTENTION** : au 2021-03-26, le support de Nftables n'est pas pris en compte dans Docker. Il est donc conseillé de maintenir l'utilisation d'''iptables'' sur le système et donc de l'utiliser avec Firewalld. Voir [[serveurs:installation:parefeu#problemefirewalld_nftables_et_docker|les explications détaillées]]. | * **ATTENTION** : au 2021-03-26, le support de Nftables n'est pas pris en compte dans Docker. Il est donc conseillé de maintenir l'utilisation d'''iptables'' sur le système et donc de l'utiliser avec Firewalld. Voir [[serveurs:installation:parefeu#problemefirewalld_nftables_et_docker|les explications détaillées]]. |
FirewallBackend=iptables | FirewallBackend=iptables |
</code> | </code> |
* Il est aussi nécessaire de mettre à jour l'alternative ''iptables'' avec la commande : ''<nowiki> update-alternatives --config iptables </nowiki>'' : choisir le mode //legacy//. | * Il est aussi nécessaire de mettre à jour l'alternative ''iptables'' avec la commande : ''<nowiki> update-alternatives --config iptables </nowiki>'' : choisir le mode //iptables-nft//. |
* **ATTENTION** : avant d'activer le pare-feu veiller à avoir autoriser l'accès SSH sur le nouveau port. Pour cela configurer la //zone public// comme indiqué ci-dessous dans la section "Configuration des zones". | * **ATTENTION** : avant d'activer le pare-feu veiller à avoir autoriser l'accès SSH sur le nouveau port. Pour cela configurer la //zone public// comme indiqué ci-dessous dans la section "Configuration des zones". |
* En cas de problème de connexion SSH suite à l'activation du pare-feu, il est possible de se connecter au serveur via la console VNC disponible sur le Manager d'Ovh au niveau des instances ou via l'interface Open Stack Horizon (aussi accessible depuis le Manager d'OVH). | * En cas de problème de connexion SSH suite à l'activation du pare-feu, il est possible de se connecter au serveur via la console VNC disponible sur le Manager d'Ovh au niveau des instances ou via l'interface Open Stack Horizon (aussi accessible depuis le Manager d'OVH). |
* Vérifier l'état du parefeu : ''<nowiki> firewall-cmd --state </nowiki>'' | * Vérifier l'état du parefeu : ''<nowiki> firewall-cmd --state </nowiki>'' |
* Voir toutes les zones actives : ''<nowiki> firewall-cmd --get-active-zones </nowiki>'' | * Voir toutes les zones actives : ''<nowiki> firewall-cmd --get-active-zones </nowiki>'' |
* Voir toutes les règles actives d'une zone particulière : ''<nowiki> firewall-cmd --zone=<ma-zone> </nowiki>'' | * Voir toutes les règles actives d'une zone particulière : ''<nowiki> firewall-cmd --zone=<ma-zone> --list-all </nowiki>'' |
* Lister toutes les règles actives de la zone par défaut : ''<nowiki> firewall-cmd --list-all </nowiki>'' | * Lister toutes les règles actives de la zone par défaut : ''<nowiki> firewall-cmd --list-all </nowiki>'' |
* Afficher la zone par défaut : ''<nowiki> firewall-cmd --get-default-zone </nowiki>'' | * Afficher la zone par défaut : ''<nowiki> firewall-cmd --get-default-zone </nowiki>'' |
* Au préalable, vous pouvez vous assurer que //**ens7**// est bien associé à **l'IPv4 du VPN (10.0.1.xxx)** du serveur à l'aide de la commande : '' ip a '' | * Au préalable, vous pouvez vous assurer que //**ens7**// est bien associé à **l'IPv4 du VPN (10.0.1.xxx)** du serveur à l'aide de la commande : '' ip a '' |
* Commandes //Firewalld// à exécuter pour la //zone internal// : <code bash> | * Commandes //Firewalld// à exécuter pour la //zone internal// : <code bash> |
firewall-cmd --zone=internal --permanent --change-interface=eth1 | firewall-cmd --zone=internal --permanent --change-interface=ens7 |
firewall-cmd --zone=internal --permanent --remove-service={dhcpv6-client,mdns,ssh,samba-client} | firewall-cmd --zone=internal --permanent --remove-service={dhcpv6-client,mdns,ssh,samba-client} |
#+-------------------------------------------------------------------+ | #+-------------------------------------------------------------------+ |
* Commandes //Firewalld// à exécuter pour la //zone docker// : <code bash> | * Commandes //Firewalld// à exécuter pour la //zone docker// : <code bash> |
# Commencé par créer le réseau Docker si ce n'est pas déjà fait ! | # Commencé par créer le réseau Docker si ce n'est pas déjà fait ! |
# Vérifier la présence du réseau avec : 'docker network ls' et le détail avec 'docker network inspect nginx-proxy' | # 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 | 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 | # Zone docker |
* [[https://serverfault.com/a/1022195|ServerFault: No network connectivity to/from Docker CE container on CentOS 8]] : exemples de règles pour Firewalld permettant de faire fonctionner Docker correctement. NON TESTÉ... | * [[https://serverfault.com/a/1022195|ServerFault: No network connectivity to/from Docker CE container on CentOS 8]] : exemples de règles pour Firewalld permettant de faire fonctionner Docker correctement. NON TESTÉ... |
===== Problème : Firewalld et Docker - "connect: no route to host" ===== | ===== Problème : Firewalld et Docker - "connect: no route to host" ===== |
* **Contexte** : Par défaut, //Firewalld// bloque la communication entre les containers sur le serveur hôte hébergeant Docker. DU coup, les containers n'arrive pas à accéder aux serveurs web public extérieur au container. | * **Contexte** : Par défaut, //Firewalld// bloque la communication entre les containers sur le serveur hôte hébergeant Docker. Du coup, les containers n'arrive pas à accéder aux serveurs web public extérieur au container. |
* **Vérification** : ce message d'erreur peut aussi apparaître si le service distant ne fonctionne pas. Assurez vous que le service distant est bien disponible sur le port attendu. Pour cela, utiliser ''telnet'' avec : ''telnet <ip> <port>''. Si le service est bien accessible, vous pouvez appliquer les solutions suivantes. | * **Vérification** : ce message d'erreur peut aussi apparaître si le service distant ne fonctionne pas. Assurez vous que le service distant est bien disponible sur le port attendu. Pour cela, utiliser ''telnet'' avec : ''telnet <ip> <port>''. Si le service est bien accessible, vous pouvez appliquer les solutions suivantes. |
* **Solutions** : pour autoriser la communication entres le containers //Docker//, il est possible d'utiliser une des solutions suivantes : | * **Solutions** : pour autoriser la communication entres le containers //Docker//, il est possible d'utiliser une des solutions suivantes : |
| |
===== Problème : "psql: error: could not connect to server: Connection refused" ===== | ===== Problème : "psql: error: could not connect to server: Connection refused" ===== |
* **Contexte** : Depuis le container Borgmatic de l'instance //db-srv//, il est impossible d'accéder à Postgresql. La commande suivante ''<nowiki> psql -h 172.18.0.1 -p 5432 -U postgres --no-password </nowiki>'' génère l'erreur :<code> | * **Contexte** : Depuis le container Borgmatic de l'instance //db-srv//, il est impossible d'accéder à Postgresql. La commande suivante ''<nowiki> psql -h 172.18.5.1 -p 5432 -U postgres --no-password </nowiki>'' génère l'erreur :<code> |
psql: error: could not connect to server: Connection refused | psql: error: could not connect to server: Connection refused |
Is the server running on host "172.18.5.1" and accepting | Is the server running on host "172.18.5.1" and accepting |
TCP/IP connections on port 5432? | TCP/IP connections on port 5432? |
</code> | </code> |
* **Solution** : sur l'hôte, afficher les IPs sur lesquelles Postgresql écoute avec la commande ''ss -lntu'' et vérifier qu'il y ait bien une ligne : <code> | * **Solution #1 :** sur l'hôte, afficher les IPs sur lesquelles Postgresql écoute avec la commande ''ss -lntu'' et vérifier qu'il y ait bien une ligne : <code> |
tcp LISTEN 0 128 172.18.0.1:5432 0.0.0.0:* | tcp LISTEN 0 128 172.18.0.1:5432 0.0.0.0:* |
</code> 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... | </code> 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... |
| * **Solution #2 :** vérifier également via (Portainer) que le réseau nginx-proxy a bine un gateway définie à 172.18.5.1. Il faut également que les containers Dockers dans le réseau 172.18.x.x n'occupent pas les IP 172.18.5.1 et 172.18.5.0. Si le réseau est mal configuré, il faut le supprimer et le recréer correctement (voir section //Zone "docker"//). |
| ===== Problème : aucun accès à internet depuis le container ===== |
| * ** Erreur** : <code> |
| # Curl |
| Info: Could not resolve host: acme-v02.api.letsencrypt.org |
| # Ping |
| bad address 'www.google.com' |
| </code> |
| * **Contexte** : aucun accès à internet que cela soit via une IP (8.8.8.8) ou un nom de domaine (www.google.com) mais l'hôte via la passerelle (172.18.5.1) du reste joignable (''ping 172.18.5.1''). |
| * **Solution** : après avoir essayé les différentes techniques exposées sur [[https://stackoverflow.com/a/68474595/13311850|cette page StackOveflow]], c'est le redémarrage de la machine qui a tout remis dans l'ordre : ''reboot''. |