OpenVPN
Avant propos
Introduction
Un VPN (Virtual Private Network) est une méthode de transmission de données de façon sécurisée entre deux réseaux privés. On utilise le « tunneling » pour faire transiter les données. Il est sécurisé dans le sens où les données sont chiffrées durant le transfert et où seuls les utilisateurs authentifiés ont accès au données en circulation.
Lisez aussi page wikipédia à ce sujet.
OpenVPN est un logiciel open source et multi plate-formes utilisant le protocole SSLv3/TLSv1.
Partage de connexion
Un des usages courants des mécanismes de VPN est l'accès à un réseau distant, ou le partage de connexion.
Serveur
Afin de pouvoir partager sa connexion, offrir des accès à des pans de réseau etc., le serveur doit être configuré comme routeur.
#!/bin/sh #Activer le routage sysctl net.ipv4.conf.all.forwarding=1 sysctl net.ipv6.conf.all.forwarding=1 # Si vous fournissez aussi de l’IPv6 # Mettre net.ipv4.conf.all.forwarding et net.ipv6.conf.all.forwarding à 1 pour rendre la config permanente (i.e. qu’elle reste après un reboot). $EDITOR /etc/sysctl.conf # Créer 3 règles NAT (après avoir vider les règles déjà existantes) # On peut les lires ainsi: # Pour tout paquet qui arrive avec comme source (-s) 10.42.10X.0/24 # À destination (-d) de tout sauf (!) 10.42.10X.0/24 # Réécrire l'adresse de destination en utilisant l'IP publique (-j MASQUERADE) iptables -t nat -F iptables -t nat -A POSTROUTING -s 10.42.100.0/24 ! -d 10.42.100.0/24 -j MASQUERADE iptables -t nat -A POSTROUTING -s 10.42.101.0/24 ! -d 10.42.101.0/24 -j MASQUERADE iptables -t nat -A POSTROUTING -s 10.42.102.0/24 ! -d 10.42.102.0/24 -j MASQUERADE
Si jamais vous avez une adresse IP spéciale pour le VPN, il faut dire à votre serveur de router les paquets venant des clients du VPN vers la bonne IP.
iptables -t nat -I POSTROUTING -o $interface -j SNAT --to $adresse_IP_de_sortie # Commande générale iptables -t nat -I POSTROUTING -o eth0 -j SNAT --to 95.130.10.128
Client
Afin de pouvoir utiliser le serveur comme relai, le client doit savoir qu'il doit passer par lui. Pour cela on peut créer une entrée dans la table de routage. La syntaxe générale est:
ip route add $PREFIX $ROUTER
On peut par exemple utiliser:
ip route add 8.8.8.8/24 via 10.42.100.1
Si l'on souhaite que toutes les connexions passent par le VPN on pourra utiliser les paramètres de configuration suivant dans la fichier client:
redirect-gateway # ou redirect-gateway def1
La première remplacera la route par défaut par le VPN. Cela risque de poser des problèmes lorsque la connexion est coupée. Il est préférable d'utiliser la deuxième, qui crée deux routes plus spécifiques (/1) que la route par défaut, permettant ainsi de faire passer toutes les connexions par le VPN, mais de conserver une route par défaut en cas de coupure.
Installation
Si vous êtes sous GNU/Linux, il doit certainement être dans le dépôts de votre distribution favorite. Si vous n’êtes pas sous GNU/Linux, c’est le moment de faire le grand pas.
apt-get install openvpn # ou yum, pacman, emerge, etc.
Configuration 1 : clef partagée
openvpn --genkey --secret secret.key
Serveur
dev tun0 port 10000 proto tcp-server ifconfig 10.42.100.1 10.42.100.2 comp-lzo secret /etc/openvpn/openvpn-shared.key user nobody group nogroup keepalive 10 60 ping-timer-rem persist-tun persist-key log /var/log/openvpn-shared.log verb 3 #script-security 2 #up allow-routing.sh
Client
dev tun0 port 10000 proto tcp-client remote teta.breizh-entropy.org ifconfig 10.42.100.2 10.42.100.1 comp-lzo secret /etc/openvpn/openvpn-shared.key user nobody group nogroup keepalive 10 60 ping-timer-rem persist-tun persist-key log /var/log/openvpn-shared.log verb 3 #redirect-gateway def1
Configuration 2: 1 Serveur pour plusieurs clients; authentification par PKI
Serveur
cp /usr/share/doc/openvpn/examples/easy-rsa/2.0 /root/admin/easy-rsa/ cd /root/admin/easy-rsa/ nano vars source ./vars [./build-dh] ./pkitool --initca ./pkitool --server ./pkitool --server myserver ./pkitool client1 ./pkitool client2 ./pkitool client3 ./pkitool client4 ./pkitool client5
On obtient.
ls -1 keys [...] dh1024.pem Diffie hellman ca.crt Certificat CA ca.key Clef CA myserver.crt Certificat Server myserver.key Clef Serveur client1.crt Certificat client1 client1.key Clef client1 client2.crt Certificat client2 client2.key Clef client2 [...]
cat /etc/openvpn/openvpn-server1.conf
port 10001 proto tcp-server dev tap0 ca server1-ca/ca.crt cert server1-ca/myserver.crt key server1-ca/myserver.key dh server1-ca/dh1024.pem server 10.42.101.0 255.255.255.0 ifconfig-pool-persist ipp.txt keepalive 10 120 comp-lzo user nobody group nogroup persist-key persist-tun status /var/log/openvpn-server1-status.log log /var/log/openvpn-server1.log verb 3 script-security 2 up allow-routing.sh
Client
client dev tap0 proto tcp-client remote teta.breizh-entropy.org 10001 ;remote my-server-2 1194 resolv-retry infinite nobind user nobody group nogroup persist-key persist-tun ca server1-ca/ca.crt cert server1-ca/client1.crt key server1-ca/client1.key comp-lzo verb 3 mute 20 log /var/log/openvpn-server1.log
Configuration 3: 1 Serveur pour plusieurs clients; Authentification par login/mdp
Server
port 10002 proto tcp-server dev tap1 ca server1-ca/ca.crt cert server1-ca/myserver.crt key server1-ca/myserver.key dh server1-ca/dh1024.pem server 10.42.102.0 255.255.255.0 ifconfig-pool-persist ipp2.txt keepalive 10 120 comp-lzo user nobody group nogroup persist-key persist-tun status /var/log/openvpn-server2-status.log log /var/log/openvpn-server2.log verb 3 script-security 2 up allow-routing.sh plugin /usr/lib/openvpn/openvpn-auth-pam.so login client-cert-not-required
Client
client dev tap1 proto tcp-client remote teta.breizh-entropy.org 10002 ;remote my-server-2 1194 resolv-retry infinite nobind user nobody group nogroup persist-key persist-tun ca server1-ca/ca.crt comp-lzo verb 3 mute 20 log /var/log/openvpn-server2.log auth-user-pass