OpenVPN & Bridge sur La Fonera (OpenWrt Kamikaze)

Fonera

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 :

Pour reprendre les hypothèses :

LAN 1 :

LAN 2 :

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 :

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 :

LAN 2 :

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.org
config 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.org
START=70
BIN=openvpn
DEFAULT=/etc/default/$BIN
RUN_D=/var/run
PID_F=$RUN_D/$BIN.pid
start() {
    [ -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

Commentaires

Je commande une nouvelle fonera !

Hé hé !

Est ce que ça marche sous WinDaube ?

… 😉

tin ca rigole plus ici
Hé Hé

Nickel ma fonera est flashé, et openvpn installé
Attente de la petite soeur !!!

Bonjour,
J’essaie d’utiliser wput avec l’option tls, sans succes malheureusement. Quelqu’un a t-il une expérinece sur ce sujet ?
Merci d’avance
Ksin

Laisser un commentaire

(requis)

(requis)