La Fibre
Datacenter et équipements réseaux => Routeurs =>
OpenWrt => Discussion démarrée par: basilix le 21 septembre 2024 à 12:03:15
-
Bonjour !
Je voudrais substituer le serveur DHCPv4 dnsmaq par celui de odhcpd afin de simplifier ma configuration. Mais la documentation odhcpd ne me paraît pas très exhaustive.
C'est pas facile pour moi de comprendre les sources de odhcpd. Il y a une multitude de pointeurs et de structures. Je ne pensais pas que le code était aussi complexe. Si
quelqu'un de plus avancé pouvait indiquer les options actuellement supportées par odhcpd, ce serait un gain de temps formidable.
Le projet OpenWrt a mis en ligne un outil pour rechercher les identificateurs (https://lxr.openwrt.org/ident).
Je demande à tout hasard.
-
https://git.openwrt.org/?p=project/odhcpd.git;a=blob;f=src/dhcpv4.h;h=b378bc17165f65f44fa8eb48690f74240e64a10f;hb=HEAD
41 enum dhcpv4_opt {
42 DHCPV4_OPT_PAD = 0,
43 DHCPV4_OPT_NETMASK = 1,
44 DHCPV4_OPT_ROUTER = 3,
45 DHCPV4_OPT_DNSSERVER = 6,
46 DHCPV4_OPT_DOMAIN = 15,
47 DHCPV4_OPT_MTU = 26,
48 DHCPV4_OPT_BROADCAST = 28,
49 DHCPV4_OPT_NTPSERVER = 42,
50 DHCPV4_OPT_LEASETIME = 51,
51 DHCPV4_OPT_MESSAGE = 53,
52 DHCPV4_OPT_SERVERID = 54,
53 DHCPV4_OPT_REQOPTS = 55,
54 DHCPV4_OPT_RENEW = 58,
55 DHCPV4_OPT_REBIND = 59,
56 DHCPV4_OPT_IPADDRESS = 50,
57 DHCPV4_OPT_HOSTNAME = 12,
58 DHCPV4_OPT_REQUEST = 17,
59 DHCPV4_OPT_USER_CLASS = 77,
60 DHCPV4_OPT_AUTHENTICATION = 90,
61 DHCPV4_OPT_SEARCH_DOMAIN = 119,
62 DHCPV4_OPT_FORCERENEW_NONCE_CAPABLE = 145,
63 DHCPV4_OPT_END = 255,
64 };
??
-
Je l'avais déjà trouvé.
On a une succession d'appels de fonction qui y mène : dhcpv4_setup_interface ➡ handle_dhcpv4 ➡ dhcpv4_handle_msg ➡ dhcpv4_put.
Cela n'explique pas comment l'option est intégrée dans le logiciel (son rôle) ou sous quelle forme elle apparaît dans la configuration.
-
On affecte un pointeur sur la fonction handle_dhcpv4 dans notre structure de type odhcpd_event. Le champ handle_dgram (odhcpd.h) est un pointeur sur une fonction ; il contient l'adresse de handle_dhcpv4.
iface->dhcpv4_event.handle_dgram = handle_dhcpv4;
iface est un pointeur sur une structure de type interface (odhpcd.h). Cette structure définit aussi des « paramètres » relatifs à IPv6 (RA, NDP, DHCPv6).
Je suppose que handle_dgram est l'abréviation de « handle datagram ». Ci-dessous le prototype de la fonction handle_dhcpv4.
static void handle_dhcpv4(void *addr, void *data, size_t len,
struct interface *iface, void *dest_addr);
D'ailleurs, je ne comprends pas quand la fonction est invoquée. Le pointeur iface semble être transmis d'appel en appel de fonctions.
dhcpv4_setup_interface ⬅ dhcpv4_netevent_cb. La fonction dhcpv4_netevent_cb est accessible via le champ dhcpv4_netevent_handler.cb.
La fonction netlink_add_netevent_handler prend comme argument l'adresse de la structure dhcpv4_netevent_handler. Cette fonction est elle-même invoquée par la fonction dhcpv4_init.
int netlink_add_netevent_handler(struct netevent_handler *handler)
{
if (!handler->cb)
return -1;
list_add(&handler->head, &netevent_handler_list);
return 0;
}
-
Le support des options DHCPv4 semble être codé dans les sources. En recherchant dans le journal d'archivage (https://github.com/openwrt/odhcpd/commit/f2cda6c15b55c80be8739f492a8ee7b4dbd1cf52) (commit), par exemple, on peut découvrir la façon dont a été ajouté l'option « router ».
J'aurais eu bien aimé qu'il suffise juste d'indiquer l'option dans le fichier de configuration /etc/config/dhcp. Que cela aurait été simple !
-
Hum juste pour ton info, parce que je vois que tu t'éclates la tête pour pas grand chose, il faut vraiment que tu essayes ChatGPT (4o par ex) ou équivalent.
Il prend des fichiers, donc tu lui fais avaler le ZIP du code source, il va analyser le code et te donner tout le cheminement, les lignes associées par rapport à tes questions.
-
Hum juste pour ton info, parce que je vois que tu t'éclates la tête pour pas grand chose, il faut vraiment que tu essayes ChatGPT (4o par ex) ou équivalent.
Il prend des fichiers, donc tu lui fais avaler le ZIP du code source, il va analyser le code et te donner tout le cheminement, les lignes associées par rapport à tes questions.
[Humour]
Et le jour où ChatGPT fera directement du retro-engeenering... ;)
[/Humour]
-
[Humour]
Et le jour où ChatGPT fera directement du retro-engeenering... ;)
[/Humour]
Sans déconner, essaye. Balance-lui un binaire et pose tes questions ;)
-
@optix :
Ce n'est pas vraiment amusant, c'est certain. D'un autre côté, le code est forcément structuré. À chacun sa méthode.
-
Sans déconner, essaye. Balance-lui un binaire et pose tes questions ;)
Suis en retard d'une guerre! (ou de plusieurs, on ne sait plus les compter!) ;D
-
Je ne comprends pas ce que tu veux. Plus que ça ? : https://openwrt.org/docs/techref/odhcpd
-
@ppn_sd :
En effet, je m'aperçois que mon message n'était pas clair.
Le serveur DHCPv4 implémenté dans odhcpd supporte quelques options DHCPv4. Je ne maîtrise pas encore le langage C mais j'essaye de progresser.
Dans un premier temps, j'ai recherché certaines chaînes de caractères (motifs) dans les sources pour voir un peu comment les options étaient intégré.
J'ai trouvé des références à l'option « authentication » ainsi qu'à d'autres options ne figurant pas dans la liste des options de la documentation odhcpd.
J'ai cru (à tord) que ces options étaient supporté par odhcpd et que la documentation était, de fait, incomplète.
Mais mon idée initiale était d'essayer d'implémenter les options DHCPv4 manquantes dans odhcpd afin de faire fonctionner la téléphonie Orange. Mon
routeur OpenWrt de substitution devrait idéalement configurer la Livebox par le serveur DHCPv4 de odhcpd. Apparemment, j'aurais moins de difficulté
à intégrer le résolveur DNS unbound en n'utilisant que odhcpd (DHCPv4 + DHCPv6...). Dans l'image usine, le serveur DHCPv4 est dnsmasq et l'on a
pas de résolveur DNS récursif. De plus, mon système OpenWrt semble plutôt instable. Je cherche à mieux connaître le fonctionnement du système afin
de pouvoir déboguer. On demande systématiquement de publier sa configuration lors d'un problème, sur le forum OpenWrt, et cela ne me convient plus.
-
On demande systématiquement de publier sa configuration lors d'un problème, sur le forum OpenWrt, et cela ne me convient plus.
Qu'est ce qui te gêne ?
-
Je ne parviens pas à identifier les sources d'erreur. Par principe, je pense aussi que ce n'est pas tellement efficace dès que les choses se complexifient.
En d'autres termes, il y a trop de facteurs potentiels à considérer pour envisager que cela soit satisfaisant. Par conséquent, j'espère y voir un peu mieux
dans cette complexité avec une mise à niveau (choses simplifiées) ; en évitant les processus longs, incertains et répétitifs. J'ai besoin d'une configuration
paramétrable et flexible (provenant d'exigences personnelles et mais aussi dues au FAI Orange).
-
Si tu installes dnsmasq-full tu peux remplacer odhcp par dnsmasq et on peut afficher les options dhcp supporté par dnsmasq avec
dnsmasq --help dhcp
Known DHCP options:
1 netmask
2 time-offset
3 router
6 dns-server
7 log-server
9 lpr-server
13 boot-file-size
15 domain-name
16 swap-server
17 root-path
18 extension-path
19 ip-forward-enable
20 non-local-source-routing
21 policy-filter
22 max-datagram-reassembly
23 default-ttl
26 mtu
27 all-subnets-local
31 router-discovery
32 router-solicitation
33 static-route
34 trailer-encapsulation
35 arp-timeout
36 ethernet-encap
37 tcp-ttl
38 tcp-keepalive
40 nis-domain
41 nis-server
42 ntp-server
44 netbios-ns
45 netbios-dd
46 netbios-nodetype
47 netbios-scope
48 x-windows-fs
49 x-windows-dm
58 T1
59 T2
60 vendor-class
64 nis+-domain
65 nis+-server
66 tftp-server
67 bootfile-name
68 mobile-ip-home
69 smtp-server
70 pop3-server
71 nntp-server
74 irc-server
77 user-class
80 rapid-commit
93 client-arch
94 client-interface-id
97 client-machine-id
100 posix-timezone
101 tzdb-timezone
108 ipv6-only
119 domain-search
120 sip-server
121 classless-static-route
125 vendor-id-encap
150 tftp-server-address
255 server-ip-address
Dnsmasq version 2.90 Copyright (c) 2000-2024 Simon Kelley
Compile time options: IPv6 GNU-getopt DBus no-UBus i18n IDN2 DHCP DHCPv6 no-Lua TFTP conntrack ipset nftset auth cryptohash DNSSEC loop-detect inotify dumpfile
NB: c'est un example sur mon PC car je n'ai pas réussi de me connecter sur l'internet avec qemu et openwrt ...
-
@Brummpanda :
Je veux complètement remplacer dnsmasq par odhcpd. Plusieurs raisons à cela.
- odhcpd-ipv6-only est le logiciel supporté par défaut par le projet OpenWrt pour intégrer IPv6.
- dnsmasq implémente aussi un serveur relais DNS. Je souhaite utiliser le résolveur DNS unbound.
En retirant dnsmasq du système, cela simplifierait significativement ma configuration. odhcpd ferait IPv4 + IPv6 et unbound ferait résolveur DNS.
Je m'en fous pas mal du support IPv4 car mon réseau local sera en IPv6. Néanmoins, la téléphonie Orange de la Livebox fonctionne seulement en IPv4.
-
Je progresse au niveau de ma lecture de odhcpd en lisant le code et les RFC afférentes.
Je pense que j'aurais bientôt la réponse à la question ci-dessous.
Quel est le rôle du symbole DHCPV4_OPT_AUTHENTICATION ?
Les messages DHCP FORCERENEW doivent être authentifiés via les procédures décrites dans le RFC 3118. [1] Cela pourrait expliquer le fait qu'un mécanisme d'authentification ait été
ajouté dans odhcpd. Effectivement, on retrouve ce symbole dans la fonction dhcpv4_fr_send (DHCPV4_MSG_FORCERENEW). Il faut que je lise le RFC 3118 pour éclaircir les choses
afin d'estimer le niveau de complexité. On observe également la structure de type dhcpv4_auth_forcerenew auth dans cette fonction (https://lxr.openwrt.org/source/odhcpd/src/dhcpv4.c#L471).
struct dhcpv4_auth_forcerenew auth = {
.protocol = 3,
.algorithm = 1,
.rdm = 0,
.replay = {htonl(time(NULL)), htonl(++serial)},
.type = 2,
.key = {0},
};
[03/11]
Le protocole « RKAP » (Reconfiguration Key Authentication Protocol) fournit une protection relative contre les tentatives malveillantes de
reconfiguration par envoi d'un message « Reconfigure ». Plusieurs protocoles peuvent être supportés dans l'option d'authentification.
Le protocole « Configuration Token » offre une protection rudimentaire contre des configurations diffusées par erreur mais peut aussi
servir à authentifier la source d'un message. L'information d'authentification envoyée par le serveur est déjà connue au préalable
par le client et inversement. Si le message peut être intercepté lors de sa transmission, alors ce protocole n'offre aucune protection
contre les actes malveillants ou proscrits.
Un message ne peut contenir qu'une seule option d'authentification. Je ne sais pas si on peut alterner les protocoles dans différents
messages envoyés par le même serveur.
[1] RFC 3203, page 4, section 6. Security Considerations.