Installation d’OpenVPN over HTTPS sous debian

Administration des Réseaux, Adminstration Server Linux, Debian Add comments

Avant-propos

OpenVPN est un logiciel permettant de créer des réseaux privés virtuels sans utiliser des technologies telles que PPtP (Microsoft) ou IPSec. Il est de plus disponibles sur de nombreux systèmes d’exploitation (Microsoft Windows, GNU / Linux, MacOS X, …). C’est une solution simple pour gérer un réseau privé virtuel composé de machines hétéroclites dans un environnement n’autorisant pas IPSec.

Dans notre cas nous allons utiliser OpenVPN over HTTPS afin de contourner les éventuels restrictions que l’on trouve à l’école ou au boulot.

Voici un schéma du réseaux que nous allons mettre en place

tunnelvpn

Le server dispose de deux ips, l’une public et une autre privée pour le réseau VPN
Eth0 : 91.121.95.122
Tun0 : 172.16.0.1

Le client dispose également de deux ips, l’ip de l’interface normal donnant accès au net et l’ip du l’interface virtuel d’OpenVPN
Réseau local : 10.1.6.30
Interface virtuel 172.16.0.6

Voyons maintenant en détail l’installation et la configuration du server

Server OpenVPN

L’installation d’OpenVPN se fait simplement par la ligne de commande :

apt-get install openvpn openssl

Création du certificat de l’autorité de certification

La partie la plus compliquée et la plus fastidieuse dans la mise en place d’un serveur OpenVPN concerne la génération des clés et des certificats. OpenVPN est livré avec plusieurs scripts permettant de générer plus facilement les clés et les certificats pour OpenSSL. Ces scripts sont enregistrés dans le dossier « easy-rsa » :

cd /usr/share/doc/openvpn/examples/easy-rsa/2.0/

On maintenant configuré les variable du script, pour ce faire on édite le fichier vars :

Vi /usr/share/doc/openvpn/examples/easy-rsa/2.0/vars

Tous en bas on trouve :

export KEY_COUNTRY="BE"
export KEY_PROVINCE="Belgium"
export KEY_CITY="Namur"
export KEY_ORG="MajorXtrem"
export KEY_EMAIL="admin@majorxtrem.be"

Une fois le fichier modifié, la ligne suivante permet d’initialiser les variables pour les scripts :

source ./vars

Le script suivant, permet de créer ou de réinitialiser le sous-dossier « keys » :

./clean-all

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

./build-ca

Pour le « Common Name » il faut le renseigner manuellement, exemple le FQDN de la machine

Création du certificat et de la clé pour le serveur OpenVPN

Le script suivant permet de créer le certificat et la pour le serveur VPN

/build-key-server server

ATTENTION : Pour les questions, la plupart des champs sont renseignés par défaut sauf le « Common Name » qu’il faut renseigner manuellement. Exemple le FQDN de la machine

Pour les questions, tous les champs sont renseignés par défaut sauf le « Common Name » qu’il faut renseigner manuellement.
Je n’ai pas renseigné le champ « password »

Création du certificat et de la clé pour un client OpenVPN

Le script suivant permet de créer le certificat et la clé pour le client VPN.

./build-key johann-laptop

Lorsque le script vous pose des questions, utilisez les valeurs par défaut, mais faites bien attention de répondre y aux questions :
Pour le « Common Name » il faut le renseigner manuellement, exemple le FQDN de la machine
Sign the certificate? [y/n]: y
1 out of 1 certificate requests certified, commit? [y/n] y

Création du paramètre Diffie Hellman

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

./build-dh

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/ca.key /etc/openvpn/
cp ./keys/server.crt /etc/openvpn/
cp ./keys/server.key /etc/openvpn/
cp ./keys/dh1024.pem /etc/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
chown openvpn:openvpn -R /etc/openvpn/

Génération d’une clef TLS

Nous allons maintenant générer une clef qui nous protègera de certains types d’attaques. Elle va nous permettre de créer un pare-feu HSA :

openvpn --genkey --secret /etc/openvpn/ta.key

Configuration d’OpenVPN

On va partir d’une configuration vierge

Mv /etc/openvpn/server.conf /etc/openvpn/server.conf_old
Vi /etc/openvpn/server.conf

Ensuite on copie la config suivante :

# Server configuration
mode server
dev tun
max-clients 4
port 443
port-share 91.121.95.122 4443
server 172.16.0.0 255.255.255.0
proto tcp
keepalive 10 120
persist-key
persist-tun
comp-lzo

# SSL parameters
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
tls-auth ta.key 0
tls-server

# VPN Gateway offer DNS parameters
push "dhcp-option DOMAIN majorxtrem.be"
push "dhcp-option DNS 172.16.0.1"
push "dhcp-option NTP 172.16.0.1"

# VPN Gateway offer this routes to clients
push "redirect-gateway"
push "route 172.16.0.0 255.255.255.0"
ifconfig-pool-persist ipp.txt

# Fix MTU problems
mssfix 1300

# Drop root privileges
chroot /etc/openvpn
user openvpn
group openvpn

#  Gestion des clients
client-to-client
client-config-dir ccd

# Logging configuration
status /var/log/openvpn-status.log
verb 1

Les paramètres port et port-share sont extrêmes important et requière une petite explication.

Le server OpenVPN tournera sur le port 443 pour pouvoir passer à travers d’éventuel proxy dans le cas ou l’accès direct au net n’est pas possible là ou vous vous trouvez. Ce pendant apache écoute aussi sur le port 443, on va donc dire a OpenVPN de transmettre les requêtes qui ne lui sont pas attribuer sur le port 4443. Il faut évidement configurer vos vhosts ssl apache sur le port 4443 et ne plus le mettre à l’écoute du port 443 mais 4443.

