Contexte et besoins
Dans le cadre de mon alternance, j’interviens sur la passerelle Ubiquiti UniFi qui assure le routage, le NAT et le firewall du réseau interne. La demande est claire : empêcher un poste précis du segment interne de sortir vers Internet tout en lui laissant son accès au LAN, le temps de vérifications sur la machine. Le poste concerné est Firewall-Client1, adressé en 10.0.0.139 dans la zone Internal.
Côté outillage, l’UniFi Network Application expose un moteur de policies par zones qui rend ce genre d’isolation très lisible — à condition de bien comprendre le sens des règles et l’effet de chaque action (Accept, Drop, Reject). C’est ce que je documente ici : la mise en place de la règle, les contrôles côté passerelle et côté poste, et la procédure de levée du blocage.
Rappel théorique sur le firewall UniFi
UniFi expose un firewall stateful basé sur iptables/nftables sous le capot. Depuis la version récente de l’application UniFi Network, l’interface s’organise autour de zones plutôt que de directions brutes.
Le moteur de zones
Une zone regroupe plusieurs réseaux qui partagent le même niveau de confiance. Au lieu d’écrire une règle pour chaque VLAN, on écrit la règle au niveau de la zone et elle s’applique à tous les réseaux qui en font partie.
Sur ma passerelle, six zones sont définies :
| Zone | Réseaux rattachés |
|---|---|
| Internal | Admins, Infrastructure, Management, Maison, IoT, BTS SIO, DOCKER |
| External | Free (WAN1), Internet 2 |
| Gateway | (la passerelle elle-même) |
| VPN | Profil-Lucas |
| Hotspot | Guests |
| DMZ | DMZ |
Le moteur affiche aussi une matrice source → destination très lisible : chaque case croise une zone source et une zone destination, et indique combien de policies y sont attachées et leur effet global (Allow All, Allow Return, Block All).

Action : Accept, Drop, Reject
Trois actions possibles sur une règle :
- Accept : le paquet passe.
- Drop : le paquet est jeté silencieusement. L’expéditeur ne reçoit rien et finit par tomber en timeout.
- Reject : le paquet est refusé avec un ICMP unreachable (ou TCP RST). L’expéditeur sait immédiatement que la destination est inaccessible.
Pour un poste interne dont je veux rendre le blocage immédiatement visible côté utilisateur, je préfère Reject : la machine remonte tout de suite l’erreur au lieu de boucler en retransmissions. Pour bloquer du scan venu d’Internet, c’est l’inverse : on Drop pour ne pas révéler que l’IP existe.
Note
La RFC 7288 recommande Drop pour le trafic non sollicité depuis Internet, et Reject quand l’émetteur est légitime (réseau interne) afin qu’il puisse réagir au lieu de retransmettre.
Ordre des règles
Les règles d’une même zone sont évaluées du haut vers le bas, première correspondance gagne. Une règle de blocage spécifique doit donc être placée avant la règle générique d’autorisation. C’est la cause numéro un de règles « qui ne fonctionnent pas » : la règle est correcte mais arrive trop tard dans la chaîne.
Topologie
Le segment concerné est en 10.0.0.0/24, derrière la passerelle UniFi qui assume routage, NAT et firewall.
| Équipement | Rôle | Adresse |
|---|---|---|
| Passerelle UniFi | Routage, NAT, firewall, DNS | 10.0.0.1 |
Poste Firewall-Client1 | Cible du blocage | 10.0.0.139 |
| Internet | Zone External (WAN1, Internet 2) | — |
Connexion à l’UniFi Network Application
J’ouvre l’interface depuis mon poste d’admin et je m’authentifie avec un compte local. Le tableau de bord donne un aperçu du trafic, des clients et de l’état des liens WAN.

Je passe ensuite dans Settings → Security → Traffic & Firewall Rules → Create Rule.
Création de la règle de blocage
Je remplis le formulaire en m’appuyant sur les zones définies dans le moteur :
Name : 10.0.0.139 ↔ WAN
Action : Reject
IP Version : Both
Protocol : All
Source Zone : Internal
Source : 10.0.0.139
Source Port : Any
Dest. Zone : External
Destination : Any
Dest. Port : AnyExplications ligne par ligne :
Name: nommage explicite avec l’IP cible et le sens du flux. Un autre admin comprend la règle d’un coup d’œil sans ouvrir le détail.Action: Reject: remontée immédiate côté client (cf. discussion plus haut).IP Version: Both: couvre IPv4 et IPv6. Si le poste est joignable en IPv6 et qu’on n’oublie de filtrer que IPv4, il continue à sortir par la deuxième pile.Protocol: All: on bloque TCP, UDP, ICMP. Si on autorise par erreur ICMP, le poste peut continuer à pinguer Internet et à faire de la découverte.Source Zone: Internal+Source: 10.0.0.139: on limite la règle à un poste précis du segment interne. Les autres machines de la zoneInternalne sont pas concernées.Dest. Zone: External+Destination: Any: la zoneExternalregroupe les WAN (Free WAN1 et Internet 2). Comme la règle est cantonnée au sensInternal → External, le trafic intra-LAN ne passe pas par cette chaîne et reste autorisé.
Une fois enregistrée, la règle apparaît dans la liste avec un identifiant ID 10000 et l’icône d’état activé.

