OpenVPN & Bridge sur La Fonera (OpenWrt Kamikaze)

Ma Fonera, précédemment installée sous Kamikaze (cf ce billet) est prête à remplir une multitude de fonctions…(Chouette !). La première mission que je vais lui confier est la gestion d’un tunnel VPN pour l’interconnexion via Internet de deux sites distants.
Le premier test va consister à configurer des routeurs VPN, sur des réseaux disposant de plans d’adressage IP distincts. La communication entre les réseaux se fera par routage à travers le tunnel.
Dans un deuxième temps, je vais m’intéresser à la création d’un pont (bridge) sur ce VPN, pour connecter deux réseaux physiques qui cette fois, partagerons le même plan d’adressage. Le pont, comme un switch, agit en couche 2 du modèle OSI (couche liaison) et permet ainsi d’intervenir avant la couche 3 (couche réseau) et donc de ne pas se préoccuper du routage IP.
1 – Routeurs VPN
Prérequis :
- 2 réseaux accédant à Internet et ayant des plans d’adressage distincts,
- 2 systèmes Linux ( Fonera sous OpenWrt dans notre cas) sur lesquels OpenVPN va être installé et configuré,
- La main sur les passerelles Internet (routeur/modem ADSL, Firewall, etc…) de chaque réseau afin de pouvoir créer les redirections de ports et règles de firewall qui s’imposent.
Pour reprendre les hypothèses :
LAN 1 :
- Plan d’adressage en : 192.168.100.0 / 255.255.255.0
- Un passerelle internet (GW1)
- IP privée : 192.168.100.254
- IP publique notée : XXX.XXX.XXX.XXX
- Un Linux embarqué (OWRT1) : 192.168.100.253
- OWRT1 sera configuré en client VPN.
LAN 2 :
- Plan d’adressage en : 192.168.200.0 / 255.255.255.0
- Un passerelle internet (GW2)
- IP privée : 192.168.200.254
- IP publique notée : XXX.XXX.XXX.XXX
- Un Linux embarqué (OWRT2) : 192.168.200.253
- OWRT2 sera configuré en serveur VPN
Installation d’OpenVPN
L’installation d’OpenVPN sur chaque Fonera ne devrait pas poser de difficulté, OpenVPN étant directement disponible en paquet.
# ipkg update
Downloading http://downloads.openwrt.org/kamikaze/7.09/atheros-2.6/packages/Packages Updated list of available packages in /usr/lib/ipkg/lists/release Downloading http://downloads.openwrt.org/kamikaze/packages/mips/Packages Updated list of available packages in /usr/lib/ipkg/lists/packages Done.# ipkg install openvpn
Installing openvpn (2.0.9-2) to root... ... Configuring kmod-tun Configuring liblzo Configuring libopenssl Configuring openvpn Configuring zlib Done.# mkdir /etc/openvpn
Dans un premier temps, je vais utiliser un clef statique partagée… Il est biensûr possible d’utiliser une authentification plus « musclée », en se basant sur des certificats X509 et un échange de clefs Diffie-Hellman
Je vous conseille pour cela cet excellent tutorial du site Coagul.
# cd /etc/openvpn
# openvpn –genkey –secret secret.key
Un coup d’oeil sur ma clef toute neuve…
# cat secret.key
# # 2048 bit OpenVPN static key # -----BEGIN OpenVPN Static key V1----- 54ec00bf8145367f0a4831f012b4e791 6127634ba62797a66d652585e7db92b3 317388eeb4d3bd0ea740b9df23724613 3e718366ee3e8ab0bbbe1dda78dfea52 999af131a77d14170447f7d5ae574adc eeda4e2760bfd42ec07d437f6e1593cc c2d2f26a466bccc23643f8d4376b39b9 f5acad7496874337a40398fbc9696557 5c3b79ce8f1aefd761111f9bd38c0c1a c63efb8d930962fecf1a8cb9fbe8e6e5 1da8152004965a2cbf1d5f677412fce1 feb70abb91292d98e53fd121982ea21d 2fac231cdfd7a5a3b0225407c9f38a98 c7eb66b7d200b63ed3449abbba5d33dd 43279c14626eec6bc5e45da20b50690e de8444e61b67399239aaa6764e558c4b -----END OpenVPN Static key V1-----
Wouaw ! « C’est-y pas beau ! »… Il faut bien entendu copier ce fichier sur l’autre Fonera, pour que la clef soit identique sur les deux routeurs VPN et faciliter ainsi les communications chiffrées ; )
Configuration du serveur
Dans mon cas, c’est OWRT2 qui va faire office de serveur. Une petite intervention est indispensable sur la passerelle du LAN2 (GW2) pour rediriger le port utilisé par OpenVPN (1194 en UDP par défaut) sur OWRT2. La redirection du port SSH (22 en TCP) n’est pas une mauvaise idée, au moins le temps de la configuration, pour pouvoir prendre la main à distance ou copier des fichier (comme secret.key par exemple ; ).
« Cloé ! Peux tu ouvrir un socket sur les Firewall pour connecter Jack aux images satellite ? »
Toujours dans mon cas, GW2 est une machine Linux servant principalement de Firewall. Une ou deux petites règles netfilter vont permettre cette redirection de port :
GW2:~# iptables -t nat -A PREROUTING -p udp -d YYY.YYY.YYY.YYY –dport 1194 -j DNAT –to 192.168.200.253:1194
GW2:~# iptables -t filter -A FORWARD -p udp -d 192.168.200.253 –dport 1194 -j ACCEPT
Sur OWRT2, je crée une configuration basique pour mon serveur. A minima :
owrt2:~# vi /etc/openvpn/serveur.conf
dev tun ifconfig 10.8.0.200 10.8.0.100 secret /etc/openvpn/secret.key route 192.168.100.0/24
En clair :
- dev tun : utiliser une interface de type tun,
- ifconfig 10.8.0.200 10.8.0.100 : créer une liaison point à point avec comme adresse locale 10.8.0.200 et 10.8.0.100 pour l’adresse distante,
- secret /etc/openvpn/secret.key : secret.key est ma clef de cryptage,
- route 192.168.100.0/24 : Créer automatiquement une route vers le réseau 192.168.100.0 / 255.255.255.0.
Configuration du client
Côté « Firewall » client, pas de filtre en sortie, je devrais être bon… La configuration du client se fait à l’identique. Les adresses IP de la liaison point à point et les routes sont ajustés. Une ligne « remote » est nécessaire pour spécifier l’adresse du serveur distant.
owrt1:~# vi /etc/openvpn/client.conf
dev tun remote YYY.YYY.YYY.YYY ifconfig 10.8.0.100 10.8.0.200 secret /etc/openvpn/secret.key route 192.168.200.0/24
OpenVPN dispose d’un bon nombre d’options permettant d’optimiser la connexion. Je vous renvoie vers le man ou la documentation abondante sur le net pour les découvrir.
Démarrage Manuel
C’est parti pour un petit coup de manivelle histoire de voir si la liaison monte.
Sur le serveur :
owrt2~# openvpn serveur.conf
Sur le client :
owrt1:~# openvpn client.conf
Tue Jan 4 01:03:40 2000 OpenVPN 2.0.9 mips-linux [SSL] [LZO] [EPOLL] built on Sep 30 2007 ... Tue Jan 4 01:03:40 2000 /sbin/ifconfig tun0 10.8.0.100 pointopoint 10.8.0.200 mtu 1500 Tue Jan 4 01:03:41 2000 UDPv4 link local (bound): [undef]:1194 Tue Jan 4 01:03:41 2000 UDPv4 link remote: YYY.YYY.YYY.YYY:1194 Tue Jan 4 01:03:51 2000 Peer Connection Initiated with YYY.YYY.YYY.YYY:1194 Tue Jan 4 01:03:52 2000 Initialization Sequence Completed
« Initialisation Sequence Completed » … Hum ! Ca n’a pas l’air trop mal ça !
Démarrage Automatique
Le fichier /etc/defaut/openvpn contient le nom du fichier de configuration à lancer par défaut pour le démarrage du vpn.
Sur le serveur :
CONFIG= »/etc/openvpn/serveur.conf »
OPTIONS= »–config $CONFIG »
Sur le client :
CONFIG= »/etc/openvpn/serveur.conf »
OPTIONS= »–config $CONFIG »
Pour démarrer Openvpn, il me suffit maintenant d’exécuter le script d’initialisation :
# /etc/init.d/openvpn start
Quelques vérifications d’usage :
owrt1:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:18:84:82:03:60 inet addr:192.168.100.253 Bcast:192.168.100.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:39776 errors:0 dropped:0 overruns:0 frame:0 TX packets:3078 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:4395176 (4.1 MiB) TX bytes:400461 (391.0 KiB) Interrupt:4 Base address:0x1000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:54 errors:0 dropped:0 overruns:0 frame:0 TX packets:54 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:5130 (5.0 KiB) TX bytes:5130 (5.0 KiB) tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-... inet addr:10.8.0.100 P-t-P:10.8.0.200 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
owrt1:~# route
192.168.100.50 10.8.0.100 255.255.255.255 UGH 0 0 0 tun0 10.8.0.100 * 255.255.255.255 UH 0 0 0 tun0 192.168.200.0 * 255.255.255.0 U 0 0 0 eth0 default 192.168.200.254 0.0.0.0 UG 0
Une interface tun0 a bien été créée et la table de routage est bonne… Je n’ai plus qu’à balancer frénétiquement des pings à tout va pour être bien sûr que tout communique bien.
Remarque : La commande « logread » est bien utile pour afficher les logs sous OpenWRT.
Pour que mon Openvpn soit lancé automatiquement au démarrage du système, j’ai besoin de créer le lien symbolique qui va bien dans /etc/rc.d
# ln -s /etc/init.d/openvpn /etc/rc.d/S50openvpn
Routage
Pour que les machines des deux réseaux puissent se causer, je dois leur indiquer qu’elles doivent passer par la Fonera pour atteindre l’autre réseau.
Sur lan 1 :
# route add -net 192.168.200.0/24 gw 192.168.100.253
Sur lan 2 :
# route add -net 192.168.100.0/24 gw 192.168.200.253
Une solution alternative consiste à paramétrer ces machines pour qu’elles utilisent la Fonera comme passerelle par défaut.
2 – Bridge
Je vais à présent m’attacher à interconnecter les deux réseaux au niveau de la couche liaison et ainsi permettre à tous les protocoles situés au dessus d’Ethernet (IPv4, IPv6, IPX, AppleTalk, etc…) de traverser le VPN. Tous les protocoles, y compris leurs paquets de diffusion et donc rendre fonctionnelles des applications telles que le partage de fichier Windows par NetBIOS ou l’utilisation du voisinage réseau.
Pour que ceci soit réalisable, les hypothèses de départ sont légèrement différentes :
Pour pouvoir utiliser le protocole IP, LAN1 et LAN2 doivent partager la même plage d’adressage.
LAN 1 :
- Plan d’adressage en : 192.168.200.0 / 255.255.255.0
- Un passerelle internet (GW1)
- IP privée : 192.168.200.154
- IP publique notée : XXX.XXX.XXX.XXX
- Un Linux embarqué (OWRT1) : 192.168.200.153
- OWRT1 restera configuré en client VPN.
LAN 2 :
- Plan d’adressage en : 192.168.200.0 / 255.255.255.0
- Un passerelle internet (GW2)
- IP privée : 192.168.200.254
- IP publique notée : XXX.XXX.XXX.XXX
- Un Linux embarqué (OWRT2) : 192.168.200.253
- OWRT2 sera restera configuré en serveur VPN
Configuration du Bridge
La première chose à faire est de vérifier que l’interface ethernet de chaque fonera est bien configurée en bridge.
Le fichier de configuration du réseau (/etc/config/network) va ressembler à ceci :
Copyright (C) 2006 OpenWrt.orgconfig interface loopback option ifname lo option proto static option ipaddr 127.0.0.1 option netmask 255.0.0.0 config interface lan option ifname eth0 option type bridge option proto static option ipaddr 192.168.200.153 option netmask 255.255.255.0 option gateway 192.168.200.154
Les interfaces virtuelles de type Tun, utilisées dans la précédente configuration interviennent au niveau IP, trop haut pour le bridge. Je vais préférer l’utilisation d’interfaces de type Tap qui agissent au niveau ethernet.
Pour créer ces interfaces et les « bridger » avec mon interface lan, je vais créer un petit script qui sera lancé avant OpenVPN. Je me suis pour cela largement inspiré de la documentation officielle d’OpenVPN.
/etc/openvpn/bridge.sh
#!/bin/sh
#/etc/openvpn/bridge.sh
br="br-lan"
tap="tap0"
case "$1" in
start)
# Creation de l'interface tap
openvpn --mktun --dev $tap
# Ajout de l'if tap au Bridge
brctl addif $br $tap
# Configuration et activation de l'if tap
ifconfig $tap 0.0.0.0 promisc up
;;
stop)
# Desactivation de l'interface tap
ifconfig $tap 0.0.0.0 down
# Suppression de l'if tap du bridge
brctl delif $br $tap
# Destruction de l'if tap
openvpn --rmtun --dev $tap
;;
*)
echo "$0 {start|stop}"
;;
esac
Ce script doit être présent sur chacune des Fonera. Je fais en sorte qu’il se lance automatiquement avant OpenVPN en modifiant le fichier d’init de ce dernier :
/etc/init.d/openvpn
#!/bin/sh /etc/rc.common # Copyright (C) 2007 OpenWrt.orgSTART=70 BIN=openvpn DEFAULT=/etc/default/$BIN RUN_D=/var/run PID_F=$RUN_D/$BIN.pidstart() { [ -f $DEFAULT ] && . $DEFAULT mkdir -p $RUN_D /etc/openvpn/bridge.sh start $BIN --writepid $RUN_D/$BIN.pid --daemon $OPTIONS }stop() { [ -f $PID_F ] && kill $(cat $PID_F) /etc/openvpn/bridge.sh stop }
Configuration d’OpenVPN
Cette configuration ne représente aucune difficulté :
Serveur :
/etc/openvpn/serveur.conf
dev tap0
secret /etc/openvpn/secret.key
Client :
/etc/openvpn/client.conf
dev tap0
remote YYY.YYY.YYY.YYY
secret /etc/openvpn/secret.key
Un redémarrage de part et d’autre d’OpenVPN et le tour est joué. Les machines communiquent comme si elles étaient sur le même lan… La notion de débit mis à part biensûr…
Optimisation de la connexion
La configuration ci-dessus est très basique et bon nombre de variables sont laissées par défaut. Il est possible d’optimiser la lisaison, en particulier en matière de gestion des déconnexions.
Vous trouverez ci-dessous un exemple de configuration légèrement plus avancé :
Serveur :
/etc/openvpn/serveur.conf
port 1194
proto udp
dev tap0
keepalive 10 120
status /etc/openvpn/status.log
secret /etc/openvpn/secret.key
Client :
/etc/openvpn/client.conf
proto udp
dev tap0
remote YYY.YYY.YYY.YYY
resolv-retry infinite
nobind
mute-replay-warnings
secret /etc/openvpn/secret.key
float
Laissez votre message après le bip...Biiiiip





Je commande une nouvelle fonera !