<fs x-large>Création d'un VPN avec OpenVPN</fs>

Installation

# apt-get install openvpn

Création Certificats

Ensuite nous créons des certificats.

Ces certificats vont servir pour identifier le client et le serveur.

# cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn/

nous plaçons dans ce nouveau répertoire

# cd /etc/openvpn/easy-rsa/2.0

Nous renseignons le fichiers vars

# vi vars

En lui mettant a la fin

export KEY_COUNTRY="FR"
export KEY_PROVINCE="ILE-DE-FRANCE"
export KEY_CITY="CHAVILLE"
export KEY_ORG="druidesmetal"
export KEY_EMAIL="postmaster@druidesmetal.org"

nous pouvons exécuter ce fichier

# . ./vars

La commande ci dessous videra entièrement toutes les clés.

A ne faire que si c'est une installation neuve ou si vous voulez tout effacer.

nous donnons un petit coup de balais

# ./clean-all
  • Création de l'autorité de certification

Le script suivant permet de créer dans « keys » le certificat principal du serveur « ca.crt » et la clé correspondante « ca.key » :

# ./build-ca

et renseigner les champs demandé comme cela

Country Name (2 letter code) [FR]:
State or Province Name (full name) [ILE-DE-FRANCE]:
Locality Name (eg, city) [CHAVILLE]:
Organization Name (eg, company) [druidesmetal]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [druidesmetal]:druidesmetal
Email Address [postmaster@druidesmetal.org]:
  • Création du certificat Serveur ( openvpn c'est son petit nom )

Le script suivant permet de créer dans « keys » le certificat « openvpn.crt » et la clé « openvpn.key » pour le serveur VPN nommé par exemple «openvpn » :

# ./build-key-server openvpn

que vous renseignez comme cela

countryName           :PRINTABLE:'FR'
stateOrProvinceName   :PRINTABLE:'ILE-DE-FRANCE'
localityName          :PRINTABLE:'CHAVILLE'
organizationName      :PRINTABLE:'druidesmetal'
commonName            :PRINTABLE:'openvpn'
emailAddress          :IA5STRING:'postmaster@druidesmetal.org'
  • Création des certificats clients openvpn

Le script suivant permet de créer dans ./keys le certificat moradin.crt et la clé « moradin.key » pour le client VPN nommé par exemple moradin :

# cd /etc/openvpn/easy-rsa/2.0
# . ./vars
# ./build-key moradin

et le renseigner comme cela

Country Name (2 letter code) [FR]:
State or Province Name (full name) [ILE-DE-FRANCE]:
Locality Name (eg, city) [BREST]:
Organization Name (eg, company) [druidesmetal]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [moradin]:
Email Address [contact@mdl29.net]:'postmaster@druidesmetal.org'

Il faut mettre entre simple cote ' l'adresse email afin que le caractère "@" ne pose pas problème.

  • Création du paramètre Diffie Hellman

Le script suivant permet de créer dans « keys » le fichier « dh1024.pem » :

# ./build-dh

Résumé des certificats et clés créés précédemment dans « keys »
Emplacement du fichier 	Type 	Nom 	Secret
Serveur de certification (CA) OpenSSL	Certificat 	ca.crt 	Non
Serveur de certification (CA) OpenSSL	Clé 	ca.key 	Oui
Serveur OpenVPN 	Certificat 	openvpn.crt 	Non
Serveur OpenVPN 	Clé 	openvpn.key 	Oui
paramètre Diffie Hellman 		dh1024.pem 	Non
moradin 	Certificat 	moradin.crt 	Non
moradin 	Clé 	moradin.key 	Oui
Mise en place des certificats et des clés

concernant le serveur OpenVPN, le plus simple est de copier les 4 fichiers dans le dossier « /etc/openvpn » :

# cp ./keys/ca.crt /etc/openvpn/
# cp ./keys/openvpn.crt /etc/openvpn/
# cp ./keys/openvpn.key /etc/openvpn/
# cp ./keys/dh1024.pem /etc/openvpn/

Configuration OpenVPN

Création d’un utilisateur avec des droits limités pour OpenVPN

Pour limiter les risques d’attaques sur OpenVPN, il est important que le processus d’OpenVPN fonctionne sur un utilisateur n’ayant aucun droit sur le système.

Souvent, l’utilisateur « nobody » est utilisé par défaut, mais il est encore plus sécurisant de faire tourner chaque processus avec un utilisateur différent. Donc, pour le processus OpenVPN, nous allons créer l’utilisateur « openvpn » :

# groupadd openvpn
# useradd -d /dev/null -g openvpn -s /bin/false openvpn

Configuration du Serveur OpenVPN

Nous pouvons configurer sur deux protocoles en TCP, et en UDP.

OpenVPN en UDP

Par défaut OpenVPN est fourni avec plusieurs fichiers d’exemples enregistrés dans le dossier :

/usr/share/doc/openvpn/examples/sample-config-files/

Pour configurer le serveur, je suis parti du fichier d’exemple « server.conf.gz », qu’il faut donc décompresser et mettre en place dans « /etc/openvpn » :

# cd /usr/share/doc/openvpn/examples/sample-config-files/
# gunzip server.conf.gz
# cp server.conf /etc/openvpn/serveur-udp.conf

Il suffit ensuite d’adapter ce fichier en fonction de nos besoins.

;Port en écoute utilisé pour la connexion VPN
port 31194

;Protocole utilisé (Le protocole udp est plus performant que le tcp)
proto udp

;Type d'interface réseau virtuelle créée
dev tun

;Nom des fichiers servant à l'authentification des clients via OpenSSL
ca ca.crt
cert openvpn.crt
key openvpn.key  
dh dh1024.pem

;Adresse du réseau virtuel (Le serveur aura l'adresse 10.8.0.1)
server 10.8.1.0 255.255.255.0

;Cette ligne ajoute sur le client la route du réseau du serveur

;Ces lignes indiquent aux clients l'adresse des serveur DNS et WINS
push "dhcp-option DNS 192.168.0.2"
push "dhcp-option DOMAIN MonDomaine.com"
push "dhcp-option WINS 192.168.0.3"

# Cette ligne permet aux clients de voire les autres clients
;client-to-client

;Ces lignes servent à la configuration des clients  
ccd-exclusive
client-config-dir ccd

keepalive 10 120

;Cette ligne active la compression
comp-lzo

;Ces lignes indiquent un user et un group particulier pour le processus
user openvpn
group openvpn

;Ces lignes permettent de rendre persistante la connexion
persist-key
persist-tun

status openvpn-status.log

# Fix MTU problems 
mssfix 1300

;Cette ligne permet d'indiquer le niveau de log souhaité (de 1 à 9)
verb 1
# ces lignes definiseent les fichiers le log
status /var/log/openvpn-udp-status.log 
log-append /var/log/openvpn-udp.log 

ATTENTION, si les journaux sont écrits dans un fichier dédié comme c’est le cas dans la configuration ci-dessus, il faut absolument mettre en place une rotation des ces journaux. Dans le cas contraire, OpenVPN tombe lorsque le fichier atteint 2Go.

Pour cela, il suffit de créer le fichier /etc/logrotate.d/openvpn

# vi /etc/logrotate.d/openvpn 

et d’y ajouter les directives suivantes :

/var/log/openvpn-udp.log { 
  rotate 4 
  daily 
  copytruncate 
  compress 
  missingok 
  notifempty  
}

OpenVPN en TCP IP

Par défaut OpenVPN est fourni avec plusieurs fichiers d’exemples enregistrés dans le dossier :

/usr/share/doc/openvpn/examples/sample-config-files/

Pour configurer le serveur, je suis parti du fichier d’exemple « server.conf.gz », qu’il faut donc décompresser et mettre en place dans « /etc/openvpn » :

# cd /usr/share/doc/openvpn/examples/sample-config-files/
# gunzip server.conf.gz
# cp server.conf /etc/openvpn/serveur-tcp.conf

Il suffit ensuite d’adapter ce fichier en fonction de nos besoins.

;Port en écoute utilisé pour la connexion VPN
port 31443

;Protocole utilisé
proto tcp

;Type d'interface réseau virtuelle créée
dev tun
  
;Management
management 192.168.1.55 31444
  
;Nom des fichiers servant à l'authentification des clients via OpenSSL
ca ca.crt
cert openvpn.crt
key openvpn.key  
dh dh1024.pem

;Adresse du réseau virtuel (Le serveur aura l'adresse 10.8.0.1)
server 10.8.4.0 255.255.255.0

;Cette ligne ajoute sur le client la route du réseau du serveur

;Ces lignes indiquent aux clients l'adresse des serveur DNS et WINS
push "dhcp-option DNS 192.168.0.2"
push "dhcp-option DOMAIN MonDomaine.com"
push "dhcp-option WINS 192.168.0.3"

# Cette ligne permet aux clients de voire les autres clients
;client-to-client

;Ces lignes servent à la configuration des clients  
ccd-exclusive
client-config-dir ccd
  
keepalive 10 120

;Cette ligne active la compression
comp-lzo

;Ces lignes indiquent un user et un group particulier pour le processus
user openvpn
group openvpn

;Ces lignes permettent de rendre persistante la connexion
persist-key
persist-tun

status openvpn-status.log

# Fix MTU problems 
mssfix 1300

;Cette ligne permet d'indiquer le niveau de log souhaité (de 1 à 9)
verb 1
# ces lignes definiseent les fichiers le log
status /var/log/openvpn-tcp-status.log 
log-append /var/log/openvpn-tcp.log 

ATTENTION, si les journaux sont écrits dans un fichier dédié comme c’est le cas dans la configuration ci-dessus, il faut absolument mettre en place une rotation des ces journaux. Dans le cas contraire, OpenVPN tombe lorsque le fichier atteint 2Go.

Pour cela, il suffit de créer le fichier /etc/logrotate.d/openvpn

# vi /etc/logrotate.d/openvpn 

et d’y ajouter les directives suivantes :

/var/log/openvpn-tcp.log { 
  rotate 4 
  daily 
  copytruncate 
  compress 
  missingok 
  notifempty 
}

Création des fichiers clients

Pour chaque client VPN, nous allons créer un fichier de configuration.

Cela permet de fixer une IP au client et de lui affecter des routes spécifiques.

# mkdir /etc/openvpn/ccd

Pour le client moradin, nous devons créer le fichier moradin dans le répertoire /etc/openvpn/ccd

# vi /etc/openvpn/ccd/moradin

; affecte l'IP 10.8.1.3 et donne 10.8.1.254 comme passerelle
ifconfig-push 10.8.1.3 10.8.1.254
iroute 10.8.1.0 255.255.255.0
; permet au client de se rendre sur le réseau 192.168.255.0
push "route 192.168.255.0 255.255.255.0"

Démarrage du serveur OpenVPN

La commande suivante permet de démarrer ou redémarrer le serveur :

# /etc/init.d/openvpn restart

Ne pas hésiter à regarder dans les logs que tout c’est bien passé :

# tail -100 /var/log/syslog

Bien vérifier également que le processus tourne sous l’utilisateur « openvpn »

# ps aux | grep openvpn

Pour finir, si tout c’est bien passé l’interface « tun0 » doit apparaître dans la configuration du réseau :

# ifconfig

tun0      Lien encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
       inet adr:10.8.1.3  P-t-P:10.8.1.254  Masque: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 lg file transmission:100
       RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

Et il doit être possible de la pinguer :

# ping 10.8.1.1

Partage de connexion

Par défaut, les connexion vpn n'ont pas acc ès au réseau local du serveur. Pour simplifier la conf, nous allons natter tout ce qui vient du vpn.

  • creation du script du demarrage
# vi /etc/init.d/networkVPN

et nous lui mettons …

#! /bin/sh
### BEGIN INIT INFO
# Provides:          rc.local
# Required-Start:    $remote_fs
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: lance le partage de connexion reseau
### END INIT INFO
   
PATH=/sbin:/usr/sbin:/bin:/usr/bin 
 
. /lib/init/vars.sh
. /lib/lsb/init-functions
case "$1" in 
  start)
      echo 1 > /proc/sys/net/ipv4/ip_forward
      iptables -F
      iptables -t nat -F
      iptables -t mangle -F
      iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
      ;;

  restart|reload|force-reload)
      echo "Error: argument '$1' not supported" >&2
      exit 3
      ;;

  stop)
      echo 0 > /proc/sys/net/ipv4/ip_forward
      iptables -F
      iptables -t nat -F
      iptables -t mangle -F
      ;;
  *)
      echo "Usage: $0 start|stop" >&2
      exit 3
      ;;
