15 votes

Fausses interfaces ethernet (feth / if_fake) ? Quelqu'un a déjà vu cela ?

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 !

https://developer.apple.com/documentation/vmnet

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.

0voto

Theologin Points 494

Oui, vous pouvez créer de nouvelles interfaces et les relier entre elles comme vous le souhaitez pour tout ce que votre cœur désire : ) Vous pouvez utiliser cette fonction pour toutes sortes de choses, comme isoler un certain trafic. Par exemple : forcer tout le trafic à passer par un VPN sauf pour certains critères. Mon routeur envoie tout le trafic par un VPN qui est un réseau local séparé de mon décodeur/câbleur. Je veux utiliser mon appareil mobile pour changer de chaîne mais cela ne fonctionnera pas si je suis dans un VPN, une interface séparée peut soit tunneliser le trafic de mon appareil ou isoler le trafic dirigé vers l'application mobile que j'utilise et le faire passer par le VPN.

Pour ce qui est de la référence et de la documentation, Unix utilise des pages de manuel, tout comme Linux, pour les références de base et fondamentales. J'aime utiliser cheat.sh pour des exemples, il est aussi très bien formaté lorsque vous faites une requête dans votre terminal. Il est formaté comme ceci cheat.sh/exemple. ~ cheat.sh/ifconfig

2 votes

Oui, mais feth n'est mentionné dans aucune page de manuel sur Mac. Il est très peu documenté mais il existe.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X