J'ai creusé dans les sources de Darwin pour essayer de trouver un moyen de créer des interfaces Ethernet virtuelles sur Mac/Darwin sans ajouter une extension du noyau comme tuntaposx. En faisant cela, j'ai trouvé quelque chose d'intéressant qui semble exister mais qui n'a aucune documentation.
Voici le fichier source :
https://opensource.apple.com/source/xnu/xnu-4570.41.2/bsd/net/if_fake.c.auto.html
La lecture du fichier m'amène à penser que c'est similaire à une paire veth sous Linux : créer deux interfaces et les paquets entrant dans l'une sortent par l'autre.
Le seul problème est que je peux trouver rien sur Internet à ce sujet.
J'ai pu confirmer qu'il existe à partir de OSX Mojave et je suppose qu'il existe aussi sur des versions plus anciennes :
# ifconfig feth0 create
feth0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 66:65:74:68:00:00
peer: <none>
media: autoselect
status: inactive
Après avoir cherché un peu plus, il semble que j'ai trouvé une option non documentée dans ifconfig pour relier deux d'entre eux :
# ifconfig feth0 peer feth1
# ifconfig feth0
feth0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 66:65:74:68:00:00
inet 9.9.9.9 netmask 0xffffff00 broadcast 9.9.9.255
peer: feth1
media: autoselect
status: active
Maintenant, quand j'ajoute une IP à feth0 et que je fais un tcpdump de feth1, je vois un tas de paquets qui sont des choses comme des annonces mDNS que l'on s'attendrait à voir un Mac cracher sur un nouveau lien Ethernet.
Je publie ce message ici parce que je suis curieux de savoir si quelqu'un d'autre a une idée sur ce sujet ou l'a déjà utilisé.
Edit : Je peux maintenant confirmer que si vous les appairez et les faites monter tous les deux (ifconfig feth0 up, etc.) vous pouvez injecter des paquets de chaque côté et les voir dans l'autre. Il semble que cela pourrait fonctionner en tant que périphérique de connexion Ethernet de couche 2 ou périphérique de paire veth de machine virtuelle sans nécessiter une extension du noyau. Non seulement c'est génial pour la virtualisation du réseau mais, associé aux extensions de virtualisation d'Apple, cela permettrait également de créer un hôte VM sans kext avec des capacités réseau complètes.
Edit #2 : Nous venons également de trouver ceci, qui n'est pas non plus très bien documenté, mais bien meilleur que feth. Il peut offrir un moyen plus officiellement supporté de créer des périphériques Ethernet virtuels. Nous devrons voir comment cela fonctionne. Le truc de feth est quand même intéressant !
0 votes
Juste une remarque pour ceux qui passeront par là : en fait, il existe un mécanisme intégré, dans l'espace utilisateur, pour créer des périphériques de réseau virtuels, appelé
utun
. Le fonctionnement est le suivant : une application de l'espace utilisateur ouvre un socket SOCK_DGRAM (à l'aide d'une interface de contrôle du noyau - spécifique à la Apple) qui peut être utilisé pour lire/écrire des paquets. La durée de vie de cette interface est liée au processus qui maintient la socket ouverte (contrairement à linux). Il s'agit d'une couche de protocole, donc pas de moyen de traiter les trames de la couche de liaison (ethernet) - tout comme sous linux. TUN adaptateur. Vérifier OpenVPN pour voir comment il est mis en œuvre.0 votes
Oui, utun est la méthode documentée, mais il n'est pas possible de créer un périphérique de couche 2 avec utun. Le mécanisme feth est le seul moyen connu de créer un périphérique de prise de couche 2 sur MacOS sans extension du noyau. De plus, utun est codé en dur comme étant sur liste noire dans le démon bonjour/mDNS de MacOS, ce qui signifie que mDNS ne fonctionne pas et ne pourra jamais fonctionner sur les réseaux utun device sans un hack tel que l'écriture d'un "répéteur" qui écoute l'interface principale et répète les paquets mDNS.