cat /etc/apache2/ports.conf
Listen 80
Listen 4443
cat /etc/apache2/sites-available/ssl
NameVirtualHost 91.121.95.122:4443
<VirtualHost 91.121.95.122:4443>
    …
    …

Pour le reste des option je vous invite a voir leur signification sur la doc d’OpenVPN (http://openvpn.net/index.php/documentation/manuals/openvpn-21.html)

Ne pas oublier de redémarrer apache et OpenVPN

/etc/init.d/apache2 restart
/etc/init.d/openvpn restart

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

tail -n 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
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet adr:172.16.0.1  P-t-P:172.16.0.2  Masque:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:22 errors:0 dropped:0 overruns:0 frame:0
          TX packets:22 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:100
          RX bytes:1436 (1.4 KiB)  TX bytes:1436 (1.4 KiB)

Et il doit être possible de la pinguer :

ping 172.16.0.1

Configuration du NAT

L’objectif du VPN étant d’outre passé les limite du réseau dans le quel on se trouve, il serait peut-être utile d’activé le forward des paquet sur le server

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -o eth0 -j MASQUERADE

Voilà pour la partie serveur :) On va maintenant installer et configurer la partie client

Client OpenVPN sous Windows Seven

On télécharge la dernier version en date à savoir la 2.1_rc15 à partir du site d’OpenVPN ( http://openvpn.net/release/ ).
L’installateur ne fonctionne pas sous seven, il suffit de faire clic droit compatibilité et de choisir Windows XP SP3

Récupérer les key et certificats sur le serveur, ils se trouvent dans le dossier :
/usr/share/doc/openvpn/examples/easy-rsa/2.0/key/

Vous avez besoin de la clef et du certificat du client, du certificat racine ainsi que de la clef
○ johann-laptop.crt
○ johann-laptop.key
○ ca.crt

Vous avez également besoin de la clef TSL, elle se trouve dans le repertoire /etc/openvpn/
○ ta.key

Copiez ces 4 fichiers dans le répertoire conf C:\Program Files\OpenVPN\config du client

Lancer ensuite le GUI d’OpenVPN, et dans la zone de notification faites un clic droit dessus et sélectionner « edit config »

# Client configuration
client
dev tun
remote 91.121.95.122 443
proto tcp
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo

# SSL parameters
ca ca.crt
cert johann-laptop.crt
key johann-laptop.key
tls-auth ta.key 1 

# Route and Network
route-method exe
route-delay 2
shaper 100000000 

# Log
verb 3

Sur l’icône dans la zone de notification faites connect

Si tous fonctionne bien, vous devriez être capable de pinguer le serveur via le tunnel

Ping 172.16.0.1

Démarrer une console et tappez route print

Network Destination	Netmask		Gateway		Interface	Metric
0.0.0.0		0.0.0.0		172.16.0.5	172.16.0.6	31
91.121.95.122		255.255.255.255	192.168.3.1	192.168.3.9	21

Vous devez avoir quelque chose de la sorte, a savoir que la passerelle par défaut est maintenant 172.16.0.5
Et que pour joindre le server VPN la route a prendre est l’ancienne passerelle par défaut

10 Responses to “Installation d’OpenVPN over HTTPS sous debian”

  1. Batou Says:

    Merci beaucoup pour cet article. Je suis particulièrement intéressé par l’installation d’un serveur VPN. Ce guide va donc bien m’aider !

  2. Galaad Says:

    Bonjour,

    Article très clair et vraiment intéressant.
    Une question en relation avec le sujet, comment est il possible de faire en sorte que le client entre un password ou moment ou il utilise le certificat ?

    Et encore un grand merci pour se tuto.
    Cdlt,

    Galaad

  3. MajorXtrem Says:

    le certificat fait office de password, tu dois donc générer autant de certificat que tu veux de user ;)

  4. Galaad Says:

    salut,

    Merci pour ta réponse rapide, en fait je me suis peu être mal exprimé. Ma question était plutôt:
    Y a t un moyen de protégé le certificat que l’on donne à l’utilisateur avec un mot de passe? afin de limité l’usage frauduleux du certificat par quelqu’un qui partagerai la machine par exemple. (le mot de passe ne servirai pas à se connecter au VPN mais simplement à déverrouiller le certificat pour utilisation)

    Cdlt,

    Galaad

  5. MajorXtrem Says:

    oui on peut,

    http://www.openvpn.net/index.php/open-source/documentation/manuals/69-openvpn-21.html

    –askpass [file]
    Get certificate password from console or file before we daemonize.

    For the extremely security conscious, it is possible to protect your private key with a password. Of course this means that every time the OpenVPN daemon is started you must be there to type the password. The –askpass option allows you to start OpenVPN from the command line. It will query you for a password before it daemonizes. To protect a private key with a password you should omit the -nodes option when you use the openssl command line tool to manage certificates and private keys.

    If file is specified, read the password from the first line of file. Keep in mind that storing your password in a file to a certain extent invalidates the extra security provided by using an encrypted key (Note: OpenVPN will only read passwords from a file if it has been built with the –enable-password-save configure option, or on Windows by defining ENABLE_PASSWORD_SAVE in config-win32.h).

  6. Galaad Says:

    Merci Beaucoup

  7. seb Says:

    Bonjour,
    qu’elle est le cms que vous utilisez ?

  8. bast Says:

    @seb cms = wordpress

  9. Installation d’OpenVpn sous Linux « StefTech Says:

    [...] J’avais suivi une très bonne procédure ici [...]

  10. Christian Says:

    Bonjour. Merci pour cette procédure très claire et pointue. Toujours un plaisir de trouver de tels articles.

Leave a Reply

*

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Connexion
ipv6 ready