Tunnel L2TP

April 30, 2014

J'utilise assez couramment OpenVPN afin de contourner le filtrage de certains pare feu, ou pour changer d'adresse IP, particulièrement dans le cas de serveurs de jeux un peu tatillon lors des lans, qui refusent plus de X connexions depuis la même adresse IP.

En lisant le man de la commande ip, je suis tombé sur un passage sur l2tp, une autre façon de faire du VPN. Pour ceux qui voudraient la documentation technique, je vous inviter à faire un petit man ip-l2tp. Ici, nous verrons la partie pratique.

Tout d'abord il faut savoir que l'implémentation de L2TP dans la commande ip pose des contraintes particulières. En effet, le tunnel est "static" ou "unmanaged". Il n'y a pas de protocole de controle L2TP, pas de daemon, tous les paramètres doivent être entrés à la main. Enfin, on ne peut faire passer que des frames ethernet.

L2TP et Debian

J'ai actuellement deux versions de Debian en serveur. Une Jessie (Testing) et une Wheezy. J'ai aussi une Fedora 20 en client. La Wheezy ne semble pas vouloir l2tp de base. Notons aussi que la doc ip-l2tp est absente. Au moment de lancer la commande, j'ai un magnifique :

RTNETLINK answers: No such file or directory
Error talking to the kernel

Quant à ma Fedora, tout semblait aller bien, jusqu'à l'ajout d'une session dans mon tunnel, où j'ai eu cette erreur :

RTNETLINK answers: Protocol not supported

Dans les deux cas, la solution est simple, quoique pas facile à trouver : il faut charger le bon module noyau :

sudo modprobe l2tp_eth

Je n'ai pas fais les tests jusqu'au bout avec Jessie, je suppose que ça marche. A vous d'adapter !

Je vous met le lien du thread OpenStack au cas où l2tpV3 on Ubuntu Precise Bref, nous voilà prêt à en découdre avec L2TP !

Commençons par créer un tunnel

On va d'abord établir la liaison entre les deux machines avant d'attaquer autre chose.

Le PC-A

ip l2tp add tunnel tunnel_id 1337 peer_tunnel_id 1338 \
encap udp local 192.168.1.12 remote 192.168.1.38 \
udp_sport 5000 udp_dport 5001

On ajoute un tunnel avec pour id 1337 en local et 1338 sur l'ordinateur distant.
On encapsule les données en UDP (possibilité d'utiliser l'IP si pas de NAT ou de passerelle).
On donne notre adresse IP locale et l'adresse IP du serveur distant.
On précise les ports UDP à utiliser (sport = local et dport = distant)

Le PC-B

On tape la commande en "miroir" du coté client (on inverse les id, les adresses ip et les ports) :

ip l2tp add tunnel tunnel_id 1338 peer_tunnel_id 1337 encap udp local 192.168.1.38 remote 192.168.1.12 udp_sport 5001 udp_dport 5000

Des commandes utiles

Vous pouvez aussi supprimer et voir les tunnels existants :

ip l2tp del tunnel tunnel_id 1337
ip l2tp show tunnel

Attention, vous devez avoir supprimé toutes les sessions du tunnel avant de pouvoir le supprimer.

Ajoutons une session dans le tunnel

Le PC-A

ip l2tp add session tunnel_id 1337 session_id 337 peer_session_id 338

On ajoute une session dans le tunnel 1337 Son identifiant en local est 337 et sur l'ordinateur distant 338

Enfin pour activer l'interface (recommandé dans le man) :

ip link set l2tpeth0 up mtu 1488

Le PC-B

Comme d'habitude, on fait ça en miroir :

ip l2tp add session tunnel_id 1338 peer_session_id 337 session_id 338

Idem, pour activer l'interface :

ip link set l2tpeth0 up mtu 1488

Des commandes utiles

Plus ou moins le même schéma que tout à l'heure, avec quelques ajouts :

ip l2tp del session tunnel_id 1337 session_id 337
ip l2tp show session
ip addr

La dernière commande vous permet de voir qu'une interface l2tpeth0 a été ajoutée à vos interfaces.

Configurons l'interface en IP

Le PC-A

ip addr add 10.42.1.1 peer 10.42.1.2 dev l2tpeth0

On assigne l'adresse IP 10.42.1.1 a l'interface l2tpeth0 et on informe que l'interface distante a pour adresse 10.42.1.2.

Le PC-B

ip addr add 10.42.1.2 peer 10.42.1.1 dev l2tpeth0

La même chose en miroir (pour changer).

Les tests

Tout d'abord vérifiez que les interfaces soient bien configurées et UP :

ip addr

Un petit coup d'oeil aux routes ne fait pas de mal :

ip route

On peut se lancer dans le grand bain en pingant l'ordinateur distant. Depuis PC-A, on fait :

ping 10.42.1.2

Si le ping passe, c'est que vous avez réussi ! Sinon, n'hésitez pas à utiliser tout l'arsenal d'outils à votre disposition : wireshark, etc.

Pour moi, ça a marché, à vous de jouer !

Problèmes

  • Il semble nécessaire de créer un tunnel par couple de PC avec cette implémentation de L2TP.
  • Si vous êtes derrière un NAT, vous devez pouvoir changer sa configuration des DEUX cotés.

Explorons !

Il reste encore bien des possibilités. Ainsi, nous verrons prochainement comment bridger les interfaces en L2TP pour faire passer autre chose que de l'IP ainsi que quelques rudiments de routage avec ip route