jeudi 2 juin 2011

FreeBSD 8.2 / OpenVPN 2.2 / Gateway Routing (Français/French)

Cela fait quelques années que je connais un peu le principe du VPN puisque la plupart des entreprises pour lesquelles j'ai pu travailler en possédaient un.
En fonction du système d'exploitation, il existe une ou plusieurs méthodes pour réaliser un VPN.

Qu'est ce qu'un VPN ?
V.P.N. <=> Virtual Private Network

A quoi sert un VPN ?
Ça sert, entre autre, à créer un réseau ethernet. L'avantage c'est qu'il peut être privé : seules certaines personnes peuvent s'y connecter, et il peut être crypté. Il est virtuel, contrairement à un réseau ethernet physique, il ne possède pas directement une carte réseau avec une MAC Address.

Pourquoi se servir d'un VPN ?
Cela peut être très pratique pour mettre en relation divers machines sur un réseau ethernet ou internet de manière sécurisée.
Un autre avantage, c'est qu'il peut permettre de créer une sorte de tunnel complet et sécurisé vers Internet au travers d'un réseau d'entreprise.
C'est ce mode ci qui nous intéresse ici.

PRECAUTION :
Le mode que je mets ici en place permet de router entièrement un traffic depuis une machine sur un sous-réseau vers un VPN.
Les désavantages sont que l'on n'a plus accès au sous-réseau de base. Donc plus accès aux autres machines qui se trouve sur ce sous-réseau.
EDIT.: Il semblerait qu'un accès par adresse IP soit toujours possible. Seule la résolution des noms est remplacée par celle du VPN.

Le matériel utilisé, système d'exploitation et outils VPN pour le Serveur :
  • un serveur sur internet que je loue (Dedibox)
  • FreeBSD 8.2
  • ipfilter / ipnat
  • OpenVPN 2.2
Mon serveur est donc directement connecté à Internet.

Le matériel utilisé, OS et outils VPN pour le Client :
  • un Macbook Pro sur un sous réseau connecté directement ou indirectement à Internet
  • Mac OS X 10.6.7
  • TunnelBlick 3.1.7, qui utilise OpenVPN 2.1.4
Les réseaux :
  • Internet, directement accessible depuis ma Dedibox
    • Supposons ici que l'IP publique du serveur est 1.2.3.4, et qu'un serveur DNS est accessible depuis ce serveur est à pour adresse IP 1.2.5.6
  • un sous-réseau 10.0.0.0/24 en WiFi, auquel mon MBP accède
  • un sous-réseau 192.168.0.0/24 filaire (cable ethernet standard) auquel le routeur WiFi accède
  • une connexion Internet accessible depuis 192.168.0.0/24
Le VPN :
  • Un réseau 172.30.0.0/24 (255.255.255.0)

  1. Côté Serveur :
    1. Installation de OpenVPN sur FreeBSD 8.2
    2. Création de votre Certificat d'Autorité (Certificate Authorithy, CA)
    3. Configuration de OpenVPN
    4. Gateway
    5. NAT
    6. Démarrage des services
1. Côté Serveur
1.1 Installation de OpenVPN sur FreeBSD 8.2

# cd /usr/ports/security/openvpn
# make install clean
# mkdir /usr/local/etc/openvpn

1.2 Création de votre Certificat d'Autorité (Certificate Authorithy, CA)

J'ai principalement suivi la page suivante :
Si l'on suit l'ensemble des points, à la fin on se retrouve avec les certificats pour le serveur et pour un client. La partie "client" peut être faite plusieurs fois s'il l'on désire plusieurs "client" sur le VPN.
Une fois qu'on a créé les certificats et clés, il suffit de faire :

# cp -r ~/easy-rsa/2.0/keys /usr/local/etc/openvpn/

Pour ajouter de la sécurité, on crée un clé grâce à OpenVPN qui sera utilisé côté serveur et côté client.

# openvpn --genkey --secret /usr/local/etc/openvpn/keys/ta.key

1.3 Configuration de OpenVPN

# vim /usr/local/etc/openvpn/server.conf
daemon
port 1194
proto udp
dev tun

ca /usr/local/etc/openvpn/keys/ca.crt
cert /usr/local/etc/openvpn/keys/server.crt
key /usr/local/etc/openvpn/keys/server.key
dh /usr/local/etc/openvpn/keys/dh1024.pem

server 172.30.0.0 255.255.255.0
push "route 1.2.3.0 255.255.255.0"
push "dhcp-option DNS 1.2.5.6"
push "redirect-gateway def1"

client-to-client
keepalive 10 120
duplicate-cn

user nobody
group nobody

persist-key
persist-tun
tls-auth /usr/local/etc/openvpn/keys/ta.key 0

