Je ne suis pas encore prêt pour les namespace, que je ne maîtrise pas...
En fait, pour la petite histoire, j'ai utilisé ça au boulot pour simplifier un setup qui était devenu
relativement complexe : marquage par uid, conntrack TCP, copie conntrack->fwmark, remplissage des tables de routage, reroute-check, masquerading uniquement pour corriger l'IP source, rp_filter=2 pour ne pas refuser les réponses, chacun de ces petits détails étant requis pour que la connexion TCP fonctionne correctement.
Là où ça a vraiment apporté un double gain de maintenabilité, c'est que le netns principal ne sert que pour une interface d'administration et une table de routage triviale. Le netns spécifique peut être détruit, modifié, cassé, manipulé par des outils d'automatisation (think: Puppet/SaltStack/Chef/Ansible) sans jamais risquer de perdre la connexion à la machine.
Et depuis je ne rêve que de segmenter toutes les manips réseaux qui constituent ma gateway en de petits netns (network namespaces) tout propres avec des tables de routage simples. Au détriment d'une perte de performances (théorique ? sensible ?) à mesure que le kernel s'amuse à faire circuler le trafic d'un namespace à un autre. Comme souvent en I.T., on ne peut pas tout avoir (performances maximales, maintenabilité, sécurité, pérennité).
À noter que les cgroups sont un pas vers les namespaces dans la mesure où ces deux technologies sont les principales fondations des containers sous Linux.
Par contre, pour le RENEW DHCP, je trouve assez fastidieux de devoir mettre à jour le PID dans le fichier tasks. Si pour une raison ou une autre, la mise à jour du pid ne fonctionne pas, c'est un coup a chercher pendant des heures. le skgid, me semble plus simple pour cela.
Alors, pour rendre à César ce qui est à César : le topic mentionné par zoc utilise des commandes cg* pour lancer dhclient directement dans le cgroup netprio adéquat plutôt que de l'y déplacer après lancement (= la race condition assurée).
Sinon, j'utilise effectivement systemd pour lancer les dhclient, quand tu dis qu'il y a des facilités cgroup, tu penses à quoi comme variable ? j'ai regardé vite fait et je n'est rien trouvé de spécial sur la partie cgroup/ip/routage.
systemd lance TOUT dans des cgroups dédiés... c'est tout simplement comme ça qu'il traque les processus relatifs à un service (finis les fichiers pid avec les race conditions qui vont avec). Tu peux voir ça avec systemd-cgls ou dans une moindre mesure avec systemctl status. Donc en théorie tu dois pouvoir simplement filtrer sur quelque chose comme
-m cgroup --path system.slice/isc-dhcp-client@orange1.service (syntaxe iptables). Cela dit, j'ai comme l'impression que nftables n'offre pas les mêmes fonctionnalités qu'iptables pour matcher sur les cgroups (ça parle de matcher sur un cgroup number, je vois pas qui ça intéresse).
Ensuite, quand je trouvais dommage de ne pas pouvoir utiliser uniquement une regles mangle/OUTPUT, je suggérais de se passer de tout autre mécanisme comme le skgid. Et donc en analysant uniquement les caractéristiques 'standards' des paquets RENEW.
Ah oui, ça, c'est juste mort.
De plus, visiblement les rules [...]
Qu'en penses-tu ?
C'est marrant que ça ne fonctionne pas avec
ipproto udp sport 68 dport 67, il y a peut-être un bug sous-jacent.
Mais pour réitérer mes recommandations : ne duplique pas tes discriminations. Tu as déjà discriminé sur UDP sport 68 dport 67 dans Netfilter/nftables et tu as associé cette discrimination aux fwmark 0x100 et 0x200. Plus besoin de répéter ces discriminations dans ip rule. Dans
ip rule, tu mentionnes la fwmark, qui signifie non plus "le trafic DHCP machin truc" mais "ce qui doit être routé en utilisant la table de routage 0x100 / 0x200" et basta.
Je confirme que ça me semble une bonne idée de mettre toutes les ip rule fwmark en priorité. Si ça a des effets de bord, c'est probablement que tu as du trafic mal marqué.
Enfin, un mot sur toutes les rules "from x.x.x.x lookup xxx" : ces rules supposent que l'IP source est déjà connue et correcte au moment du routage. À manipuler avec précaution donc.