Ensemble nftables alimenté par DNS vers WireGuard : comment fonctionne le transfert
Une réponse DNS peut alimenter un ensemble nftables, mais un ensemble ne route rien. Suivez les quatre transferts et les trois durées de vie qui décident si l'aiguillage fonctionne.
Les noms se résolvent en adresses, et ces adresses peuvent aboutir dans un ensemble du pare-feu qui influence ensuite le routage, ce qui rend possible l'aiguillage fondé sur le nom sans proxy. Le piège est que quatre composants doivent se transférer correctement : le résolveur, l'ensemble, le classifieur qui marque un nouveau flux et le pair qui le transporte. Chaque transfert échoue différemment et chacun garde son propre temps.
Traitez la conception comme une chaîne et non comme une configuration. À chaque étape, la question est quel composant possède la décision et ce qui se passe quand son entrée manque.
Ce que la réponse DNS peut faire et ne peut pas faire
dnsmasq peut copier des adresses issues des réponses dans un ensemble nftables, ce qui est une alimentation et non une décision de routage. Cette option, documentée dans le manuel de dnsmasq, nomme la famille, la table et l'ensemble, et son 4# initial ne sélectionne que les enregistrements A, donc les destinations v6 ont besoin de leur propre dispositif. L'ensemble doit déjà exister, car le résolveur ajoute des éléments à quelque chose que le propriétaire du pare-feu a créé. Rien dans cette étape ne choisit une interface, une table ou un pair.
Le client doit aussi utiliser ce résolveur pour le nom. Une application dotée de son propre DNS chiffré, ou une réponse en cache d'avant l'existence de la politique, se connecte sans créer la moindre entrée dans l'ensemble.
L'ensemble est une entrée, pas une route
Un élément d'un ensemble est une condition de correspondance. Quelque chose doit l'examiner, décider que ce paquet démarre un nouveau flux et appliquer la politique qui envoie le flux dans le tunnel. Sous Linux, cela signifie normalement un chemin de sortie capable de routage qui peut poser une marque, une règle envoyant les paquets marqués vers une table dédiée et une route dans cette table pointant vers l'appareil WireGuard. L'appartenance seule n'installe rien de tout cela.
nft add set inet vpn_select office_v4 { type ipv4_addr\; }
ip rule add fwmark 0x40 table 200
ip route add default dev wg0 table 200
wg show wg0 allowed-ips
Le pair applique un second contrôle de couverture que l'on oublie. WireGuard ne chiffre un paquet que pour un pair dont les adresses autorisées incluent la destination, donc une route de politique vers l'interface ne suffit pas quand la liste du pair exclut ce préfixe. Gardez la liste sous le contrôle du propriétaire du routage plutôt que de compter sur la création de routes que le gestionnaire effectue par hasard.
Marques, tables et couverture du pair
Les marques sont un espace de noms partagé, donc la valeur et le masque doivent être convenus avec tout ce qui les utilise. Une règle qui envoie le trafic marqué vers une table dédiée a besoin d'un résultat défini quand cette table n'a aucune route correspondante, car une recherche sans réponse peut continuer vers la règle suivante et faire sortir le paquet par l'interface physique. Une route par défaut blackhole dans la table dédiée transforme cette fuite silencieuse en rejet visible. Ce que la conception ne peut toujours pas faire, c'est se fermer en cas de panne pour une destination qui n'est jamais entrée dans l'ensemble.
Les paquets extérieurs du tunnel lui-même doivent échapper au classifieur. Les outils WireGuard fournissent une marque de socket exactement pour cela, et son usage empêche l'encapsulation d'être routée vers l'interface qu'elle construit.
Testez chaque durée de vie séparément
Trois mémoires vieillissent selon trois calendriers : le cache du résolveur, les éléments de l'ensemble et la connexion suivie. Testez-les dans cet ordre et regardez si chacun bouge quand il le doit. Les commandes ci-dessous lisent le résolveur, l'ensemble, la table de connexions et les règles de politique sans rien changer.
dig +short office.example
nft list set inet vpn_select office_v4
conntrack -L -d 10.60.8.15
ip rule show
Une recherche fraîche qui ajoute un élément prouve que l'alimentation fonctionne, tandis qu'un élément périmé qui survit à sa réponse est un décalage de durée de vie qui mérite d'être noté. Une nouvelle connexion apparaissant dans la table de connexions avec la marque attendue montre que le classifieur a tourné, et une ancienne connexion qui garde sa marque d'origine est un comportement correct et non un défaut. La liste des règles répond à la question de savoir si la recherche de politique existe, ce qui est une autre question que celle de savoir si elle a correspondu. Lisez les quatre sorties dans cet ordre et le transfert défaillant se désignera lui-même.
Lorsque l'exigence est qu'un nom précis emprunte toujours un seul chemin, un ensemble alimenté par DNS ne peut pas le prouver, car les adresses partagées portent aussi d'autres noms. Un proxy ou un mécanisme au niveau applicatif est l'outil de cette garantie.