Comment utiliser le tunnel TUN / TAP à partir du programme utilisateur?

9

J'ai récemment découvert l'existence d'interfaces Linux TUN / TAP et j'essaie toujours de les comprendre. Je pense que je comprends le concept de base - des pseudo-périphériques sont créés qui émulent une interface réseau et au lieu de transmettre des données au matériel, ils sont transmis à un programme de l'espace utilisateur.

Comment dirigeriez-vous un programme indépendant pour utiliser ce tunnel?

Par exemple, avant la création du tunnel, mon système contient uniquement eth0 et lo, l'interface Ethernet normale (câblée à mon réseau local) et l'interface de bouclage. Après qu'un programme a créé et configuré un tunnel, j'ai une nouvelle interface gr0 à laquelle j'ai donné une adresse IP qui est sur mon réseau local, mais pas utilisée (donc nous sommes tous sur le même sous-réseau). Comment puis-je faire en sorte qu'un programme indépendant utilise ce «tunnel»? Disons que j'avais un simple message Python passant une application client / serveur qui utilise une connexion TCP, comment pourrais-je le configurer pour utiliser le tunnel?

Je m'excuse si je manque quelque chose de basique, mais comme d'habitude, j'ai réussi à me confondre dans l'ordre des choses. Encore une fois, tout ce que je veux, c'est qu'un simple programme TCP utilise ce tunnel.

Merci!

M. Shickadance
la source

Réponses:

7

Ce n'est pas toujours "tunnel". TUN / TAP n'est que des pilotes NIC spécifiques. Du point de vue de la pile réseau, ils agissent comme n'importe quelle autre interface réseau: ils peuvent avoir des adresses IP, peuvent être des interfaces point à point ou de diffusion. Les règles de routage leur sont également applicables. Mais tout le trafic qui est écrit sur l'une de ces interfaces réseau va à un programme de l'espace utilisateur pour le traitement, et toutes les données écrites directement par le programme de l'espace utilisateur /dev/tunXressemblent à des paquets entrants pour la pile réseau.

Dans la configuration de tunneling habituelle, le serveur et le client ont des périphériques TUN avec des adresses attribuées. Les tables de routage configurées sur les deux dirigent le trafic nécessaire vers ces périphériques TUN. Lorsque le paquet est routé vers tun0, le noyau l'envoie au programme de l'espace utilisateur (client) qui envoie ce paquet à un autre programme sur une machine distante (serveur) via, par exemple, une connexion TCP. Sur une machine distante, un autre programme (serveur) reçoit le paquet du client et l'écrit sur son propre /dev/tunXappareil, "injectant" ce paquet dans la pile réseau. Et le paquet tunnelé est traité comme n'importe quel autre.

gelraen
la source
1
Donc, la réponse (pour mes besoins) est de configurer la table de routage pour diriger le trafic vers ces interfaces. C'était le point qui me manquait, mais maintenant je devrais pouvoir trouver une solution. Aussi, j'apprécie l'explication car elle clarifie les choses. Merci!
M. Shickadance
2
J'ai fini par utiliser "route add <TUN IP ADDR> dev gr0". Cela m'a permis de rediriger le trafic via la nouvelle interface. Merci encore!
M. Shickadance