[HowTo] Installation et configuration d’OpenVPN sous Debian 7


Photo Post OpenVPN

En bons Geeks nous avons tous besoin, à un moment ou un autre, d'un VPN (pour se connecter en sécurité depuis un hot-spot public, pour accéder à des contenus disponibles qu'à partir de certaines zones géographiques ...). Il existe bien entendu une offre commerciale assez fournie mais partant du principe qu'on est jamais aussi bien servi que par soi même il n'est en fait pas très compliqué de mettre en œuvre sa propre solution (en s'appuyant par exemple sur des offres de VPS low cost ...).


Logo OpenVPN

Il existe aujourd’hui différentes technologies permettant la mise en place d'un tunnel VPN (IPSec, PPTP, L2TP ...). Toutefois ces protocoles nécessitent tous l'ouverture de certains ports et/ou protocoles au niveau des routeurs utilisés pour la connexion à l'Internet. Malheureusement lors de vos déplacements vous ne maîtrisez pas toujours ces aspects ... OpenVPN permet de s’affranchir de ce type de problème. En effet il est capable d'utiliser un port standard (par exemple le TCP:443) qui est habituellement utilisé pour les connexions HTTPS. S'agissant là d'un port largement utilisé il est fort probable que tous les accès Internet que vous rencontrerez laisseront passer ce type de flux !

Ce how-to est destiné à vous fournir les éléments nécessaires à la mise en œuvre de ce type de VPN en toute autonomie (côtés serveur et client).

OpenVPN en quelques concepts :

  • Open VPN nécessite un client spécifique en fonction de votre matériel (téléchargements disponibles ICI )
  • L'authentification est basée sur un système de certificats. Vous devrez générer ces certificats (et les clés associées) sur votre serveur pour chaque client. Ainsi qu'un certificat propre à votre serveur (qui jouera le rôle d'Autorité de Certification). Ces fichiers seront ensuite utilisés sur le client pour s'authentifier
  • La configuration du client est réalisée au travers d'un fichier de conf spécifique

Pré-requis : vous devez disposer d'un serveur Linux fonctionnant sous Linux Debian 7 qui n'utilise pas actuellement le port TCP:443(EDIT : voir le commentaire de Denis pour les possibilités de partage de ce port). Si vous utilisez déjà des règles IPtables vous serez amené à adapter la configuration de votre Firewall ...

Vous verrez c'est un peu long 😉 mais j'ai essayé de détailler chaque opération le plus précisément possible.

C'est parti!

  • Nous allons commencer à installer le serveur OpenVPN
apt-get install openvpn
  • On place au bon endroit les fichiers nécessaires à la génération des clés et certificats (OpenVPN est fourni avec un ensemble d'outils permettant la gestion de ces éléments : Easy RSA)
cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa/
  • On édite ensuite le fichier "vars" qui intègre les paramètres par défaut pour la génération des clés et certificats (les informations à modifier se situent à la fin de ce fichier)
vim vars

et adaptez les informations en fonction de vos besoins ...

# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="FR"
export KEY_PROVINCE="Auvergne"
export KEY_CITY="ClermontFerrand"
export KEY_ORG="BdX"
export KEY_EMAIL="votre@email.com"
...
  • On lance ensuite ces commandes nécessaires à l'initialisation de différents paramètres de crypto et de l'Autorité de Certification
source ./vars
./clean-all
./build-dh
./pkitool --initca
./pkitool --server server
  • Après ces différentes opérations on crée le fichier de configuration du serveur OpenVPN (openvpn.conf)
cd /etc/openvpn/
vim openvpn.conf

Votre fichier devrait ressembler à ça :

8<----------------------------
port 443
proto tcp
dev tun
comp-lzo
persist-key
persist-tun
keepalive 10 20
server 10.8.0.0 255.255.255.0

push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh1024.pem

status openvpn-status.log

verb 3
8<----------------------------

  • On lance ensuite le serveur OpenVPN pour tester la conf ...
openvpn openvpn.conf

Vous devriez obtenir quelque chose de ce style :

root@debian:/etc/openvpn# openvpn openvpn.conf
Sun Feb 16 16:33:46 2014 OpenVPN 2.2.1 i486-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] [MH] [PF_INET6] [IPv6 payload 20110424-2 (2.2RC2)] built on Jun 19 2013
Sun Feb 16 16:33:46 2014 NOTE: OpenVPN 2.1 requires &#039;--script-security 2&#039; or higher to call user-defined scripts or executables
Sun Feb 16 16:33:46 2014 Diffie-Hellman initialized with 1024 bit key
Sun Feb 16 16:33:46 2014 TLS-Auth MTU parms [ L:1544 D:140 EF:40 EB:0 ET:0 EL:0 ]
Sun Feb 16 16:33:46 2014 Socket Buffers: R=[87380-&gt;131072] S=[16384-&gt;131072]
Sun Feb 16 16:33:46 2014 ROUTE default_gateway=xxx.xxx.xxx.xxx
Sun Feb 16 16:33:46 2014 TUN/TAP device tun0 opened
Sun Feb 16 16:33:46 2014 TUN/TAP TX queue length set to 100
Sun Feb 16 16:33:46 2014 do_ifconfig, tt-&gt;ipv6=0, tt-&gt;did_ifconfig_ipv6_setup=0
Sun Feb 16 16:33:46 2014 /sbin/ifconfig tun0 10.8.0.1 pointopoint 10.8.0.2 mtu 1500
Sun Feb 16 16:33:46 2014 /sbin/route add -net 10.8.0.0 netmask 255.255.255.0 gw 10.8.0.2
Sun Feb 16 16:33:46 2014 Data Channel MTU parms [ L:1544 D:1450 EF:44 EB:135 ET:0 EL:0 AF:3/1 ]
Sun Feb 16 16:33:46 2014 Listening for incoming TCP connection on [undef]
Sun Feb 16 16:33:46 2014 TCPv4_SERVER link local (bound): [undef]
Sun Feb 16 16:33:46 2014 TCPv4_SERVER link remote: [undef]
Sun Feb 16 16:33:46 2014 MULTI: multi_init called, r=256 v=256
Sun Feb 16 16:33:46 2014 IFCONFIG POOL: base=10.8.0.4 size=62, ipv6=0
Sun Feb 16 16:33:46 2014 MULTI: TCP INIT maxclients=1024 maxevents=1028
Sun Feb 16 16:33:46 2014 Initialization Sequence Completed
  • Il est ensuite souhaitable de modifier le paramétrage de votre système afin qu'il autorise le forward des paquets au travers du serveur :
vim /etc/sysctl.conf

On dé-commente (vers la ligne 28) :

net.ipv4.ip_forward=1

et on lance les deux commandes suivantes

sysctl -p
/etc/init.d/networking reload
  • Il est désormais nécessaire de modifier les règles Iptables afin de permettre aux paquets de transiter au travers de votre passerelle VPN (pour vous servir de votre serveur VPN comme d'une passerelle vers d'autres réseaux). Pour ce faire on crée puis on édite un fichier "firewall.rules" que l'on place dans "/etc". Afin de faciliter la mise en œuvre du système j'ai créé un fichier qui laisse entrer tous les flux ( :INPUT ACCEPT dans la section "Filter"). Vous devez bien entendu l'adapter en fonction de vos besoins ...
vim /etc/firewall.rules

Voici le contenu du fichier

*nat
:PREROUTING ACCEPT
:INPUT ACCEPT
:OUTPUT ACCEPT
:POSTROUTING ACCEPT
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT

*filter

:INPUT ACCEPT
:FORWARD DROP
:OUTPUT ACCEPT

-A FORWARD -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i tun0 -o eth0 -j ACCEPT

COMMIT
  • On crée ensuite le fichier d'initialisation du firewall (qui va utiliser les directives données au sein de /etc/firewall.rules)
vim /etc/init.d/firewall

Voici le contenu du fichier

#!/bin/sh
/sbin/iptables-restore /etc/firewall.rules

On donne les droits d’exécution à ce script

chmod 755 /etc/init.d/firewall

On lance une première fois manuellement ce script

/etc/init.d/firewall

Et on indique au système que ce script doit être lancé automatiquement au démarrage du système

update-rc.d firewall defaults
  • et pour finir côté serveur on lance le service "OpenVPN"
service openvpn start
  • On passe ensuite à la génération des certificats et des clés destinés aux clients : remplacez nom_du_user par le nom de l'utilisateur (pas d'espace, pas de caractères spéciaux ...)
cd /etc/openvpn/easy-rsa
source vars
./build-key nom_du_user

Répondez aux questions (pour le CN - Common Name - utilisez la même chaine que pour nom_du_user)

  • A l'issue de cette opération on récupère les fichiers suivants dans le répertoire /etc/openvpn/easy-rsa/keys (ces derniers devront être déposés sur votre client)
Nom du fichier Contenu
nom_du_user.crt Certificat de l'utilisateur
nom_du_user.key Clé privée associée au certificat de l'utilisateur
ca.crt Certificat de l'autorité de certification
  • Il faut ensuite créer le fichier de conf (côté client) qui sera fourni au logiciel OpenVPN pour se connecter. Vous pouvez utiliser n'importe quel éditeur de texte sur votre OS habituel. Voici ce qu'on doit trouver dans ce fichier (extension .conf pour Linux/MacOS ou .ovpn pour les clients Windows et Android). Respectez l'extension c'est important ! Sous Windows le fichier de conf doit être déposé au sein du répertoire "C:\Program Files\OpenVPN\config\". N'oubliez pas de placer également les 3 fichiers cités ci-dessus (.crt/.key) au sein de ce répertoire de configuration de votre client.

Voici le contenu du fichier de configuration du client :

client
dev tun
proto tcp
remote INDIQUEZ_ICI_L_IP_DE_VOTRE_SERVEUR 443
resolv-retry infinite
nobind

ca ca.crt
cert nom_du_user.crt
key nom_du_user.key

persist-key
persist-tun

comp-lzo

verb 3
  • Si vous utilisez Windows voici deux points importants à vérifier (qui vous feront gagner du temps 😉 ) :

  • que votre fichier de configuration porte bien l'extension ".ovpn" (Windows à souvent la bonne idée d’ajouter un .txt derrière ... on se retrouve alors un .ovpn.txt le .txt étant bien entendu masqué ...).

  • que OpnVpn GUI soit bien lancé avec les droits d'administrateur (autrement ça ne fonctionne pas !)

Sous Windows il ne vous reste plus qu'à cliquer-droit sur l'icone OpenVPN GUI dans la barre de tâche et de choisir "connecter" !

Pour les autres plateformes je vous laisse vous reporter à la documentation fournie avec votre client Open VPN en sachant que le fichier de conf ainsi que les certificats et clés sont compatibles sur tous les OS.

Si vous repérez des erreurs, imprécisions, omissions (et oui ça peut arriver ...) n'hésitez pas à me l'indiquer dans les commentaires !

25 réflexions au sujet de « [HowTo] Installation et configuration d’OpenVPN sous Debian 7 »

  1. "et adaptez les infirmations en fonction de vos besoins …"

    Je crois qu'il y'a une erreur de frappe 🙂

    Si le port 443 est déjà utilisé par un serveur web, OpenVPN possède une option "--port-share" pour pouvoir fournir les deux services.

  2. Salut,
    J'ai suivi exactement le tuto mais je n'ai pas internet.
    L'icone est bien verte, il me dit que je suis connecté (avec l'adresse ip 10.8.0.6) mais lorsque je lance firefox ou tout autre logiciel utilisant internet, aucune connexion.
    Le ping reste sans réponse...

    Je ne comprends pas.
    Mon serveur est un VPS sous Debian 7 64bits et mon client sur windows 7 64 bits.

    Merci =)

  3. Salut Alexis,

    Étrange ...

    Les points à vérifier :

    - que tu ai bien dé-commenté "net.ipv4.ip_forward=1" dans "/etc/sysctl.conf" puis lancé un "sysctl -p" suivi d'un "/etc/init.d/networking reload"

    Pour vérifier un : "cat /proc/sys/net/ipv4/ip_forward" doit te retourner la valeur "1" (y compris après un reboot de la machine)

    - que les deux lignes suivantes soient bien présentes au sein de ton fichier de définition des règles Iptables :

    -A FORWARD -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -i tun0 -o eth0 -j ACCEPT

    Autrement peux tu me donner un peu plus d'informations sur le système de virtualisation utilisé pour ton VPS ? En effet si ton hébergeur se base sur OpenVZ (comme par exemple les offres "VPS Classic" d'OVH) il est possible que tu ne puisse pas modifier certains paramètres du Kernel. Dans ce cas "net.ipv4.ip_forward=1" ne pourra pas être modifié ...

    @+

    /Xavier

  4. Re,

    Autre point à vérifier :

    Que la ligne suivante :

    push "redirect-gateway def1 bypass-dhcp"

    soit bien présente dans le fichier de conf d'OpenVPN (côté serveur) dans le fichier "/etc/openvpn/"

    @+

  5. Bonjour,

    J'ai également un VPS Classic chez ovh et je rencontre le même problème qu'Alexis. pas d'internet et le fichier "bypass-dhcp" n'existe pas.

    Merci
    Sébastien

  6. Bonjour Sébastien,

    Bizarre ...

    A vérifier :

    1) est-ce que l'icône du client Open VPN est bien de couleur "verte" ?

    2) est-ce que tu as bien lancé le client Open VPN en mode "administrateur" (clic droit / exécuter en tant qu'administrateur" ?

    3) bien vérifier que le fichier de conf du client est complet et qu'il possède l'extension ".ovpn" (attention qu'il n'y ai pas un .txt derrière et caché ...). Le fichier de conf du client doit faire 17 lignes (si tu l'a copié collé depuis mon blog).

    4) tu m'indique " le fichier « bypass-dhcp » n’existe pas.". Il ne s'agit pas là d'un fichier mais d'une directive ( push "redirect-gateway def1 bypass-dhcp" ) qui doit être placée au sein du fichier de conf du serveur OpenVPN (/etc/openvpn/openvpn.conf). Bien vérifier que ce fichier soit complet : 21 lignes si copié / collé de mon blog.

    5) après j'ai des doutes sur le fonctionnement avec les offres "VPN Classic" d'OVH. En effet ces dernière sont basées sur OpenVZ et les possibilités d'accès au paramétrage de la machine (pour le net.ipv4.ip_forward=1) doivent être limitées. Si quelqu'un a eu l'occasion de tester sur ce type d'offre je suis preneur d'infos ! Par contre ça doit fonctionner sans aucun soucis avec les offres "OVH Cloud" qui elles sont basées sur VMWare.

    Je te laisse regarder tout ça ...

    Tiens moi au courant.

    /Xavier

  7. Bonsoir, quand je suis rendu a faire clique droit et connection... J'ai pas "connection" juste "Quitter" et "configuration" !

    -Tuto suivis sur differents forum/faq
    -Telechargement de plusieur OpenVPN Gui
    -Lancé en tant qu'administrateur

    Help :p

  8. @Sub_MrDEEZIKs : je pense que le client OpenVPN ne trouve pas ton fichier de conf. Si tu utilise Windows il faut bien vérifier que l’extension ".txt" ne soit pas cachée derrière le ".ovpn". Le fichier de conf OpenVPN doit impérativement porter l'extension ".ovpn" !

  9. Merci pour ce tuto Xavier.
    Mon TOC me fait dire qu'il y a une faute de frappe dans "status openvn-status.log".

  10. Pour infos sur VPS Classic d'OVH :
    1 - Le forward des paquets fonctionne
    2 - Il faut remplacer eth0 par venet0

    Et merci Denis, pour l'info sur la directive « –port-share » que je testerai prochainement.

  11. Merci Cyrille pour ces précisions concernant la compatibilité avec l'offre OVH VPS Classic (c'est clair qu'à 1,9€ / mois c'est une super solution pour monter son propre VPN) !

    /Xavier

  12. En effet, je viens aussi de réinstaller le VPN et il ne faut pas oublier le venet0 !
    Par contre j'ai un débit minable... ( 8Mb/s et ça chute très vite )
    Je suis seul connecté.
    Sur le serveur un wget tourne à 10Mo/s
    Et chez moi j'ai du 8Mo/s et je plafonne à 1Mo/s avec le vpn ...

  13. Bonjour,

    Comment révoquer un certificats pour un utilisateurs ?

    Merci

  14. @diewalk : si j'en crois la doc il faut utiliser la commande "revoke-full nom_de_l_utilisateur" (en étant placé dans le répertoire easy-rsa) :

    8<----------------------- Example As an example, we will revoke the client2 certificate, which we generated above in the "key generation" section of the HOWTO. First open up a shell or command prompt window and cd to the easy-rsa directory as you did in the "key generation" section above. On Linux/BSD/Unix: . ./vars ./revoke-full client2 8<----------------------- Plus d'infos : https://openvpn.net/index.php/open-source/documentation/howto.html#revoke

    /Xavier

  15. Merci,

    je vais tester la configuration et je vous retourne mon expérience si cela vous dit.

  16. je viens de faire l'installation et il y a quelques petites erreurs :
    dans le fichier de configuration tu indique :
    push "redirect-gateway def1 bypass-dhcp"
    push "dhcp-option DNS 8.8.8.8"
    push "dhcp-option DNS 8.8.4.4"

    c'est :
    push "redirect-gateway def1 bypass-dhcp"
    push "dhcp-option DNS 8.8.8.8"
    push "dhcp-option DNS 8.8.4.4"

    avec cette configuration le serveur tourne sans soucis sur les pc windows/linux mais pas pour les android.

    Android utilise un certificat p12.Pour cela, nous avons besion de convertir les certificats créer avec la commande ./build-key toto avec cette commande la
    cd /etc/openvpn/easy-rsa/key
    openssl pkcs12 -export -in toto.crt -inkey toto.key -certfile ca.crt -name toto -out toto.p12

    et d'installer le certificat sur le smartphone.Dans le fichier de configuration (ovpn) commenter les lignes suivantes :
    ca ca.crt
    cert toto.crt
    key toto.key

    et rajouter :
    pkcs "/storage/extSdCard/toto.p12" # extSDcard si c'est une carte sd

    ensuite en niveau de la revok, il manque un truc essentiel qui est d'indiquer au serveur la revok. Les clients révoqué sont dans le fichier key/crl.pem. il convient de copier ce fichier a la racine de /etc/openvpn

    ce qui donne ( toujours dans notre expemple toto )
    cd /etc/openvpn/easy-rsa
    source ./vars
    ./revoke-full toto
    cp key/crl.pem /etc/openvpn

    modifier le fichier de configuration openvpn /etc/openvpn/openvpn.cong et rajouter a la fin crl-verify crl.pem
    echo "crl-verify crl.pem" >> /etc/openvpn/openvpn.conf
    faire un petit reboot du service juste pour cette fois car nous avons modifier le fichier de configuration sinon ce n'est pas nécessaire
    /etc/init.d/openvpn restart

    voila merci encore

  17. coquille ce sont des "" et pas des <> dans echo « crl-verify crl.pem » >> /etc/openvpn/openvpn.conf

    la bonne commande
    echo "crl-verify crl.pem" >> /etc/openvpn/openvpn.conf

  18. @diewalk : un grand merci pour toutes ces précisions !
    Concernant les erreurs dans le fichier de conf de mon tuto je me suis aperçu que j'avais un problème de mise en forme des guillemets avec le module markdown désormais installé par défaut dans WordPress 🙁 Je cherche une solution ... En attendant vérifiez bien ces problèmes de guillemets quand vous copiez/collez depuis mon site.

  19. Bonjour à tous je suis nouveaux et je suis pas un genie de l'informatique.
    Voila je suis dans le DOM (guyane) je voudrais crée un vpn pour pouvoir avoir un ip en france métropolitain pour avoir acces a la télé et aux sites tel que TF1 M6 et NETFLIX.
    1-Est ce que c'est possible avec le vpn de OVH?
    2 -je bloque sur le tutoriel quand on demande d'éditer le fichier "vars".
    J'ai pas de site internet , pas de non de domaine,
    est ce que je peux mettre mon adresse yahoo?
    Et puis comme on fait pour valider et continuer à taper les autres commande.
    3- Je suis disponible pour tout aide meme en mp
    merci

  20. Une fois « Wine » installé, nous devons autoriser le fichier « Setup.exe » à être exécuté, donc un clic droit sur le fichier puis, « propriétés ». Dans l’onglet « Permissions », cochez la case « Autoriser l’exécution du fichier comme un programme ».

  21. Bonjour à tous,

    Voilà mon soucis, depuis pas mal de temps déjà j'essaye d'installer sur mon serveur HP proliant ou j'ai actuellement un vmware ESXI (5.5 il me semble) un serveur OpenVPN.

    Mais voilà, après beaucoup de tuto en tout genre (nicolargo, mondedie etc...) je n'ai jamais réussi à me connecter à mon VPN qui fonctionne (mon adresse IP publique ne change jamais !)

    Au niveau de mon installation j'ai une box numéricable en bridge derrière un routeur Netgear R7000 qui gère mon wifi et DHCP.

    Est-ce que quelqu'un si connais assez pour m'aider à configurer mon serveur, j'ai essayé déjà une install classique avec un debian 8 sur mon ESXI et une install par fichier OVA avec le OpenVPN Access server...

    Je ne sais pas si je me trompe dans mes fichiers config du type server.conf et client.conf, j'ai écumé tellement de tuto que je suis perdus dans ce qu'il faut indiquer (différence entre fonction push , server par exemple)

    Du coup je me casse la tête tout les soirs pour savoir si c'est un problème au niveau de la configuration de mon routeur, qu'elle port dois-je ouvrir ?

    Beaucoup de blabla pour au final demander un peu d'aide car ça me ronge de l'intérieur 🙂

    Merci à ceux qui liront

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *