OpenVPN

De Breizh-Entropy
Aller à la navigation Aller à la recherche


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

Quelques exemples

http://teta.breizh-entropy.org/vpn