status openvpn-status.log

comp-lzo
verb 4
puis ajouter à votre fichier /etc/rc.conf

openvpn_enable="YES"
openvpn_configfile="/usr/local/etc/openvpn/server.conf"


1.4 Gateway
Ajouter à votre fichier /etc/rc.conf
gateway_enable="YES"
1.5 NAT
pour router les paquets vers Internet

Créer un fichier /etc/ipnat.rules avec la règle suivante :
map xl0 172.30.0.0/24 -> 0/32
xl0 (ou autre) est l'interface réseau de votre carte réseau sur laquelle est configurée votre adresse IP publique de votre serveur.

Ajouter ensuite dans /etc/rc.conf
ipnat_enable="YES"
ipnat_rules="/etc/ipnat.rules"

1.6 Démarrage des services
Si tout est bien configuré, tout devrait se lancer comme un charme.

# # Gateway
# /etc/rc.d/routing restart
# # NAT
# /etc/rc.d/ipnat start
# # OpenVPN
# /usr/local/etc/rc.d/openvpn start

Normalement, ifconfig devrait montrer une interface tun0

tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
        options=80000<LINKSTATE>
        inet 172.30.0.1 --> 172.30.0.2 netmask 0xffffffff 
        nd6 options=3<PERFORMNUD,ACCEPT_RTADV>
        Opened by PID 1234
  1. hidden
  2. Côté client
    1. Récupérer les clés et certificats
    2. Installer TunnelBlick
    3. Configurer une connexion OpenVPN cliente
    4. Connexion au VPN
2. Côté client
2.1 Récupérer les clés et certificats

Dans la partie "1.2 Création de votre certificat d'autorité", nous avons créé d'une part le certificat et les clés pour la configuration du serveur, mais aussi les clés pour un client.
Dans la liste ci-dessous, en rouge sont les fichiers qui nous intéressent pour l'installation sur le poste client :

# cd /usr/local/etc/openvpn/keys/
# ls -1
01.pem
02.pem
ca.crt
ca.key
dh1024.pem
server.crt
server.csr
server.key
index.txt
index.txt.attr
index.txt.attr.old
index.txt.old
serial
serial.old
ta.key
client.crt
client.csr
client.key

Copier ces fichiers dans un répertoire "VPN" :

$ mkdir ~/VPN
$ su
Password:
# cd /usr/local/etc/openvpn/keys/
# cp ca.crt /home/YourUser/VPN/
# cp ta.key /home/YourUser/VPN/
# cp client.crt /home/YourUser/VPN/
# cp client.key /home/YourUser/VPN/
# exit
$ ls -m ~/VPN/
ca.crt, ta.key, client.crt, client.key

Puis depuis votre machine cliente (Mon MBP pour ma part), copier ce répertoire dans votre Home :

$ scp -r YourUser@YourServer.com:VPN/ .

"C'est tout, pour le moment ..."

2.2 Installer TunnelBlick

Grâce à un de mes collègues, j'ai découvert TunnelBlick qui est une interface graphique pour OpenVPN sur Mac OS X. Cette interface donne un contrôle assez simple de client et/ou de serveur OpenVPN.

Pendant l'installation, TunnelBlick vous demande si vous voulez créer une nouvelle connexion. Vous pouvez refuser, le prochain point reprend les indications d'une installation de connexion OpenVPN.

2.3 Configurer une connexion OpenVPN cliente

Dans une console sur votre machine cliente :

$ cd ~/VPN/
$ vim config.ovpn
client
dev tun
proto udp
remote YourServer.com 1194

resolv-retry infinite
nobind 
pull
persist-key
persist-tun

ns-cert-type server
tls-auth ta.key 1
ca ca.crt
cert client.crt
key client.key

comp-lzo
verb 1
$ cd ..
$ mv VPN VPN.tblk

Puis pour installer les informations dans TunnelBlick, il suffit d'ouvrir un Finder, et de double-cliquer sur le "répertoire"/"l'application" VPN(.tblk) dans votre répertoire utilisateur.

2.4 Connexion au VPN
Si vous n'avez pas configuré TunnelBlick (nul besoin), l'icone de TunnelBlick doit apparaitre à côté de l'icone SpotLight. Lorsque vous cliquez dessus, il devrait y avoir une ligne "Connect VPN", cliquez dessus.
Après quelques secondes, si tout va bien, vous devriez être connecté à votre VPN et avoir accès à Internet via celui-ci.

RAPPEL : vous ne devriez plus avoir accès à vos autres machines (ordinateurs, serveurs, imprimantes, etc.) sur votre réseau local. Heureusement, dés que vous déconnectez votre VPN vous retrouverez toutes vos connexions habituelles.