Important
Avant la sauvegarde, je vérifie que la règle est placée au-dessus de la règle par défaut Allow Internal → External. En cas d’inversion, c’est la règle d’autorisation qui matche en premier et le poste sort comme avant.
Vérifications
Tous les tests sont faits depuis le poste Firewall-Client1 (10.0.0.139). Le hostname apparaît dans le prompt, ça permet de bien voir d’où on tape les commandes.
Test 1 — Ping vers Internet (doit échouer)
ping 8.8.8.8PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
From 10.0.0.1 icmp_seq=1 Destination Port Unreachable
From 10.0.0.1 icmp_seq=2 Destination Port Unreachable
From 10.0.0.1 icmp_seq=3 Destination Port Unreachable
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2042msLa passerelle (10.0.0.1) renvoie immédiatement Destination Port Unreachable : c’est exactement le comportement d’un Reject. Si la règle avait été en Drop, on n’aurait rien reçu et la commande aurait fini en timeout.

Test 2 — Requête HTTPS (doit échouer)
curl www.google.comcurl: (6) Could not resolve host: www.google.comLe DNS ne répond plus : la résolution sort en UDP/53 vers Internet, qui est bloqué par la même règle. C’est le signe que Protocol: All couvre bien UDP en plus de TCP.

Test 3 — Ping vers la passerelle locale (doit fonctionner)
ping 10.0.0.1PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.517 ms
--- 10.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.517/0.517/0.517/0.000/0.000 msLa communication intra-LAN est intacte. La règle ne ferme que le sens Internal → External, donc le ping vers la passerelle (zone Gateway) et le trafic vers d’autres postes du segment passent toujours.

Tests
Trois scénarios pour valider que la règle fait exactement ce qu’on attend, ni plus ni moins.
- Le poste ne sort pas vers Internet :
ping 8.8.8.8retourneDestination Port Unreachableimmédiatement etcurl www.google.coméchoue dès la résolution DNS. - Le LAN reste joignable :
ping 10.0.0.1répond en moins d’une milliseconde. La règle ne touche pas au trafic interne. - La levée du blocage rétablit l’accès : je désactive temporairement la règle (toggle Status sur
Disabled). Depuis le poste,ping 8.8.8.8repasse. Je ré-active la règle, le blocage revient. C’est le test de réversibilité.

Problèmes rencontrés et solutions
| Symptôme | Cause | Correction |
|---|---|---|
| La règle ne bloque rien, le poste sort encore | Règle placée après Allow Internal → External | Remonter la règle en haut de la chaîne Internal → External |
| Le poste ne joint plus la passerelle non plus | Mauvaise zone destination (Gateway au lieu de External) | Repasser la règle en Source: Internal → Destination: External |
| Le poste sort encore via DNS | Protocol limité à TCP dans un essai précédent | Mettre Protocol: All pour couvrir TCP, UDP et ICMP |
| Internet reste joignable en IPv6 | IP Version: IPv4 au lieu de Both | Modifier la règle, sélectionner Both |
Compétences du bloc 1 mobilisées
| Compétence officielle | Mobilisation concrète |
|---|---|
| Gérer le patrimoine informatique de l’organisation | Documentation de la règle (nom, ID, zones, sens, date) pour qu’elle reste lisible et traçable dans la console UniFi. |
| Mettre en place et vérifier les niveaux d’habilitation associés à un service | La règle restreint l’usage du WAN à un poste précis sans impact sur les autres clients du LAN. |
| Réaliser les tests d’intégration et d’acceptation d’un service | Trois scénarios rejoués (sortie bloquée, LAN ouvert, levée réversible) avec preuves console. |
| Traiter des demandes concernant les services réseau et système | Application directe de la consigne du formateur, configuration testée et documentée. |
Bilan
L’objectif est atteint : Firewall-Client1 ne sort plus sur Internet, son accès au LAN est intact, et la règle se lève en un clic. Au passage, cette intervention m’a permis de bien intégrer trois choses :
- Les zones simplifient énormément la lecture d’un firewall UniFi. Au lieu de raisonner VLAN par VLAN, on regarde d’abord la matrice des zones, puis on descend au détail.
RejectvsDropest un vrai choix :Rejectcôté LAN parce qu’on veut une remontée rapide,Dropcôté WAN pour ne pas répondre aux scans. La RFC 7288 le formalise bien.- L’ordre des règles fait tout : une règle en bas de chaîne ne sert à rien si une règle d’autorisation matche avant elle.
Pour aller plus loin, l’idée serait d’utiliser un Address Group plutôt qu’une IP en dur : si un deuxième poste doit être bloqué, on l’ajoute au groupe sans toucher à la règle. C’est la pratique recommandée par la doc UniFi pour garder un firewall lisible sur la durée.
Sources
- Ubiquiti Help — UniFi Gateway Firewall , Ubiquiti.
- Ubiquiti Help — Traffic Policy Management in UniFi , Ubiquiti.
- RFC 7288 — Reflections on Host Firewalls , IETF, 2014.
- ANSSI — Recommandations relatives à l’administration sécurisée des systèmes d’information , ANSSI.
- Netfilter Documentation — iptables-extensions(8) , Netfilter project.