Firewalld & NetworkManager (nmcli)
NetworkManager : La Couche Moderne
Sur RHEL 8+, NetworkManager remplace les scripts réseau legacy (/etc/sysconfig/network-scripts/). La commande nmcli est le couteau suisse du réseau.
Gestion des Connexions
# Lister toutes les connexions
nmcli connection show
# NAME UUID TYPE DEVICE
# ens3 abcd-1234-efgh-5678 ethernet ens3
# Afficher les détails d'une connexion
nmcli connection show ens3
# Lister les devices réseau
nmcli device status
# DEVICE TYPE STATE CONNECTION
# ens3 ethernet connected ens3
# lo loopback unmanaged --
Créer une Connexion Statique
# Créer une connexion avec IP statique
nmcli connection add \
con-name static-eth0 \
ifname eth0 \
type ethernet \
ipv4.addresses 192.168.1.100/24 \
ipv4.gateway 192.168.1.1 \
ipv4.dns "8.8.8.8 1.1.1.1" \
ipv4.method manual
# Activer la connexion
nmcli connection up static-eth0
# Désactiver/Réactiver pour test
nmcli connection down static-eth0
nmcli connection up static-eth0
Modifier une Connexion Existante
# Changer l'IP d'une connexion
nmcli connection modify ens3 ipv4.addresses 192.168.1.50/24
# Ajouter un DNS secondaire
nmcli connection modify ens3 +ipv4.dns 1.0.0.1
# Supprimer un DNS
nmcli connection modify ens3 -ipv4.dns 1.0.0.1
# Passer de DHCP à statique
nmcli connection modify ens3 \
ipv4.method manual \
ipv4.addresses 192.168.1.100/24 \
ipv4.gateway 192.168.1.1
# Appliquer les changements
nmcli connection up ens3
Bonding Basique (High Availability)
# Créer un bond (mode active-backup)
nmcli connection add type bond \
con-name bond0 \
ifname bond0 \
mode active-backup
# Ajouter les interfaces esclaves
nmcli connection add type ethernet \
slave-type bond \
con-name bond0-slave1 \
ifname eth0 \
master bond0
nmcli connection add type ethernet \
slave-type bond \
con-name bond0-slave2 \
ifname eth1 \
master bond0
# Configurer l'IP sur le bond
nmcli connection modify bond0 \
ipv4.addresses 192.168.1.100/24 \
ipv4.gateway 192.168.1.1 \
ipv4.method manual
# Activer le bond
nmcli connection up bond0
# Vérifier l'état
cat /proc/net/bonding/bond0
Tableau Comparatif : ip vs nmcli
| Tâche | Commande ip (temporaire) |
Commande nmcli (persistant) |
|---|---|---|
| Afficher IP | ip addr show eth0 |
nmcli device show eth0 |
| Ajouter IP | ip addr add 192.168.1.100/24 dev eth0 |
nmcli con mod eth0 +ipv4.addresses 192.168.1.100/24 |
| Supprimer IP | ip addr del 192.168.1.100/24 dev eth0 |
nmcli con mod eth0 -ipv4.addresses 192.168.1.100/24 |
| Activer interface | ip link set eth0 up |
nmcli connection up eth0 |
| Ajouter route | ip route add 10.0.0.0/8 via 192.168.1.1 |
nmcli con mod eth0 +ipv4.routes "10.0.0.0/8 192.168.1.1" |
| Afficher routes | ip route show |
nmcli connection show eth0 \| grep routes |
Persistance avec nmcli
Les modifications nmcli sont persistantes (stockées dans /etc/NetworkManager/system-connections/). Les commandes ip sont temporaires (perdues au reboot).
Firewalld : Le Pare-feu Dynamique
Firewalld utilise le concept de zones pour gérer le trafic réseau. Contrairement à iptables brut, les modifications sont dynamiques (pas de flush/reload).
graph TD
A[Interface eth0] -->|Assignée à| B[Zone: public]
A2[Interface eth1] -->|Assignée à| C[Zone: internal]
B -->|Services autorisés| D[ssh: 22/tcp<br/>http: 80/tcp]
B -->|Ports custom| E[8080/tcp]
B -->|Rich Rules| F[Bloquer 10.0.0.0/8]
C -->|Services autorisés| G[ssh: 22/tcp<br/>samba: 445/tcp<br/>dhcp: 67/udp]
style A fill:#2196F3,stroke:#005a9e,color:#fff
style A2 fill:#2196F3,stroke:#005a9e,color:#fff
style B fill:#4CAF50,stroke:#0b5a0d,color:#fff
style C fill:#4CAF50,stroke:#0b5a0d,color:#fff
style F fill:#f44336,stroke:#b00016,color:#fff
Commandes de Base
# Vérifier l'état
systemctl status firewalld
firewall-cmd --state # running
# Lister les zones disponibles
firewall-cmd --get-zones
# block dmz drop external home internal public trusted work
# Voir la zone par défaut
firewall-cmd --get-default-zone # public
# Lister les règles de la zone active
firewall-cmd --list-all
# Lister toutes les zones avec leurs configs
firewall-cmd --list-all-zones
Gestion des Zones
Assigner une Interface à une Zone
# Voir quelle zone est assignée à eth0
firewall-cmd --get-zone-of-interface=eth0
# Changer d'interface de zone (runtime)
firewall-cmd --zone=internal --change-interface=eth0
# Permanent
firewall-cmd --permanent --zone=internal --change-interface=eth0
firewall-cmd --reload
Créer une Zone Custom
# Créer une zone "dmz-web"
firewall-cmd --permanent --new-zone=dmz-web
# Configurer la zone
firewall-cmd --permanent --zone=dmz-web --set-description="DMZ pour serveurs web"
firewall-cmd --permanent --zone=dmz-web --set-target=DROP # DROP par défaut
# Autoriser uniquement HTTP/HTTPS
firewall-cmd --permanent --zone=dmz-web --add-service=http
firewall-cmd --permanent --zone=dmz-web --add-service=https
# Appliquer
firewall-cmd --reload
# Assigner une interface
firewall-cmd --permanent --zone=dmz-web --change-interface=eth1
firewall-cmd --reload
Autoriser des Services/Ports
# Autoriser un service (runtime)
firewall-cmd --add-service=http
firewall-cmd --add-service=https
# Permanent
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
# Autoriser un port custom
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
# Autoriser une plage de ports
firewall-cmd --permanent --add-port=30000-32000/tcp
firewall-cmd --reload
# Lister les services disponibles
firewall-cmd --get-services | tr ' ' '\n' | sort
Rich Rules : Contrôle Granulaire
Les rich rules permettent des règles avancées (source IP, logging, rate limiting).
Bloquer un Sous-Réseau Spécifique
# Bloquer tout le trafic depuis 10.0.0.0/8
firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
source address="10.0.0.0/8"
reject
'
firewall-cmd --reload
Autoriser SSH Uniquement depuis un Réseau de Gestion
# Supprimer le service SSH global
firewall-cmd --permanent --remove-service=ssh
# Autoriser SSH uniquement depuis 192.168.100.0/24
firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
source address="192.168.100.0/24"
service name="ssh"
accept
'
firewall-cmd --reload
Rate Limiting (Protection Brute-Force)
# Limiter SSH à 3 connexions par minute par IP
firewall-cmd --permanent --add-rich-rule='
rule service name="ssh"
accept
limit value="3/m"
'
firewall-cmd --reload
Logger les Tentatives Bloquées
# Logger les paquets DROP avec préfixe
firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
source address="0.0.0.0/0"
port port="3389" protocol="tcp"
log prefix="RDP-BLOCK: " level="warning"
drop
'
firewall-cmd --reload
# Voir les logs
journalctl -f | grep RDP-BLOCK
Exemples SecNumCloud
Scénario 1 : Serveur Web Public
# Zone : public (par défaut)
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# SSH restreint au réseau d'admin
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
source address="192.168.100.0/24"
service name="ssh"
accept
'
# Bloquer les scans de ports (log)
firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
port port="1-1024" protocol="tcp"
log prefix="PORT-SCAN: " level="warning"
limit value="10/m"
'
firewall-cmd --reload
Scénario 2 : Base de Données Interne
# Créer zone dédiée
firewall-cmd --permanent --new-zone=db-backend
firewall-cmd --permanent --zone=db-backend --set-target=DROP
# Autoriser PostgreSQL uniquement depuis app servers
firewall-cmd --permanent --zone=db-backend --add-rich-rule='
rule family="ipv4"
source address="10.1.1.0/24"
port port="5432" protocol="tcp"
accept
'
# SSH admin
firewall-cmd --permanent --zone=db-backend --add-rich-rule='
rule family="ipv4"
source address="192.168.100.0/24"
service name="ssh"
accept
'
firewall-cmd --reload
firewall-cmd --permanent --zone=db-backend --change-interface=eth1
firewall-cmd --reload
Panic Mode : Couper Tout le Trafic
# Activer le mode panique (DROP tout)
firewall-cmd --panic-on
# Vérifier l'état
firewall-cmd --query-panic # yes
# Désactiver
firewall-cmd --panic-off
Panic Mode Tue SSH
En mode panique, toutes les connexions SSH actives sont coupées, y compris la vôtre. À utiliser uniquement en console locale ou avec un accès IPMI/iLO.
Port Forwarding (NAT)
# Activer le masquerading (NAT)
firewall-cmd --permanent --add-masquerade
# Forwarder le port 80 vers un serveur interne
firewall-cmd --permanent --add-forward-port=\
port=80:proto=tcp:toport=8080:toaddr=192.168.1.100
firewall-cmd --reload
Direct Rules (iptables Brut)
# Pour des cas ultra-spécifiques, passer par iptables directement
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 \
-p tcp --dport 9999 -s 10.0.0.0/8 -j ACCEPT
firewall-cmd --reload
# Lister les direct rules
firewall-cmd --direct --get-all-rules
Dépannage Réseau
Vérifier la Connectivité
# Ping
ping -c 4 8.8.8.8
# Traceroute
traceroute 8.8.8.8
# DNS lookup
nslookup google.com
dig google.com
# Vérifier les ports ouverts localement
ss -tulnp
# -t : TCP, -u : UDP, -l : listening, -n : numeric, -p : process
# Scanner un port distant
nc -zv 192.168.1.100 22
# z : scan, v : verbose
Logs Firewalld
# Logs en temps réel
journalctl -fu firewalld
# Logs avec rich rules logging
journalctl -k | grep "RDP-BLOCK"
# Logs iptables (si activé)
tail -f /var/log/messages | grep "DPT"
Réinitialisation Complète
# Sauvegarder la config
cp -r /etc/firewalld /etc/firewalld.backup
# Réinitialiser toutes les zones
firewall-cmd --complete-reload
# Ou supprimer toutes les custom zones
firewall-cmd --permanent --delete-zone=dmz-web
firewall-cmd --reload
Checklist Production
# 1. NetworkManager actif
systemctl is-active NetworkManager # active
# 2. Connexions configurées et up
nmcli connection show --active
# 3. Firewalld actif
systemctl is-active firewalld # active
# 4. Zone par défaut configurée
firewall-cmd --get-default-zone # public ou custom
# 5. Services minimum ouverts
firewall-cmd --list-services
# Idéalement : ssh (restreint par rich rule)
# 6. Pas de masquerade si pas nécessaire
firewall-cmd --query-masquerade # no (sauf si routeur)
# 7. Logs firewall actifs
journalctl -u firewalld --since "1 hour ago"