Mes Projets

NFtoggle

Chaque port ouvert est une surface d’attaque. Les scanners cartographient un réseau en quelques minutes dès qu’une nouvelle IP apparaît en ligne. La plupart des pare-feux acceptent ou rejettent — nftoggle ne fait ni l’un ni l’autre : les ports restent complètement invisibles jusqu’à ce qu’une connexion soit autorisée, puis s’ouvrent pour cette IP uniquement. Pas de bannière, pas de RST, pas de handshake pour les sources non autorisées. Le port n’existe tout simplement pas.

Fonctionnement

nftoggle est un démon Linux écrit en Rust. Il s’accroche au noyau via nftables NFQUEUE, interceptant le tout premier paquet avant que la pile TCP ne le traite :

  1. Un client tente de se connecter à un port surveillé.
  2. Une règle nftables redirige le paquet initial vers une NFQUEUE.
  3. nftoggle l’intercepte, extrait l’IP source et évalue les règles configurées.
  4. Si autorisé : il envoie optionnellement une trame Wake-on-LAN pour démarrer une machine endormie, attend qu’elle soit prête, puis émet un verdict ACCEPT — la connexion continue de façon transparente.
  5. Si refusé : le paquet est silencieusement DROPpé. Le client ne voit rien.

Après le premier paquet autorisé, l’IP source est ajoutée à un ensemble nftables temporaire avec un délai d’expiration, de sorte que les paquets suivants de la session sont traités au débit ligne du noyau sans repasser par l’espace utilisateur.

Fonctionnalités

Cas d’usage

Parents : ports de jeu avec horaires. Bloquer tout l’accès internet d’une console casse les mises à jour firmware et les sauvegardes cloud. nftoggle cible uniquement les ports de session de jeu (PlayStation Network, Nintendo Online) sur un planning — la console reste en ligne pour tout le reste, mais ne peut pas démarrer une nouvelle session après 21h.

Homelab : serveur de jeu ou multimédia à la demande. Votre serveur Minecraft ou instance Plex tourne sur un NAS qui dort pour économiser de l’énergie. Dès qu’un ami tente de se connecter, nftoggle intercepte le paquet, envoie un Magic Packet pour réveiller la machine, et transfère la connexion une fois qu’elle est prête. Aucune intervention manuelle, aucune consommation électrique inutile.

Admin système : SSH invisible. SSH en production et les APIs d’administration sont exposés en permanence aux attaques par force brute et aux scanners de vulnérabilités. Avec nftoggle, le port est en mode furtif complet. Les IPs autorisées (ex. une plage VPN d’entreprise) passent ; tout le reste reçoit le silence — pas de bannière à identifier, pas de surface à sonder.

Confinement IoT. Les caméras IP et objets connectés sondent fréquemment les autres machines du réseau. Un appareil compromis ne peut même pas tenter un handshake contre vos interfaces d’administration (Home Assistant, Zigbee2MQTT) — le paquet est abandonné avant que l’état TCP ne soit créé.

Composants

nftoggle est le démon principal. Il gère l’écouteur NFQUEUE, évalue les règles, déclenche le WoL, exécute les hooks et expose un socket Unix sur /run/nftoggle/daemon.sock pour les clients.

nftoggle-tui (prévu) — client en interface terminal qui se connecte au socket du démon et affiche les sessions actives, les statistiques et les tentatives bloquées en temps réel.

nftoggle-webui (prévu) — serveur web local exposant les mêmes données en direct dans un navigateur.

Comparaison

nftables simplePort knocking (knockd)fail2bannftoggle
Ports invisibles aux scannersNon (RST/timeout)PartielNonOui
Règles basées sur le tempsScript manuelNonNonOui
Wake-on-LAN au premier paquetNonNonNonOui
Contrôle parentalNonNonNonOui
Hooks d’événements / webhooksNonNonPartielOui
GéofiltrageNonNonVia pluginOui
Modification côté client requiseNonOui (séquence de frappe)NonNon
Embarqué / OpenWrtNatifDifficileNonOui

Origine

Tout est parti d’une blague : quelqu’un a mentionné « nftables toggle » en passant, et le nom nftoggle est resté. À partir de là, chercher des idées qui pourraient vraiment coller au nom a mené à ça — un outil qui bascule réellement les ports à la demande au niveau du noyau.

Code source : codeberg.org/slundi/nftoggle