Auteur Sujet: Petit LD_PRELOAD pour amateurs de setsockopt()  (Lu 2140 fois)

0 Membres et 1 Invité sur ce sujet

xavierg

  • Abonné Orange Fibre
  • *
  • Messages: 96
Petit LD_PRELOAD pour amateurs de setsockopt()
« le: 12 octobre 2020 à 22:54:28 »
Hello,

Une problématique courante dans cette section du forum est de patcher des softs (typiquement des clients DHCP) pour qu'ils « préparent le terrain » à la mise en place de la CoS (c-à-d les trois bits "PCP" dans l'en-tête 802.1Q). Sur les machines et routeurs basés sur Linux, cela passe typiquement par l'ajustement de la skb->priority via setsockopt(SOL_SOCKET, SO_PRIORITY).

En résumé :
        programme (ex : dhclient)                  kernel          interface vlan      paquet réseau
setsockopt(SOL_SOCKET, SO_PRIORITY, 6, 4);  ->  skb->priority  ->  egress-qos-map  ->    802.1Q/PCP   -> Orange content

Une rapide recherche m'a confirmé que setsockopt() était fréquemment discuté ou du moins mentionné mais LD_PRELOAD est beaucoup moins souvent évoqué, alors que ça permet potentiellement de s'épargner une recompilation (ou de ne pas embêter zoc).

Aujourd'hui, j'ai pris le temps d'écrire un petit objet LD_PRELOAD qui émet un setsockopt() après chaque appel à socket (ce qui est un peu bourrin en théorie mais a priori inoffensif dans la pratique) : so_priority.so

Je vous copie-colle bêtement le README :
Citer
Set SO_PRIORITY (aka skb->priority on Linux) right after each socket() call.

Compile with: gcc -shared -ldl -fPIC so_priority.c -o so_priority.so
Usage: SO_PRIORITY_DEBUG=1 SO_PRIORITY_VALUE=6 LD_PRELOAD=/path/to/so_priority.so program arg1 arg2

Petite limitation : pour ceux qui voudraient l'utiliser avec l'utilitaire ping, cela ne fonctionne que si vous êtes root (parce que la prise en compte de LD_PRELOAD est désactivée pour les binaires setuid ou associés à une capability, ce qui est le cas de ping).

That's it.

petrus

  • Expert AS206155
  • Expert
  • *
  • Messages: 1 065
Petit LD_PRELOAD pour amateurs de setsockopt()
« Réponse #1 le: 12 octobre 2020 à 23:24:40 »
Très fun, belle utilisation de linux, et la source est suffisamment simple pour être compréhensible.

Je n'ai pas pas testé la source, mais ptite typo qui m'a piqué l'oeil :)
diff --git a/so_priority.c b/so_priority.c
index 007f1a2..f02afde 100644
--- a/so_priority.c
+++ b/so_priority.c
@@ -32,7 +32,7 @@
 
 typedef int (*socket_function_type)(int, int, int);
 
-/* Pointer to the actual scoket symbol. */
+/* Pointer to the actual socket symbol. */
 socket_function_type so_priority_socket = NULL;
 
 /* SO_PRIORITY value to set; can be configured using the SO_PRIORITY_VALUE environment variable. */

xavierg

  • Abonné Orange Fibre
  • *
  • Messages: 96
Petit LD_PRELOAD pour amateurs de setsockopt()
« Réponse #2 le: 12 octobre 2020 à 23:44:14 »
Ah oui, Linux ça va mais alors le clavier, c'est une autre histoire...
=> corrigé -- merci pour le signalement :)

wsw70

  • Abonné Orange Fibre
  • *
  • Messages: 44
Petit LD_PRELOAD pour amateurs de setsockopt()
« Réponse #3 le: 22 août 2022 à 15:52:00 »

Une problématique courante dans cette section du forum est de patcher des softs (typiquement des clients DHCP) pour qu'ils « préparent le terrain » à la mise en place de la CoS (c-à-d les trois bits "PCP" dans l'en-tête 802.1Q). Sur les machines et routeurs basés sur Linux, cela passe typiquement par l'ajustement de la skb->priority via setsockopt(SOL_SOCKET, SO_PRIORITY).


Je voulais juste dire merci pour ce soft. Presque deux ans plus tard il m'a permis de lancer un Debian 11 en tant que routeur.

xavierg

  • Abonné Orange Fibre
  • *
  • Messages: 96
Petit LD_PRELOAD pour amateurs de setsockopt()
« Réponse #4 le: 22 août 2022 à 19:36:08 »
Je voulais juste dire merci pour ce soft. Presque deux ans plus tard il m'a permis de lancer un Debian 11 en tant que routeur.

De rien :)

cyayon

  • Abonné Orange Fibre
  • *
  • Messages: 648
  • Cordon 74 - Orange Fibre Pro
Petit LD_PRELOAD pour amateurs de setsockopt()
« Réponse #5 le: 07 octobre 2022 à 15:04:23 »
Hello,

actuellement j'utilise la commande tc pour changer la priorité de dhclient (je suis sous archlinux).

tc qdisc replace dev $iface root handle 1: prio
tc filter add dev $iface parent 1: prio 1 u32 match ip protocol 17 ff match ip dport 67 ffff action skbedit priority 0:6 # dhcpv4
tc filter add dev $iface parent 1: prio 2 protocol ipv6 u32 match ip6 protocol 17 ff match ip6 dport 547 ffff action skbedit priority 0:6 # dhcpv6

Je viens de compiler la lib so_priority.so, je me demande quel est la meilleure solution (la plus light/propre) entre faire tourner dhclient avec so_priority.so ou bien utiliser continuer à utiliser tc.

votre avis ?
merci !

xavierg

  • Abonné Orange Fibre
  • *
  • Messages: 96
Petit LD_PRELOAD pour amateurs de setsockopt()
« Réponse #6 le: 07 octobre 2022 à 15:41:19 »
Il n'y a pas de réponse absolue à cette question.
Tu mentionnes que tu cherches la solution la plus light (en termes de performances, je suppose) et la plus propre (en termes de maintenabilité je suppose).

En termes de performances, tc va demander au kernel de prendre un peu de temps (vraiment pas longtemps, ça doit se compter en cycles) pour vérifier si chaque paquet est un paquet DHCP. Si oui, il corrigera la skb->priority de ce paquet pour que celle-ci soit prise en compte par l'egress-qos-map associée à l'interface VLAN. so_priority.so positionne directement cette skb->priority depuis l'user land et ce uniquement pour le programme dhclient. Le kernel n'a plus à inspecter tous les paquets à la recherche de paquets DHCP. Sur ce point, so_priority.so l'emporte sur tc.

En termes de maintenabilité... c'est difficile à juger. tc est fourni par et intégré à ta distribution, alors que so_priority.so est une "pièce rapportée", à compiler soi-même selon un processus indéfini, ce qui peut être un "big no-no" dans certaines situations. Sur ce point, tc l'emporte sur so_priority.so.

cyayon

  • Abonné Orange Fibre
  • *
  • Messages: 648
  • Cordon 74 - Orange Fibre Pro
Petit LD_PRELOAD pour amateurs de setsockopt()
« Réponse #7 le: 07 octobre 2022 à 16:19:03 »
Parfait, merci bcp pour ta réponse. Je présumais de la même chose...

Compte-tenu des custo déjà en place sur mon firewall, je pense que je suis plus à ca près... J'étais près à patcher dhclient, alors bon...

J'ai créé un petit package archlinux avec so_priority, le seul risque qu'il peut y avoir c'est qu'il faille recompiler après un upgrade de la libc.