Le NAT sans NAT
Niveau :
Résumé : slirp
Si vous n'êtes pas admin de la machine sur laquelle vous êtes (université ?), mais que vous voudriez partager votre connexion, par exemple pour une machine virtuelle ou pour des amis qui voudraient emprunter votre IP ... Il vous faut du NAT (a moins que vous vous contentiez d'un simple tunnel).
Problème : vous ne pouvez pas le mettre en place puisque vous n'êtes pas admin sur la machine qui partage la connexion.
Solution : slirp.
Hé oui c'est tout simple, slirp décapsule du PPP pour l'injecter dans de une socket normale et donc fait l'équivalent du NAT. Mais avec quelques limitations, on ne peut pas faire passer n'importe quel paquet (genre ping) depuis l'espace utilisateur, malgré tout c'est largement suffisant.
Le serveur de NAT (enfin le routeur quoi)
Bon c'est pas si simple mais presque.
Slirp est une commande qui utilise le l'entrée et sortie standard pour communiquer ce qui fait que si on veut l'utiliser à distance il faut le connecter à un "listener", ici nous allons utiliser socat, mais si vous voulez un tunnel chiffré, utilisez stunnel.
Donc vous avez besoin de socat et slirp sur la machine où vous êtes simple utilisateur. Si vous ne les avez pas recompilez les vous avez le droit. Si vous n'avez pas de compilateur copiez-lez depuis une autre machine, si cela ne fonctionne pas, recompilez les chez-vous en statique ... enfin vous êtes grands que diable, ne me posez pas cette question !
Il vous faut un fichier de configuration minimaliste pour slirp (à mettre dans ~/.sliprc) :
ppp asyncmap 0
Puis lancez le service genre sur le port 2000 (fullbolt = pas de limitation de vitesse) :
$ socat -s tcp4-listen:2000,fork system:/usr/bin/slirp-fullbolt
Le client de NAT (enfin le terminux quoi)
Ici c'est légèrement plus compliqué. Tout d'abord il faut être root puisque nous allons faire un vpn, donc un réseau, donc une interface et du routage. Pour cela il nous faut l'autre bout du tunnel (toujours socat dans l'exemple, mais vous pouvez utiliser stunnel pour faire du ssl) et pppd qui est en quelque sorte le client naturel de slirp.
Petite configuration optimisée de pppd pour correspondre à celle de slirp (à mettre dans /etc/ppp/peers/slirp) :
notty 115200 noauth lcp-echo-interval 0 asyncmap 0 nodefaultroute nodetach
Et c'est parti on se connecte :
$ socat tcp-connect:host3.enstb.com:2000 system:"pppd call slirp"
Maintenant nous avons une connexion mais un peu spéciale car slirp a des exigences :
- IP : 10.0.2.15
- Réseau : 10.0.2.0/24 (ou autre, il s'en fout)
- Gateway(machine distante) : 10.0.2.2
- IP de commande de slirp : 10.0.2.0 (! une adresse en 0, beware of the netmask !)
- IP spéciale : 10.0.2.1
- + route directe vers l'ip du host
Et ppd configure le tout pas proprement donc il faut supprimer l'ip qu'il a ajouté. Malheureusement slirp non plus n'est pas très doué en configuration réseau et utilise l'adresse 10.0.2.0 ce qui fait que soit vous utilisez un /16 soit vous vous débrouillez pour que 10.0.2.0 soit correctement routée soit vous n'accédez jamais à l'interface de slirp à distance.
Choisissons le premier cas, donc pour activer le routage coté client configurez comme indiqué, en live cela donne :
$ ip addr del 10.0.2.15 dev ppp0 $ ip addr add 10.0.0.0/16 dev ppp0 $ ip route add default via 10.0.2.2 dev ppp0 # tout ce que vous voulez tout router par là
Et oualà !
Forwarding
Slirp est configurable dynamiquement, ce qui veut dire qu'un telnet 10.0.2.0 permet d'accéder à une interface d'admin de slirp.
Les commandes disponibles sont les mêmes que celle qu'on peut mettre dans le fichier de configuration. L'une de ces commandes est redir qui permet de faire des redirections qu'on appellerait port forwarding sur un routeur NAT.
redir [once|time] [udp|tcp] PORT [to] [ADDRESS:]LPORT
Exemple pour permettre l'accès au port ssh local depuis l'extérieur sur le port 2222 :
$ telnet 10.0.2.0 redir 2222 22 quit
Mais encore
Slirp a bien d'autres usages. Au départ slirp a été inventé pour faire du réseau sur un modem.
Mais il est aussi intégré à certains autre outils comme :
- uml : il est possible de définir une interface réseau uml comme étant une interface slirp ce qui vous permet d'avoir une machine virtuelle uml disponible directement sur le réseau local à travers un NAT
- vde : il est possible de définir un lien slirp pour vde ce qui permet tout comme pour uml de mettre en place une certaine forme de NAT derrière un switch virtuel (en général pour un ensemble de vm) sans avoir besoin d'être root
- colinux : colinux intègre aussi slirp pour la même raison