esac

Configuration du client

En UDP

sur le client

# apt-get install openvpn

puis

# vi /etc/openvpn/client.conf

et on lui met

client
dev tun
proto udp 

remote 92.103.196.72 31194 

resolv-retry infinite
nobind 

persist-key
persist-tun

ca ca.crt
cert moradin.crt
key moradin.key

comp-lzo

verb 1
 

il ne reste plus qu'a copier les cle ca.crt et le moradin* dans le repertoire /etc/openvpn

En TCP sans proxy

Au cas où le firewall de votre réseau ne laisse pas passer l'udp.

sur le client

# apt-get install openvpn

puis

# vi /etc/openvpn/client.conf

et on lui met

client
dev tun
proto tcp 

remote 92.103.196.73 30443

resolv-retry infinite
nobind 

persist-key
persist-tun

ca ca.crt
cert moradin.crt
key moradin.key

comp-lzo

verb 1

il ne reste plus qu'a copier les cle ca.crt et le moradin* dans le repertoire /etc/openvpn

En TCP avec proxy sans authentification

Au cas où il existe un proxy sur votre réseau . et que le firewall ne laisse pas passer l'udp.

meme chose que pour tcp sans proxy, il suffit de rajouter à la fin du fichier client.conf

http-proxy-retry
http-proxy 172.29.11.211 8080 
http-proxy-option AGENT Mozilla/5.0+(Windows+NT+5.0;+fr-FR;+rv:1.7.6)+gecko  /20050226+Firefox/1.0.1

En TCP avec proxy avec authentification

http-proxy-retry
http-proxy 172.29.11.211 8080 mypass basic 
http-proxy-option AGENT Mozilla/5.0+(Windows+NT+5.0;+fr-FR;+rv:1.7.6)+gecko  /20050226+Firefox/1.0.1

et il faut creer le fichier mypass dans /etc/openvpn/

# vi /etc/openvpn/mypass

et lui mettre dedans

login
password