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 :
Le mode TUN :
Pour les différences entre le mode bridgé et le mode routé (Bridging vs. routing) :
le mode bridgé est à utiliser si vous voulez :
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 Web | Description |
---|---|
Doc.ubuntu-fr.org | Doc d'installation d'OpenVPN |
Guide.ubuntu-fr.org | Guide de mise en place d'OpenVPN |
System-linux.eu | Installation et configuration d’un client Openvpn Windows |
Wiki.debian.org | Configure openvpn on a Debian server and client |
Téléchargement(s)
Nom | Site Web d origine | Description |
---|---|---|
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) suivant(s)
Article(s) précédent(s)
Article(s) en relation(s)
Commande pour effacer un fichier ou un répertoire sous Linux
Le routage sous un linux Ubuntu
Accepter tout le traffic au niveau d'un firewall linux avec Iptables
Créer son autorité de certification avec OpenSsl - à terminer
Configurer le OpenVPN Daemon sur un Linksys WRT54GL avec firmware DD WRT