TUTOS.EU

Mettre en place un serveur openvpn

Installer et configurer un serveur openvpn sous Linux Ubuntu


Avant de commencer, je vais exposer des infos tirées du wiki d'openvpn que l'on trouve très simplement comme montré ci-dessous ..

Le lien d'accès direct à l'article est :
https://community.openvpn.net/openvpn/wiki/BridgingAndRouting

Voici ma traduction et le résumé du début de l'article

En premier lieu il faut comparer des devices TAP vs TUN. Les cas les plus typiques :

Le mode TAP :

  • ne peut pas être utilisé avec Android ou iOS
  • permet d'utiliser le mode bridge
  • peut prendre en charge les protocoles non basés sur de l'Ip (Netalk, IPX, etc)
  • peut prendre en charge de l'IP V6 sur une version d'OpenVpn 2.2 ou plus ancienne
  • c'est comme une vraie carte réseau (sauf qu'elle est virtuelle)
  • peut travailler au niveau de la couche réseau 2, ce qui veut dire que les trames Ethernet peuvent passer dans le tunnel

Le mode TUN :

  • ne permet pas d'utiliser un mode bridgé
  • ne fonctionne qu'avec de l'Ip (pas d'Ipx, netalk etc..). Il ne transporte que des paquets Ip de niveau 3
  • ne transmet pas les boradcast
  • l'Ip v6 est pris en charge à partir d'OpenVpn 2.3

Pour les différences entre le mode bridgé et le mode routé (Bridging vs. routing) :

le mode bridgé est à utiliser si vous voulez :

  • avoir les clients du réseau local (LAN) et les clients VPN dans le même domaine de diffusion (broadcast domain)
  • fournir à vos clients VPN une adresse IP avec le serveur DHCP situé sur votre réseau local (LAN)
  • accéder à des serveurs Windows qui ont besoin de la découverte du voisinage réseau pour fonctionner. Wins ne sera pas possible.
  • le mode bridgé compliquera vos configurations futures

Précision sur le mode TAP et TUN

Le mode TAP correspond à du Open SSL

Le mode TUN, bridgé, correspond à un tunnel IPsec, c'est du site à site

Voici ce que l'on veut mettre en place

  • On a un smartphone qui doit pouvoir monter un tunnel vers un serveur openvpn situé sur un linux ubuntu. 
  • Le tunnel monté, le smartphone doit pouvoir se connecter à une caméra ip située sur le réseau local (LAN) du serveur openvpn. 
  • 10.8.0.6 est l'ip que recevra le client openvpn du smartphone quand le tunnel sera monté. 
  • 192.168.2.125 c'est l'ip de la patte privée eth0 du serveur openvpn. 
  • 10.8.0.1 c'est l'ip de l'interface tun0 d'openvpn sur le serveur. 
  • 85.169.12.12 est l'ip publique qu'a reçu le routeur quand il s'est connecté à Internet. 
  • 192.168.2.1 est l'ip du routeur pour sa patte située dans le réseau local.        

Le schéma

On va prendre le mode TUN

Comme le mode TAP ne supporte pas Android ou iOS, on va prendre le mode TUN. 
Quand au choix entre le mode Bridgé et le mode routé, le mode TUN ne supporte pas le mode bridgé, on va donc prendre le mode routé. 
Cela tombe bien car utiliser un device TUN en mode routé est le mode par défaut. 

Notez qu'après coup j'ai vu que le site openvpn.net explique comment faire son autorité de certification ici : 
https://openvpn.net/index.php/open-source/documentation/howto.html#pki


On va installer openvpn avec cette commande :

sudo apt-get install openvpn
Lien vers le fichier : cliquez ici Copier le code

Répondez par Y quand demandé

Il faut maintenant disposer d'une autorité de certification pour générer un jeu de clés publiques/privées

Pour cela on va installer easy-rsa avec la commande

sudo apt-get install easy-rsa
Lien vers le fichier : cliquez ici Copier le code

Et répondre y quand demandé

Maintenant qu'easy-rsa est installé, il faut trouver où le fichier "build-ca" se trouve. C'est le répertoire easy-rsa qui le contient.
Pour cela on va utiliser la commande

sudo find / -name build-ca
Lien vers le fichier : cliquez ici Copier le code

Dans cet exemple build-ca se trouve dans

/usr/share/easy-rsa
Lien vers le fichier : cliquez ici Copier le code

On va copier le contenu de /usr/share/easy-rsa
dans /usr/share/openvpn

ainsi les programmes disponibles dans /usr/share/easy-rsa le seront aussi dans /usr/share/openvpn
Cela comprend le programme build-ca, clean-all ainsi que le fichier vars qui contient des réglages utilisés.

Voici le contenu de /usr/share/easy-rsa après installation du logiciel :

Et voici celui de /usr/share/openvpn/ avant d'effectuer la copie :

Pour cela on va utiliser la commande

sudo cp -R /usr/share/easy-rsa/* /usr/share/openvpn/
Lien vers le fichier : cliquez ici Copier le code

Voici le contenu de /usr/share/openvpn/ après la copie :

Pour que le reste des commandes s'exécutent avec les droits administrateur, tapez

sudo -s
Lien vers le fichier : cliquez ici Copier le code

Et entrez le mot de passe du compte :


On va se rendre dans le répertoire contenant les fichiers à configurer d'opvenvpn, lister ce qu'il contient et vérifier que le fichier vars y est présent.

Pour cela tapez

cd /usr/share/openvpn
ls
Lien vers le fichier : cliquez ici Copier le code

Le fichier vars doit être présent :

Editez le avec nano par exemple

Cherchez après KEY_COUNTRY et renseignez bien tout ce qui va avec cad au final :
KEY_COUNTRY
KEY_PROVINCE
KEY_CITY
KEY_ORG
KEY_EMAIL

D'après cet article de zdnet.fr :
http://www.zdnet.fr/actualites/77-des-serveurs-vpn-utilisent-encore-ssl-30-39833368.htm#xtor=RSS-1

il faut une longueur de clé au delà de 2048 :

Si vous ne faites rien, de base voici ce que donnera le certificat de votre autorité :

Aussi passez le paramètre export KEY_SIZE à 4096

Sauvegardez vos modifications, fermez le fichier et
initialisez les variables avec la commande

. ./vars
Lien vers le fichier : cliquez ici Copier le code

Ce qui donne :

Si c'est bien une toute première fois que vous installer une autorité de certification, on va nettoyer toutes les clés et certificats existants présents dans le répertoire /usr/share/openvpn/keys
Si vous avez déjà généré des clés, ne jouez pas cette commande sinon elle va les effacer.

./clean-all
Lien vers le fichier : cliquez ici Copier le code

On crée le certificat et la clé de l'Autorité de Certification Maître (CA) avec la commande

./build-ca
Lien vers le fichier : cliquez ici Copier le code

Suite à quoi des questions seront posées. La réponse est pré-remplie car on a édité le fichier 'vars' auparavant, vous n'avez donc qu'à contrôler et appuyer sur Entrée

Ce qui donne une fois terminé :

On va contrôler que le certificat et la clé de l'Autorité de Certification ont été créés. Pour cela tapez successivement

clear
ls
cd keys
ls
Lien vers le fichier : cliquez ici Copier le code

Vous devez voir
ca.crt et ca.key

comme ici :

On va maintenant générer un certificat et une clé pour notre serveur.
Pour connaitre le nom du serveur tapez la commande

hostname
Lien vers le fichier : cliquez ici Copier le code

Ce qui dans notre cas donne MyUbuntu

La commande à entrer pour générer un certificat et une clé pour un serveur est
./build-key-server nomduserveur

Donc notre exemple la commande va donner
./build-key-server MyUbuntu

Mais il ne faut pas oublier que juste avant nous sommes allés dans le répertoire 'keys' pour en vérifier son contenu.
Au préalable on va donc revenir dans le répertoire /usr/share/openvpn puis utiliser build-key-server

cd /usr/share/openvpn
./build-key-server nomduserveur
Lien vers le fichier : cliquez ici Copier le code

A l'exécution de la commande ./build-key-server etc ... des questions sont posées mais la réponse est pré-remplie, aussi il n'y a juste qu'à appuyer sur Entrée

Un mot de passe vous sera demandé pour protéger le certificat

Le nom de la compagnie sera également demandé (réponse facultative).

On demandera également à signer le certificat

Il faudra répondre par 2 fois
y


Le certificat du serveur créé, on peut maintenant créer les certificats des clients avec une commande du type

./build-key nomduclient
Lien vers le fichier : cliquez ici Copier le code

Comme avant les réponses sont pré-remplies, il sera demandé de signer le certificat et de le valider

On va générer des paramètres Diffie-Hellman.
Elle permet au serveur et au client de se mettre d’accord sur un secret commun sans qu’un tiers puisse en prendre connaissance.
(Note de mai 2019 : le site suivant indique qu'il est préférable d'en faire une de 4096 bit car la NSA recommande au moins 3072 :
https://angristan.fr/configurer-https-nginx/)
Pour cela on va utiliser cette commande :

./build-dh
Lien vers le fichier : cliquez ici Copier le code

Résultat :

Pour information le résultat est dans un fichier qui commence par dh et qui se termine par pem
Ici c'est dh2048.pem


Nos clés et certificats créés on va copier une partie d'entr'eux dans /etc/openvpn/
On va copier :
_ les paramètres Diffie-Hellman, cad le fichier qui commence par dh
_ le certificat de l'autorité, cad ca.crt
_ la clé publique et privée du serveur, ici MyUbuntu.crt et MyUbuntu.key

Pour cela on va utiliser la commande suivante :

cd /usr/share/openvpn/keys
cp dh*.pem ca.crt MyUbuntu.crt MyUbuntu.key /etc/openvpn/
Lien vers le fichier : cliquez ici Copier le code

Si on se rend dans /etc/openvpn/
on peut voir que les fichiers ont été effectivement copiés

On va s'occuper du fichier de configuration du serveur.
Pour cela on va prendre un fichier de configuration d'exemple qui est compressé en .gz et le décompresser dans /etc/openvpn

Pour cela on va taper les commandes

cd /usr/share/doc/openvpn/examples/sample-config-files
zcat server.conf.gz > /etc/openvpn/server.conf
Lien vers le fichier : cliquez ici Copier le code

Ce qui donne :

On doit pouvoir visualiser le fichier serveur.conf sous /etc/openvpn

On va exécuter une étape très importante :
on va éditer le fichier server.conf qui paramètrer le serveur.
C'est dans ce fichier que l'on va indiquer que l'on veut un device TUN en mode routé, indiquer l'emplacement des certificats de l'autorité de certification ou encore ceux du serveur.

Editez le fichier server.conf avec la commande

cd /etc/openvpn
nano server.conf
Lien vers le fichier : cliquez ici Copier le code

On va s'intéresser à ces paramètres :

Il faut les mettre à jour par rapport à ce que vous avez dans /etc/openvpn
ce qui va donner :

Pour éviter d'avoir une erreur du type :
write to TUN/TAP : The data area passed to a system call is too small.

regardez si dans le fichier de configuration de votre serveur openvpn comp-lzo est activé. Si oui, alors il faut l'activer également au niveau du fichier de configuration du client :


Pour tester votre configuration, commencez par lancer openvpn non pas en tant que service, mais directement et en le faisant pointer sur le fichier de configuration. Vous verrez ainsi rapidement une éventuelle erreur.
Pour cela faites :

cd /etc/openvpn
openvpn server.conf
Lien vers le fichier : cliquez ici Copier le code

Exemple :

Et voici un exemple où le lancement manuel d'openvpn ne remonte pas de problème : rien ne s'est affiché :

Mais ce n'est pas parce que rien ne s'est affiché que cela ne marche pas.
Si vous tapez ifconfig, l'interface tun0 d'openvpn doit apparaître :

Votre fichier de configuration sauvegardé et testé, lancez le service avec la commande

service openvpn start
Lien vers le fichier : cliquez ici Copier le code

Vous pouvez regarder le log pour voir ce que le démarrage a donné avec

tail -f /var/log/syslog
Lien vers le fichier : cliquez ici Copier le code

Exemple :

Si vous avez configuré openvpn pour qu'il ait son propre log, alors tapez

tail -f /etc/openvpn/openvpn.log
Lien vers le fichier : cliquez ici Copier le code

Sur le serveur openvpn une route c'est bien mise automatiquement pour indiquer que tout le traffic vers 10.8.0.0 doit passer par tun0

Vérifiez que le service fonctionne correctement en regardant si l'interface tun0 a été crée. Pour cela tapez

ifconfig tun0
Lien vers le fichier : cliquez ici Copier le code

Exemple de visuel

tun0 doit s'afficher

Normalement c'est fait automatiquement mais pour que le service openvpn se lance automatiquement au démarrage faites :

sudo update-rc.d openvpn defaults
Lien vers le fichier : cliquez ici Copier le code

N'oubliez pas de permettre à votre firewall de laisser passer le flux entrant vers votre serveur OpenVpn avec une commande du type

iptables -t filter -A INPUT -p udp --dport 1194 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 1194 -j ACCEPT
Lien vers le fichier : cliquez ici Copier le code

Et il faut également autoriser le transfert du trafic depuis le tunnel openvpn vers vos machines internes et inversement.
Les règles ci-dessous autorisent le trafic venant du tunnel vers n'importe quelle machine interne uniquement pour le port 80 (HTTP).
Dans le sens retour, n'importe quel trafic sera autorisé à repartir dans le tunnel :

#Accepter le flux entrant depuis le tunnel vpn vers le réseau interne pour les ports 80 et 443 en TCP :
iptables -t filter -A FORWARD -p tcp --dport 80 -j ACCEPT -i tun0
iptables -t filter -A FORWARD -p tcp --dport 443 -j ACCEPT -i tun0

#Accepter n'importe quel flux vers le tunnel vpn
iptables -t filter -A FORWARD -j ACCEPT -o tun0
Lien vers le fichier : cliquez ici Copier le code

Sur un routeur avec un firmware DD-WRT connecté en frontal sur Internet, j'avais également dû natter le traffic d'internet à destination du serveur openvpn ainsi :

iptables -t nat -I PREROUTING -p udp -d $(nvram get wan_ipaddr) --dport 1194 -j DNAT --to 192.168.2.125:1194
Lien vers le fichier : cliquez ici Copier le code

Avec cette configuration vous pouvez atteindre votre serveur openvpn depuis votre client openvpn.

Par contre votre client openvpn ne pourra pas atteindre une machine située sur le réseau local du serveur openvpn.

Si vous voulez cela il y a encore des choses à faire.

Il faut par exemple que les serveurs situés dans votre réseau local connaissent la route à utiliser pour atteindre les clients VPN.

Si vous avez un routeur sur votre réseau local, le plus simple est d'y ajouter une route qui permettra à vos clients internes de trouver leur chemin pour revenir vers les clients VPN.
En supposant qu'ici 192.168.2.125 est l'ip du serveur openvpn, sur un routeur avec une distrib type linux (comme un dd-wrt), l'ajout de la route se fera avec une commande de ce type :

route add -net 10.8.0.0 netmask 255.255.255.0 gw 192.168.2.125 eth0
Lien vers le fichier : cliquez ici Copier le code

Si vous voulez traiter au cas par cas vos serveur, sur un Windows, inspirez vous de cette commande pour ajouter la route qui indique qu'il faut passer par le serveur OpenVpn pour atteindre les clients VPN :

route add -p 10.8.0.0 MASK 255.255.255.0 192.168.2.125 METRIC 1 IF 13
Lien vers le fichier : cliquez ici Copier le code

Côté clients OpenVpn, de base il ne savent contacter que le serveur OpenVpn.
Pour qu'ils sachent joindre les machines situées dans le LAN du serveur OpenVpn, c'est à dire ici des machines en 192.168.2.xxx, alors il faut leur indiquer la route à prendre.
Pour cela sur le serveur OpenVpn éditez
/etc/openvpn/server.conf

et faites un push :

Au cas où, pour effacer cette route faites :

route delete 10.8.0.0
Lien vers le fichier : cliquez ici Copier le code

D'après le wiki d'openvpn, il faut s'assurer que l'ip forwarding est activé car souvent ce n'est pas le cas, et effectivement chez moi sans cela ca ne fonctionnait pas.
Pour activer l'ip forwarding, tapez la commande ci-dessous.
Pour la rendre permanente vous pouvez l'inclue dans votre script qui paramètre iptables au boot :

sysctl -w net.ipv4.ip_forward=1
Lien vers le fichier : cliquez ici Copier le code

Une autre technique pour rendre le changement permanent est d'ajouter cette ligne dans
/etc/sysctl.conf

net.ipv4.ip_forward = 1
Lien vers le fichier : cliquez ici Copier le code

Tout devrait maintenant fonctionner.
Par défaut, sauf indication contraire dans /etc/openvpn/server.conf
les logs sont visibles dans le tronc commun avec la commande

tail -f /var/log/messages
Lien vers le fichier : cliquez ici Copier le code

Au niveau firewall sur le serveur OpenVpn,
il faut permettre le trafic entrant (en provenance du routeur) vers le service OpenVpn.

Ajouter également 2 règles pour autoriser le transfert de paquets :

#Permettre le trafic entrant pour le port d'openVpn en provenance du routeur, cad le port 1194
iptables -t filter -A INPUT -p udp --dport 1194 -j ACCEPT

# Permettre le trafic initié du VPN vers le LAN
iptables -I FORWARD -i tun0 -o eth0 -s 10.8.0.0/24 -d 192.168.2.0/24 -m conntrack --ctstate NEW -j ACCEPT

# Permettre au trafic établi d'aller et venir
iptables -I FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
Lien vers le fichier : cliquez ici Copier le code

On arrive maintenant à des notes que j'ai prise pendant mes galères de mise en place.

Après lecture de ce site :
http://www.nimlabs.org/dirtynat.html

J'ai tenté de natter du réseau 10.8.0.0 (tun0) vers le 192.168.2.0 (eth0) en reprenant la syntaxe donnée par le site :

iptables -v -t nat -A PREROUTING -d 192.168.2.0/24 -j NETMAP --to 10.8.0.0/24
iptables -v -t nat -A PREROUTING -i tap0 -d 10.8.0.0/24 -j NETMAP --to 192.168.2.0/24
iptables -v -t nat -A POSTROUTING -o tap0 -s 192.168.2.0/24 -j NETMAP --to 10.8.0.0/24
iptables -v -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j NETMAP --to 192.168.2.0/24
echo 1 > /proc/sys/net/ipv4/ip_forward
Lien vers le fichier : cliquez ici Copier le code

Par exemple ci-dessous pour test j'ai modifié le certificat de mon autorité racine. La connexion d'un client échoue alors et on voit dans les logs un TLS handshake failed :

Sur https://help.ubuntu.com/community/Internet/ConnectionSharing
Pour mettre en place le nat, on indiquait une autre technique :

sudo iptables -A FORWARD -o eth0 -i tun0 -s 192.168.2.0/24 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -F POSTROUTING
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Lien vers le fichier : cliquez ici Copier le code

Toujours d'après http://www.nimlabs.org/dirtynat.html
il était indiqué que le serveur devait répondre aux requêtes ARP du réseau local (192.168.) sur l'eth0
Pour que le proxy ARP automatique fonctionne, le serveur VPN devait penser qu'il avait une route différente pour le sous-réseau des clients en VPN.

ip addr add 192.168.2.125/24 dev tun0
echo 1 > /proc/sys/net/ipv4/conf/tap0/proxy_arp
echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
Lien vers le fichier : cliquez ici Copier le code

J'ai trouvé intéressant de noter dans cet article du monde informatique que la version V5.6 RC1 de Linux prennait maintenant en charge le VPN gratuit et open source WireGuard. Est-ce l'avenir ?

J'ai cherché rapidement et je suis tombé sur cet article qui explique comment l'installer. A suivre ..

 

On m'a aussi parlé de Pivpn. cet article de Korben montre comment l'installer. Cela semble tout automatiser pour l'installation du serveur OpenVpn. Après j'imagine que c'est pour accéder au raspberry pi sur lequel on l'a installé. Si vous souhaitez accéder à des machines situées sur votre réseau local, il faudra donc jouer un peu avec iptables, l'activation du routage etc

Pages Web

Site WebDescription
Doc.ubuntu-fr.orgDoc d'installation d'OpenVPN
Guide.ubuntu-fr.orgGuide de mise en place d'OpenVPN
System-linux.euInstallation et configuration d’un client Openvpn Windows
Wiki.debian.orgConfigure openvpn on a Debian server and client

Téléchargement(s)

NomSite Web d origineDescription
Putty V0.63 http://www.chiark.greenend.org... Client ssh Putty
WinSCP_V4.1.8.iso http://winscp.net/eng/download... Client ftp et sftp de référence pour Windows
9157OpenVpnSchem.vsdx Schéma visio qui représente l'infrastructure
9157_server.conf_complet.... Fichier de configuration server.conf d'OpenVpn complet
9157_server.conf_sans_com... Fichier de configuration server.conf d'OpenVpn sans commentaires


Article(s) précédent(s)

2