Dernière mise à jour : 24/06/2004
Après avoir expliqué comment utiliser FreeSWAN/IPSec pour faire un VPN entre deux réseaux (et connecter des clients Windows), nous allons voir dans cet article comment utiliser http://openvpn.sourceforge.net/ qui vous permet de relier deux passerelles Linux (mais aussi beaucoup d'autres plateformes, consultez le site pour plus d'infos). Je me limiterais ici à la connexion de deux réseaux dont les passerelles sont assurées par des serveurs Linux tournant sous Debian stable (woody). Pour des raisons de sécurité, j'ai préféré recompiler un kernel maison tournant sous GRSec.
La Debian Woody était mon choix car ne nécessitant pas de mises à jour particulières si ce n'est pour la sécurité, mais le guide peut facilement s'appliquer à tout autre Linux. J'ai trouvé un site qui est maintenu par un Allemand fort sympathique fournissant des paquets pour OpenVPN, vous pouvez pour ceci consulter : http://cmeerw.org/debian/. Il vous est donc possible d'ajouter les bonnes lignes dans votre /etc/apt/sources.list comme ceci :
-
deb http://cmeerw.org/files/debian woody openvpn
deb-src http://cmeerw.org/files/debian woody openvpn
L'installation d'OpenVPN n'est pas longue. C'est sa configuration qui prends du temps. Assurez-vous de bien sécuriser votre serveur et de ne tourner que les services nécessaires. Au niveau du kernel, il vous faudra le périphérique /dev/tun et /dev/tap, assurez-vous de l'avoir compilé en support. Dans notre exemple nous allons prendre deux réseaux : 192.168.1.0 - 255.255.255.0 et 172.16.1.0 - 255.255.255.0 étant respectivement le réseau 1 et le réseau 2. Imaginons à présent que vous passiez pas une ligne ADSL avec un IP fixe. Disons que l'IP fixe du réseau 1 est 193.145.1.10 (IP fictive) et que celle du réseau 2 est 194.133.10.128. Il vous faut ensuite créer une clé partagée, pour se faire tapez : openvpn --genkey --secret static.key et copiez cette clé dans /etc/openvpn/certificates/ (il vous faudra créer le répertoire, et changer les permissions).
Voici le fichier de configuration du réseau 1, que vous devez placer dans /etc/openvpn.conf. Quelques explications s'imposent. On définit d'abord l'adresse locale et distante, puis les adresses IP du lien VPN entre les deux passerelles. On définit ensuite deux scripts, un de démarrage et un d'arrêt du VPN, ils serviront à paramétrer des routes pour que les deux réseaux parlent entre eux. Le port standard d'openvpn est le 5000 mais je conseille de changer ceci. Les deux lignes suivantes sont des fixes pour du VPN par lien sans fil, les utilisateurs de cartes réseau standard préfèreront un tun-mtu 1500 qui est standard. Le mssfix permet de régler des problème de gros paquets transitant par le lien. Enfin la clé est ici partagée entre les deux serveurs.
-
dev tun
local 193.145.1.10
remote 194.133.10.128
ifconfig 10.0.0.1 10.0.0.2
up /usr/local/sbin/office.up
down /usr/local/sbin/office.down
port 6666
user nobody
group nogroup
tun-mtu 1200
mssfix 1400
verb 2
ping 15
secret /etc/openvpn/certificates/vpn.key
Pour faire marcher correctement le serveur, il vous faudra également changer des règles de route et d'accès par le biais d'iptables, voici le fichier que vous pouvez recopier dans /etc/init.d/firewall :
-
#!/bin/bash
# adresse du reseau interne
PRIVATE=192.168.1.0/24
LOOP=127.0.0.1
iptables -P OUTPUT DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -F
iptables -P OUTPUT ACCEPT
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
# bloque l'utilisation de l'interface locale
iptables -A INPUT -i eth0 -s $LOOP -j DROP
iptables -A FORWARD -i eth0 -s $LOOP -j DROP
iptables -A INPUT -i eth0 -d $LOOP -j DROP
iptables -A FORWARD -i eth0 -d $LOOP -j DROP
# bloque le traffic spoofed de l'internet
iptables -A FORWARD -i eth0 -s 192.168.0.0/16 -j DROP
iptables -A FORWARD -i eth0 -s 172.16.0.0/12 -j DROP
iptables -A FORWARD -i eth0 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP
# bloque le traffic windows vers l'internet
iptables -A FORWARD -p tcp --sport 137:139 -o eth0 -j DROP
iptables -A FORWARD -p udp --sport 137:139 -o eth0 -j DROP
iptables -A OUTPUT -p tcp --sport 137:139 -o eth0 -j DROP
iptables -A OUTPUT -p udp --sport 137:139 -o eth0 -j DROP
# verifie la validite des paquets forwardes
iptables -A FORWARD -s ! $PRIVATE -i eth0 -j DROP
# autorise le loopback local
iptables -A INPUT -s $LOOP -j ACCEPT
iptables -A INPUT -d $LOOP -j ACCEPT
# autorise les pings entrants (optionnel)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# autorise ssh et http (optionnel)
iptables -A INPUT -p tcp --dport http -j ACCEPT
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
# autorise le port 6666 (standard 5000) pour le vpn
iptables -A INPUT -p udp --dport 6666 -j ACCEPT
# autorise tun et tap
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A INPUT -i tap+ -j ACCEPT
iptables -A FORWARD -i tap+ -j ACCEPT
# autorise les paquets prives
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -j ACCEPT
# traque l'etat des connexions
iptables -A OUTPUT -m state --state NEW -o eth0 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state NEW -o eth0 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# masque les connexions
iptables -t nat -A POSTROUTING -s $PRIVATE -o eth0 -j MASQUERADE
La dernière étape pour faire fonctionner le VPN sur la machine 1 est de renseigner la route du réseau distant, il vous suffit alors de créer : /usr/local/sbin/office.up et d'y rentrer ceci :
-
#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
route add -net 172.16.1.0 netmask 255.255.255.0 dev tun0
Il faut bien sûr créer un fichier /usr/local/sbin/office.down tel que je l'ai documenté dans le fichier de configuration. Ce fichier contient les commandes d'extinction de VPN.
-
#!/bin/bash
killall -TERM openvpn
echo 0 > /proc/sys/net/ipv4/ip_forward
Il faut ensuite s'occuper de la configuration de la machine distante (réseau 2). Commencez par créer le fichier /etc/openvpn/openvpn.conf et mettez les lignes suivantes :
-
dev tun
local 194.133.10.128
remote 193.145.1.10
ifconfig 10.0.0.2 10.0.0.1
up /usr/local/sbin/office.up
down /usr/local/sbin/office.down
port 6666
user nobody
group nogroup
tun-mtu 1200
mssfix 1400
verb 2
ping 15
secret /etc/openvpn/certificates/vpn.key
Il faut ensuite Ă©diter le fichier /etc/init.d/firewall. Recopiez l'exemple ci-dessus et changez juste la ligne : PRIVATE=192.168.1.0/24 par PRIVATE=172.16.1.0/24.
Comme pour la passerelle VPN du réseau 1, il faut renseigner la route du réseau distant, il vous suffit alors de créer : /usr/local/sbin/office.up et d'y rentrer ceci :
-
#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
route add -net 192.168.1.0 netmask 255.255.255.0 dev tun0
Il faut bien sûr créer un fichier /usr/local/sbin/office.down tel que je l'ai documenté dans le fichier de configuration. Ce fichier contient les commandes d'extinction de VPN.
-
#!/bin/bash
killall -TERM openvpn
echo 0 > /proc/sys/net/ipv4/ip_forward
Il ne vous reste alors qu'à lier le script de démarrage du firewall comme ceci (sous Debian) : ln -s /etc/init.d/firewall.vpn /etc/rc2.d/S99firewall.vpn sur les deux machines afin qu'il démarre automatiquement. Et à démarrer OpenVPN sur les deux machines, comme ceci (la première fois car ensuite cela sera automatique) : /etc/init.d/openvpn start et vous devriez voir quelque chose dans ces eaux là :
-
Jun 24 14:56:04 isis openvpn[4392]: OpenVPN 2.0_beta2 i386-pc-linux-gnu [SSL] [LZO] [PTHREAD] built on May 31 2004
Jun 24 14:56:04 isis openvpn[4392]: Static Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
Jun 24 14:56:04 isis openvpn[4392]: Static Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Jun 24 14:56:04 isis openvpn[4392]: Static Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
Jun 24 14:56:04 isis openvpn[4392]: Static Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Jun 24 14:56:04 isis openvpn[4392]: WARNING: normally if you use --mssfix and/or --fragment, you should also set --tun-mtu 1500 (currently it is 1200)
Jun 24 14:56:04 isis openvpn[4392]: TUN/TAP device tun0 opened
Jun 24 14:56:04 isis openvpn[4392]: /sbin/ifconfig tun0 10.0.0.1 pointopoint 10.0.0.2 mtu 1200
Jun 24 14:56:04 isis openvpn[4392]: /usr/local/sbin/office.up tun0 1200 1244 10.0.0.1 10.0.0.2 init
Jun 24 14:56:04 isis openvpn[4392]: Data Channel MTU parms [ L:1244 D:1244 EF:44 EB:0 ET:0 EL:0]
Jun 24 14:56:04 isis openvpn[4392]: Local Options hash (VER=V3): '9a5fc977'
Jun 24 14:56:04 isis openvpn[4392]: Expected Remote Options hash (VER=V3): '6cbea63b'
Jun 24 14:56:04 isis openvpn[4397]: GID set to nogroup
Jun 24 14:56:04 isis openvpn[4397]: UID set to nobody
Jun 24 14:56:04 isis openvpn[4397]: UDPv4 link local (bound): 193.145.1.10:6666
Jun 24 14:56:04 isis openvpn[4397]: UDPv4 link remote: 194.133.10.128:6666
Jun 24 14:56:04 isis openvpn[4397]: Peer Connection Initiated with 194.133.10.128:6666
Une petite note me semble nécessaire pour ceux gérant du cisco en routeurs et switches. Dans ce type de configurations, il sera nécessaire d'ajouter les routes ip route 10.0.0.1 255.255.255.0 10.0.0.2 ainsi que ip route 10.0.0.2 255.255.255.0 193.145.1.10 afin que les routes entre les réseau se fassent correctement. Le second avertissement concerne le mtu-fix qui est nécessaire si vous avez un serveur de mail de l'autre coté du VPN afin que le protocole de découverte marche.
Voilà qui termine cet article sur OpenVPN, cette procédure vous permet de mettre en place de façon simple et rapide un VPN opensource entre deux passerelles. N'hésitez pas à consulter le site officiel si vous avez des questions. Cet article est entièrement tiré de leur documentation d'installation, leurs HOWTO et le FAQ.