Depuis sa version 78, Thunderbird intègre nativement la prise en charge d'OpenPGP. Il utilise la bibliothèque de fonctions RNP, plus des appels à GnuPG (par exemple) comme le faisait l'extension Enigmail. Ainsi, Thunderbird importe la clé OpenPGP en en faisant une copie et en protégeant sa phrase de passe avec une chaîne de caractères générée automatiquement et stockée en clair dans le profil Thunderbird de l'utilisateur. Pour protéger la phrase de passe OpenPGP, il faut définir un mot de passe principal pour le gestionnaire de mots de passe interne.
Notons que, puisque la clé OpenPGP est copiée dans Thunderbird, il n'y a pas de synchronisation automatique entre Thunderbird et GnuPG. Un changement de date d'expiration, accorder sa confiance à une clé, signer une clé, importer une signature de sa clé, etc., toutes ces actions restent cantonnées à l'un ou à l'autre des logiciels.
Comme le note un observateur, la protection par un mot de passe principal n'offre pas les mêmes garanties qu'une utilisation d'Enigmail.
Sans agent GnuPG, Enigmail demandait la phrase de passe à chaque email à déchiffrer / signer. Avec un agent GnuPG, la phrase de passe restait quelques temps en RAM (sans protection) et les emails étaient lisibles sans protection durant cet intervalle.
Avec Thunderbird 78 (et suivants), si l'on ne défini pas de mot de passe principal, les emails sont lisibles en permanence. Si l'on en défini un, il est demandé à l'ouverture de Thunderbird et il est stocké en RAM jusqu'à ce que Thunderbird soit fermé, donc les emails sont lisibles dans cet intervalle, qui est plus long que ce qu'il était avec l'agent GnuPG.
À ce jour, Thunderbird ne permet pas de configurer un délai maximal de conservation du mot de passe principal en RAM.
On notera que la bibliothèque RNP comportait un bug qui lui faisait importer une clé sans la protéger, même si un mot de passe principal existait.
ÉDIT DU 24/09/2022 : j'avais écrit qu'il est possible de configurer Thunderbird pour utiliser GnuPG afin de pallier les déconvenues sus-exposées. Or, la doc' officielle que je pointais expose précisément qu'en ce faisant, GnuPG serait alors utilisé exclusivement pour les opérations de déchiffrement et de signature, et que l'implémentation interne continuerait d'être utilisée pour les opérations de chiffrement et de vérification d'une signature. Donc, il faut quand même synchroniser les trousseaux Thunderbird et GnuPG (Thunderbird a besoin de ta clé publique pour déchiffrer la copie des emails envoyés), surtout si tu utilises ta paire de clés OpenPGP pour d'autres usages que l'email avec Thunderbird (besoin des clés publiques de tes correspondants des deux côtés). En revanche, en utilisant GnuPG, ta clé privée sera alors protégée par celui-ci (et éventuellement son agent) plutôt que par Thunderbird, ce qui contrecarre bien deux des trois points énoncés ci-dessus. FIN DE L'ÉDIT.
Dans la version 78 de Thunderbird, il n'est pas possible d'accepter un certificat x509 auto-signé (ou expiré) pour un serveur SMTP ou IMAP : la boîte de dialogue "alerte de sécurité" n'apparaît pas et le gestionnaire de certificats (dans les paramètres) ne sait pas ajouter un tel certificat (aucun problème pour un serveur HTTPS bien qu'on se demande ce que ça fout dans un lecteur d'emails…).
Solution (esquissée ici) : puisque mon serveur web utilise le même certificat que mon serveur emails, je me rends sur mon site web avec Firefox, j'accepte le risque de sécurité, je ferme Thunderbird, je copie le contenu du fichier cert_override.txt qui se trouve dans mon profil Firefox dans le fichier cert_override.txt de mon profil Thunderbird et je l'adapte en changeant le port et en dupliquant la ligne (une pour IMAP, une pour SMTP).
Si ton serveur web n'utilise pas le même certificat que ton serveur emails (ou que t'as pas de serveur web), tu dois pouvoir forger le contenu du fichier cert_override.txt avec le logiciel firefox-cert-override (je n'ai pas essayé !).
GameShell = petit jeu GNU/Linux/BSD/MacOS en ligne de commande pour initier à quelques commandes Unix de base (cd, ls, rm, chmod, head, tail, find, grep, ps, kill, alias, cal, tr, nano, less, etc.) à travers 42 missions dans (et autour) d'un château (nettoyer le château, découvrir ses trésors, dérober la couronne, affronter un être maléfique, décrypter des messages, etc.). Codé par un prof de l'univ' Savoie Mont Blanc.
J'ai effectué les 42 missions. Je recommande. :)
Pourquoi tous les gestionnaires de mots de passe sous forme d'extension pour navigateur web ne se valent pas ?
L'auteur considère que les gestionnaires de mots de passe mal codés cassent les bienfaits de la compartimentation : il y a plusieurs niveaux de privilèges dans un navigateur web, et les mauvaises extensions mettent nos secrets dans le niveau le plus faible.
C'est loin d'être théorique, l'auteur a émis plusieurs rapports de bugs concernant plusieurs gestionnaires de mots de passe.
On notera que les problèmes soulevés sont conceptuels / fondamentaux, ils concernent plusieurs extensions. Comment discerner celles concernées ? 1) affiche-t-elle une icône / un menu / autre dans le contenu des pages web ? 2) apparaît-elle dans l'onglet Sources de l'onglet Débogueur des outils de développement de Firefox ? Si oui à l'une de ces questions, alors l'extension est vulnérable.
J'utilise l'extension PassFF, frontal pour le gestionnaire de mots de passe Pass. Après vérification, elle est vulnérable à ce type d'attaques. Un autre frontal, l'extension browserpass, n'est pas vulnérable.
Via Aeris.
Ici, nous utilisons snoopy. Packagé dans Debian GNU/Linux.
Avantages : un nom cool + pas besoin de ré-inventer la roue + contrairement à la méthode Octopuce, snoopy fonctionne en présence d'un hook preexec pour bash dont je me sers pour peupler mon agent SSH.
Inconvénient : par défaut, snoopy journalise également les actions d'origine non humaine (CRON, démon, tâche de fond, etc.), mais y'a moyen de définir des filtres dans sa configuration.
On peut aussi parvenir au même but avec psacct et acct.
Tuto sur comment migrer, sans (trop) d'interruption de service, un MariaDB dont les structures binaires de données sont corrompues.
On (re)découvre :
bind() un service réseau sur une adresse IP que l'on n'a pas (dans une configuration "reprise sur panne" avec keepalived, par exemple) sans écouter sur toutes les adresses et les interfaces (avec « :: » et « 0.0.0.0 ») ?
Les paramètres de Linux « net.ipvX.ip_nonlocal_bind » sont là pour ça.
Un prestataire me dit qu'il est possible de monter un même espace de stockage en mode bloc depuis plusieurs machines avec le protocole réseau ISCSI.
Je sais que ce n'est pas possible : ISCSI permet de monter un disque dur distant comme s'il était branché à la machine locale, pas de le partager. ISCSI = bus de données SCSI over Internet.
Mais bon, sur le moment, un peu de crédulité…
Mon collègue, qui a plus de connaissances que moi en stockage, me dit que ça paraît louche. Il teste quand même. Deux machines GNU/Linux montent, via ISCSI, un même espace de stockage de test hébergé sur notre NAS. Résultat : les données écrites depuis une machine n'apparaissent pas de l'autre côté. Il faut démonter/remonter l'espace de stockage pour voir les fichiers créés.
Discussion à trois avec notre prestataire, étonné : « ben avec VMware vSAN, ça marche : 5 hyperviseurs importent bien le même bloc de stockage ».
Mon collègue me dit alors que c'est normal : l'espace de stockage doit être formaté avec VMFS, le système de fichiers de VMware qui est un système de fichiers pour disque partagé.
Le monde du libre a ses systèmes de fichiers pour disque partagé : OCFS2, GFS2. Guiguiabloc nous illustre une utilisation d'OCFS2 (avec de jolis schémas).
Attention à ne pas confondre les systèmes de fichiers pour disque partagé avec les systèmes de fichiers répartis (CephFS, GlusterFS, RozoFS, etc.) dans lesquels les données sont… réparties et répliquées sur plusieurs machines.
Merci Alex de m'avoir appris tout ça.
Je découvre le multipath ISCSI qui permet de redonder l'accès à un espace de stockage exporté au format bloc avec le protocole réseau ISCSI. Ainsi, il est possible d'avoir deux chemins réseaux totalement distincts (câbles différents, routage différent, etc.) ou même deux têtes logicielles sur un même NAS utilisées simultanément (c'est d'ailleurs le support Dell qui nous a obligé à mettre en place le multipath ISCSI avant la mise à jour logicielle de notre NAS Unity XT).
Avec Debian GNU/Linux 10, on installe le paquet logiciel multipath-tools (device-mapper multipath), un p'tit fichier /etc/multipath/multipath.conf, on découvre/login avec iscsiadm (comme d'hab) puis on monte /dev/mapper/mpathX-partY au lieu de /dev/sdX.
Merci Alex de m'avoir appris cela (et de l'avoir mis en place).
Dans un annuaire Active Directory, et dans l'implémentation libre Samba, DFS permet de mettre en place des alias sur les lecteurs partagés, d'unifier derrière un même nom des partages réseau stockés sur des serveurs de fichiers différents. Exemple : smb://nas.masociete.example/compta et smb://nas.masociete.example/direction : un même nom, mais, en réalité, les données sont stockées sur deux serveurs. Encore mieux : la syntaxe smb://nas.masociete.example/<NOM_UTILISATEUR> peut envoyer deux utilisateurs différents sur deux serveurs de fichiers différents.
La table des correspondances est stockée dans la machine qui a le rôle DFS, qui n'est pas forcément le contrôleur de domaine.
La machine qui joue le rôle DFS effectue uniquement la redirection, les transferts de données ne passent pas par elle. Dit autrement : un ss sur un poste de travail montrera une connexion SMB entre cette machine et le véritable serveur de fichiers, pas entre elle et la machine DFS.
Cas d'usage ?
Merci Rémi de nous avoir appris et mis en place cela.
Nous avons plusieurs centaines de machines Ubuntu 20.04 qui ne sont pas attribuées à un utilisateur précis.
Nous voulons éteindre automatiquement ces machines après une période d'inactivité.
Critères :
sleepd est packagé dans Debian GNU/Linux, mais il ne l'est plus dans Ubuntu après la version 14.04.
Le paquet Debian fonctionne très bien sur Ubuntu :
apt download sleepd depuis une machine Debian ;apt install libx86-1 pm-utils vbetool sur une machine Ubuntu afin d'installer les dépendances ;dpkg -i sleepd_2.10_amd64.deb ;/etc/default/sleepd : « -u » pour le délai avant action ; « -s /sbin/poweroff » pour éteindre la machine au lieu de la mettre en veille ; « -w » pour comptabiliser également l'activité sur d'éventuelles sessions SSH ;systemctl restart sleepd.autopoweroff. Trop complet pour notre usage (il peut vérifier la consommation CPU et la joignabiltié de machines dont celle-ci dépend avant d'exécuter une action) donc fichier de configuration plus touffu.
CRON. Au début, je voulais écrire une tâche planifiée qui aurait tourné toutes les heures non-ouvrées et qui aurait utilisé la commande w pour déterminer si des utilisateurs ont eu une activité récente avant d'éteindre. Deux inconvénients : 1) pourquoi réinventer la roue ? ; 2) si l'on veut désactiver l'arrêt automatique lors d'une maintenance, il faut commenter le contenu d'un fichier, ce qui est moins pratique que systemctl stop sleepd.
Le protocole SMB version 1 utilisé au sein d'un domaine winwin (donc Kerberos) ne gère pas nativement les alias DNS (CNAME), il faut ajouter une clé de registre sur le serveur de fichiers ou enregistrer l'alias comme nom de service (SPN) Kerberos.
L'absence de prise en charge des alias DNS se constate aussi avec un client winwin 7 / 10 qui tente, en vain, de monter, en SMBv3, un partage CIFS exporté par un NAS Dell EMC Unity XT qui est membre d'un domaine Samba AD DC. Dans ce cas, impossible d'ajouter une clé de registre puisque le serveur de fichiers est le NAS Unity (et que la clé de registre fonctionne uniquement pour SMBv1). Il doit y avoir un moyen d'ajouter un Service Principal Name (SPN) Kerberos pour l'alias, mais nous n'avons pas creusé.
On peine à supprimer récursivement (rm -r) plusieurs arborescences plus ou moins touffues sur un partage NFS version 3. Idem pour copier récursivement (cp -a) des arborescences. La suppression ou la copie s'arrête sur un fichier, jamais le même puisque plusieurs arborescences. Peu importe sa taille, ancienneté, etc., a priori. Impossible dès lors d'utiliser le point de montage (depuis la machine qui supprime / copie, bien entendu, pas depuis toute machine qui monte le partage). Le problème se produit quasiment chaque jour.
Solution : monter le partage NFS en retirant les options rsize=32768,wsize=32768 et laisser agir la négociation automatique.
Explication ? Aucune idée.
On notera qu'autofs est d'aucune utilité dans ce genre de blocage NFS.
Plus de détails sur le contexte ? OK.
On utilisait ces options (et ces valeurs) avec nos anciens NAS (marques : NetApp et Nexenta). On ne les utilise plus sur notre NAS actuel (Dell EMC Unity) même si elles fonctionnaient durant nos tests.
Une machine physique Debian 7 montait un volume en ISCSI depuis notre ancien NAS Nexenta et elle l'exportait en CIFS (parce que le CIFS de notre NAS Nexenta ne fonctionnait pas, probablement car nous n'avions pas de contrôleur de domaine winwin ni Samba AD DC) et en NFSv3 vers une machine virtuelle d'administration du contenu du volume disque (l'usage d'ISCSI, qui exporte au niveau bloc, empêche, par nature, de monter le volume en NFS depuis le NAS). Cette VM d'administration montait le partage avec les options rsize et wsize sus-exposées. Aucun problème durant plus de 5 ans.
Nous avons cloné + virtualisé la machine physique Debian 7. Elle monte le même volume ISCSI, mais elle le monte depuis notre nouveau NAS Dell EMC, et elle l'exporte en CIFS (le temps de migrer nos utilisateurs, l'alias DNS avec lequel sont configurées les machines de nos utilisateurs ne pouvant être repris par notre nouveau NAS car la négociation SMB échoue car le client Kerberos du NAS refuse l'incohérence entre l'alias et le nom réel du service SMB, et l'ancien nom réel n'a plus de sens avec l'arrivée du nouveau NAS donc nous voulions pas le conserver) et en NFS à la même machine d'administration. Dès lors, cette machine d'administration a rencontré le problème sus-exposé. Le retrait des options entraîne une négociation automatique rsize=1048576,wsize=1048576 d'après cat /proc/mounts, soit bien plus que ce qu'on paramétrait à la main.
Deux changements entre avant et après : virtualisation de l'exportateur NFS et changement de l'initiateur ISCSI (de NAS, quoi). La logique impose de suspecter plutôt le deuxième. D'autant que nous n'utilisons plus rsize/wsize pour monter du NFS directement depuis notre nouveau NAS. On peut supposer qu'un enchaînement rsize/wsize fixées à 32 k + ISCSI ne convient pas à notre NAS Dell Unity.
Exporter le résultat d'une requête SQL dans un fichier CSV avec PostgreSQL : Copy (<REQUÊTE_SQL>) To '/tmp/<FICHIER_SORTIE>.csv' With CSV DELIMITER ',' HEADER; depuis psql.
Depuis quelques mois, nous avons un serveur coturn installé depuis les dépôts Debian GNU/Linux. Implémentation de TURN, l'un des nombreux palliatifs pour tenter de faire fonctionner des logiciels multimédias pair-à-pair avec du NAT au milieu.
Ce service se vautre plusieurs fois par semaine. Évidemment, rien dans son journal. Sauf aujourd'hui : segfault. Mes recherches sur le web retournent rien (ou des paths vieux de 5-7 ans, qui ont donc été intégré depuis, en ce qui concerne l'erreur de segmentation). On pourrait lancer coturn en mode ultra-verbeux (« -V »), sortir gdb (pour la segfault), etc. Mais en attendant ?
Pour ces cas-là, systemd propose Restart=on-failure, c'est-à-dire redémarrer un service à chaque fois qu'il crashe.
J'utilise ça dans des units systemd depuis plus de 5 ans. Mais, dans Debian, coturn est livré avec un script sysv qui utilise start-stop-daemon. Est-ce que ça fonctionne ? Oui.
Utiliser la commande systemctl edit coturn.service.
Saisir :
[Service]
RemainAfterExit=no
Restart=on-failure
RestartSec=10s
Enregistrer.
Désormais, systemctl status coturn affiche deux lignes supplémentaires : « Drop-In: /etc/systemd/system/coturn.service.d / override.conf ».
« RemainAfterExit » est nécessaire, sinon systemd ne fait pas le job.
« RestartSec » n'est pas nécessaire mais laisse un peu de répit à coturn pour démarrer et éviter une boucle de redémarrage (systemd essaye de faire redémarrer un service en boucle, jusqu'à une limite pré-définie et surchargeable, après quoi il laisse le service HS, ce que je ne veux pas).
Si l'on veut tester, on remplace « on-failure » par « always » puis killall coturn.
Sur notre parc Ubuntu GNU/Linux, l'authentification des utilisateurs pour l'ouverture de session se fait auprès de notre domaine Samba 4 AD DC (et sur un OpenLDAP auparavant).
On voudrait ajouter tous les utilisateurs du domaine à des groupes locaux (qui n'existent pas dans notre domaine). On ne peut donc pas utiliser /etc/group puisque l'utilisateur est enregistré dans une autre base de données.
Quel intérêt de faire ça ? Permettre à nos utilisateurs d'utiliser des logiciels qui réclament l'appartenance à un groupe local. Exemple : il faut être membre du groupe « vboxusers » pour avoir le droit de connecter des périphériques USB (clé USB, webcam, etc.) à une machine virtuelle VirtualBox. On n'a pas envie de pourrir notre domaine avec des goupes, sans compter que VirtualBox réclame une appartenance au groupe « vboxusers », pas au groupe « vboxusers@domaine.monorganisation.example »).
Comme d'hab, PAM vient à notre rescousse avec son module pam_group.
D'abord, on ajoute une ligne *;*;*;Al0000-2400;vboxusers dans le fichier /etc/security/group.conf. On peut restreindre l'application de la règle à certains services PAM (sshd, par exemple), c'est le premier champ. Ou à certains terminaux (deuxième champ). Ou à certains utilisateurs / groupes d'utilisateurs (troisième champ). Que à certains horaires (quatrième champ), ici tous les jours (« Al »), de 0 h à 24 h (0000-2400).
Ensuite, il faut ajouter pam_group à la liste des modules PAM exécutés sur le système. Par défaut, il est appelé depuis le fichier /etc/pam.d/login donc l'ajout de groupes fonctionne depuis les tty (ctrl+alt+Fx), mais pas sur une connexion SSH ou depuis un émulateur de terminaux lancé depuis l'interface graphique (gnome-terminal, etc.). Pour corriger cela, j'ajoute une ligne auth optional pam_group.so à la fin de /etc/pam.d/common-auth. Attention : si tu utilises pam_script, qui permet de lancer un script lors de l'authentification, de l'ouverture / fermeture de session, il faut que pam_group soit appelé avant pam_script sinon l'utilisateur ne sera pas ajouté aux groupes.
Il faut redémarrer le système pour que la modification devienne effective. Fermer la session ne suffit pas. Redémarrer le gestionnaire d'affichage (gdm3, dans mon cas) ne suffit pas.
Note : un bug dans systemd empêchait l'ajout de groupes par pam_group lors d'une ouverture de session graphique. Il est corrigé depuis longtemps, y compris dans Ubuntu 20.04.
Merci Alex d'avoir mis ça en prod'.
Nous avons un serveur avec plusieurs instances de MariaDB. Une instance = un processus, un port TCP, un fichier de configuration dédié, etc.
Sur ce serveur, si l'on tape la commande mysql -P <numéro_port_instance> -u <user> -p <nom_bdd>, MariaDB nous retourne l'erreur « ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory" ».
Si l'instance par défaut (celle qui écoute sur tcp/3306 / /var/run/mysqld/mysqld.sock) est toujours active, l'erreur est, en toute logique, « ERROR 1045 (28000): Access denied for user `
Le paramètre « -P », qui permet de préciser le port TCP à utiliser, ne se suffit pas à lui-même : il faut ajouter --protocol=tcp.
Ou utiliser la socket UNIX de l'instance à laquelle on veut accéder avec -S /var/run/mysqld/<socket>.
Quand on crée une tâche de déploiement d'une image disque (sur une seule machine, en unicast, ou sur une partie du parc, en multicast, même combat), l'interface web de notre serveur FOG (Free and Opensource Ghost), met énormément de temps (> 30 secs) à répondre pour annoncer que la tâche est créée.
Si l'on n'attend pas, que l'on va dans l'onglet « Tasks », on voit que la tâche est créée.
Origine du problème : un « storage node » apparaît toujours dans la liste alors qu'il n'existe plus. L'image disque que l'on veut déployer ne dépend pas de ce serveur, mais sa suppression depuis l'interface web de FOG résout la lenteur de celle-ci.
Après avoir voulu me remémorer comment fonctionne une capture réseau du point de vue du noyau Linux, je me suis interrogé sur l'activation, en détail, du mode promiscuous.
Une carte réseau Ethernet fait remonter au système d'exploitation uniquement les trames Ethernet qui lui sont destinées. Le tri est opéré sur l'adresse MAC de destination. Sont conservés les paquets dont l'adresse MAC est celle de la carte réseau, l'adresse broadcast (FF:FF:FF:FF:FF:FF), ou l'une des adresses multicast (01:00:5E:XX:XX:XX pour IPv4, 33:33:XX:XX:XX:XX pour IPv6).
Ce filtrage est effectué matériellement par la carte réseau.
Le mode promiscuous permet de retirer ce filtrage, donc d'écouter tout ce qui passe sur le réseau.
Bon, il faut relativiser :
Le mode promiscuous est global à une interface réseau : exécuter un tcpdump -p (on demande à ne pas activer le mode promiscuous) à côté d'un tcpdump (mode promiscuous activé) est vain : quel que soit l'ordre de lancement des commandes, le tcpdump -p verra les paquets qui ne sont pas destinés à la machine tant que le tcpdump (promiscuous) est en cours d'exécution.
Voir si l'une des interfaces réseau du système est en mode promiscuous : ip -d l sh | grep -B 1 promiscuity. Si le nombre affiché est supérieur à 1, alors plusieurs applications (+ le noyau voir ligne suivante) ont activé le mode promiscuous.
Activer le mode promiscuous sans passer par libpcap : sudo ip l set promisc on dev <INTERFACE>. Pour le désactiver : sudo ip l set promisc off dev <INTERFACE>.
Le mode promiscuous ne permet pas de voir TOUT le trafic réseau adressé à la machine. Une carte réseau peut filtrer matériellement le trafic qu'elle juge invalide : toute trame 802.1Q quand aucun VLAN est configuré sur le système, trames réseaux trop courtes ou dont la somme de contrôle est incorrecte, etc.
Tous les paquets qui arrivent sur une interface configurée en mode promiscuous ne parviendront pas jusqu'aux logiciels "serveurs" en écoute, car le noyau fait le tri.
Le tri le plus simple à mettre en évidence est que, si le transfert de paquets IP n'est pas activé (/proc/sys/net/ipv4/ip_forward = 0), alors tous les paquets IP dont l'adresse IP de destination n'est pas l'une des IPs de la machine (multicast inclus) seront détruits. Ils n'arriveront même pas jusqu'à la chaîne FORWARD de Netfilter/iptables. Il doit exister d'autres filtrages.
Si l'on regarde le code, la libpcap (utilisée par tcpdump, wireshark, etc.) utilise la fonction système setsockopt() pour positionner l'option. Il ne reste plus qu'à remonter le code de Linux.
setsockopt() est une fonction implémentée pour chaque famille/protocole. Une socket libpcap est de type AF_PACKET / PF_PACKET, donc c'est la fonction packet_setsockopt() située dans le fichier net/packet/af_packet.c qui est utilisée. Elle appelle packet_mc_add() qui appelle packet_dev_mc(), toujours dans af_packet.c.
dev_set_promiscuity() dans net/core/dev.c est appelée et elle appelle __dev_set_promiscuity() toujours dans net/core/dev.c. On notera que c'est cette fonction qui journalise « device XXXX entered promiscuous mode » dans kern.log.
__dev_set_promiscuity() appelle dev_change_rx_flags() (toujours dans net/core/dev.c) qui appelle ndo_change_rx_flags. Le pilote peut implémenter une fonction (ou non) pour remplacer celle par défaut et l'enregistrer dans la structure netdev_ops de la structure net_device. Exemple : le pilote e1000e n'implémente pas cette fonction.__dev_set_promiscuity() appelle dev_set_rx_mode() (toujours dans net/core/dev.c) qui appelle ndo_set_rx_mode(). Le pilote e1000e la remplace avec e1000e_set_rx_mode() (« .ndo_set_rx_mode = e1000e_set_rx_mode, ») dont le commentaire indique « e1000e_set_rx_mode - secondary unicast, Multicast and Promiscuous mode ». Cette fonction met à jour les registres de la carte réseau et, surtout, restaure+écrit les adresses multicast et unicast quand on sort du mode promiscuous.Je ne me souvenais plus : comment fonctionne une capture réseau avec la libpcap (tcpdump, wireshark, etc.) dans le noyau Linux ? À quel endroit du noyau le trafic est-il capturé par la libpcap ?
Explication concise dans les pages 10-12 de ce document que l'on peut recouper avec le code Linux de la libpcap.
En gros :
Création d'une socket de type RAW (entête Ethernet conservé), famille d'adresses AF/PF_PACKET (contournement de la partie TCP/IP de la pile réseau), protocole ETH_P_ALL (tous les protocoles). Dans le noyau (Linux), le protocole PF_PACKET, en tant que protocole générique, est traité très tôt par la pile réseau, après que le pilote de la carte réseau ait copié le paquet en RAM, et bien avant la couche IP (schéma) et Netfilter (le pare-feu de Linux). On voit la socket dans /proc/<PID_tcpdump>/fd ;
tcpdump -p permet de ne pas l'activer ;tcpdump -d affiche le bytecode BPF ;