VPN sur Raspberry Pi

Rédigé par Yacine - 01 janvier 2013

VPN quésaco?

le réseau privé virtuel (Virtual Private Network ou VPN) correspond en fait à une interconnexion de réseaux une technique de « tunnel ». Cela consiste à utiliser Internet comme support de transmission en utilisant un protocole de « tunnellisation » (en anglais tunneling), c'est-à-dire encapsulant les données à transmettre de façon chiffrée. On parle alors de VPN pour désigner le réseau ainsi artificiellement créé. Ce réseau est dit virtuel car il relie deux réseaux « physiques » (réseaux locaux) par une liaison Internet, et privé car seuls les ordinateurs des réseaux locaux de part et d'autre du VPN peuvent accéder aux données en clair.

 

Le VPN permet donc d'obtenir une liaison sécurisée à moindre coût, si ce n'est la mise en œuvre des équipements terminaux. En contrepartie, il ne permet pas d'assurer une qualité de service car le flux de transmissions dépend des deux contreparties.

 

Le VPN vise à apporter certains éléments essentiels dans la transmission de données : l'authentification (et donc l'identification) des interlocuteurs, la confidentialité des données (le chiffrement vise à les rendre inutilisables par quelqu'un d'autre que le destinataire). Aussi tous les accès à Internet via VPN seront alors vus à partir de l'adresse IP du serveur VPN et non plus par celle de la machine cliente. (source : Wikipedia)

 

 

Mise en place du serveur OpenVPN

 

Nous utiliserons OpenVPN qui est un logiciel libre et open source. Il est en outre facilement configurable sous une distribution Debian.

 

Nous allons commencer par l'installer:

 

 sudo apt-get install openvpn

On fait ensuite une copie des fichiers exemples qui nous servirons de base :

sudo mkdir /etc/openvpn/easy-rsa/
sudo cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/
sudo chown -R $USER /etc/openvpn/easy-rsa/

 

OpenVPN fonctionne par authentification avec des fichiers clés et certificats. C'est ces fichiers la que nous allons configurer et générer.

 

On commence donc par éditer le fichier /etc/openvpn/easy-rsa/vars:

 

 sudo nano /etc/openvpn/easy-rsa/vars

 

Cela vous ouvre le fichier, il faudra modifier les lignes suivantes à votre convenance:

 

export KEY_COUNTRY="FR"
export KEY_PROVINCE="IDF"
export KEY_CITY="Paris"
export KEY_ORG="LeShadowBlog"
export KEY_EMAIL="yacine@kerkouche.net"
export KEY_EMAIL=yacine@kerkouche.net
export KEY_CN=Rpi_CN
export KEY_NAME=Rpi_NAME
export KEY_OU=Rpi_OU
export PKCS11_MODULE_PATH=yacineRpi
export PKCS11_PIN=1234


Sauvegarder ce fichier avec CTRL + X puis Y puis la touche ENTREE.

 

Nous allons à présent générer les clés (.key) et les certificats (.crt):

 

 cd /etc/openvpn/easy-rsa/
source vars
./clean-all
./build-dh
./pkitool --initca
./pkitool --server server
sudo openvpn --genkey --secret keys/ta.key

 

Cela risque de prendre un certain temps. Profitez-en pour vous faire un café. Une fois la procédure fini il faut copier les clés et les certificats utiles pour le serveur dans le répertoire /etc/openvpn/:

 

 sudo cp keys/ca.crt keys/ta.key keys/server.crt keys/server.key keys/dh1024.pem /etc/openvpn/

 

Puis on crée un répertoire /etc/openvpn/jail dans lequel le processus OpenVPN sera chrooté (afin de limiter les dégâts en cas de faille dans OpenVPN) puis un autre répertoire /etc/openvpn/clientconf qui contiendra la configuration des clients:

 

 sudo mkdir /etc/openvpn/jail
sudo mkdir /etc/openvpn/clientconf 

 

Enfin on crée le fichier de configuration /etc/openvpn/server.conf:

 

 sudo nano /etc/openvpn/server.conf

 

Il faut alors copier le code ci-dessus et l'éditer à votre convenance:

 

 
# Serveur TCP/443
mode server
proto tcp
port 443
dev tun
# Cles et certificats
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
tls-auth ta.key 0
cipher AES-256-CBC
# Reseau
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.4.4"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
# Securite
user nobody
group nogroup
chroot /etc/openvpn/jail
persist-key
persist-tun
comp-lzo
# Log
verb 3
mute 20
status openvpn-status.log
log-append /var/log/openvpn.log

 

Ce fichier permet de créer un serveur VPN SSL routé basé sur le protocole TCP et utilisant le port HTTPS (443). Il s'agit bel et bien du port sécurisé, afin de permettre son accessibilité depuis des réseaux sécurisés par des Firewalls. Les clients obtiendrons une nouvelle adresse IP dans la palette 10.8.0.0/24.

 

On peut alors lancer le service OpenVpn avec la commande suivante:

 

 sudo service openvpn start

 

A ce stade les machines clientes vont pouvoir se connecter au serveur VPN qui à présent fonctionnel. Par contre impossible d'aller plus loin que ce dernier car l'adresse 10.8.0.x ne sera par routée en dehors de votre serveur. Il faut donc configurer le serveur pour qu'il joue le rôle de routeur entre l'interface VPN (tun0) et l'interface physique (eth0) et de NATeur entre les adresses en 10.8.0.x et son adresse IP réelle. Autrement dit, il faut faire l'interfaçage entre le serveur et internet, afin que le client connecté au serveur puisse avoir accès pleinement à internet.

 

Pour configurer le rouatge il faut taper la ligne de commande suivante:

 

 sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward' 

Il faut rendre ce paramétrage de routage permanent (même après un reboot), il faut donc modifier la ligne suivante au fichier /etc/sysctl.conf:

 

 #net.ipv4.ip_forward = 1 

Il suffit pour cela d'enlever le commentaire #:

 

 net.ipv4.ip_forward = 1 

 

En ce qui concerne la configuration de la translation d'adresse (NAT) taper en ligne de commande:

 

sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

 

De même, pour rendre cette règle de NAT persistante après un reboot du serveur, il faut commencer par créer un script de chargement de règles de Firewall (ou utiliser un script existant):

 

 sudo sh -c "iptables-save > /etc/iptables.rules"

 

Il faut ensuite modifier le fichier /etc/network/interfaces pour y ajouter la ligne suivante après la définition de votre interface réseau principale ("iface eth0 inet..."):

 

 pre-up iptables-restore < /etc/iptables.rules

 

Le serveur est maintenant prêt à accueillir les clients. Nous allons donc voir à présent comment déclarer un client sur le serveur.

 

Création d'un compte client OpenVPN

 

Nous allons créer une clés pour le client pcDistant (Il s'agit d'un exemple!), alors il suffit de saisir les commandes suivantes sur le serveur (autrement dit votre Raspberry Pi):

 

 cd /etc/openvpn/easy-rsa
source vars
./build-key pcDistant

 

-> si vous souhaitez protéger l'accès à vos clés par un mot de passe (c'est à dire qu'un mot de passe sera demandé à la monté du tunnel VPN), il faut utiliser la commande ./build-key-pass en lieu et place de ./buil-key.

 

Le script ./build-key va générer 3 fichiers dans le répertoire /etc/openvpn/easy-rsa/keys:

 

  • pcDistant.crt: Certificat pour le client
  • pcDistant.csr: Certificat à garder sur le serveur
  • pcDistant.key: Clés pour le client

On copie les fichiers nécessaires un sous répertoire du répertoire /etc/openvpn/clientconf/ préalablement créé:

 

sudo mkdir /etc/openvpn/clientconf/pcDistant/
sudo cp /etc/openvpn/ca.crt /etc/openvpn/ta.key keys/pcDistant.crt keys/pcDistant.key /etc/openvpn/clientconf/pcDistant/

 

On crée le fichier client.conf dans le répertoire /etc/openvpn/clientconf/pcDistant/

 

 sudo nano /etc/openvpn/clientconf/pcDistant/client.conf

 

Copier l'exemple ci-dessus, il faut remplacer A.B.C.D par l'adresse publique de votre serveur VPN que vous pouvez obtenir avec la commande wget -qO- ifconfig.me/ip):

 

# Client
client
dev tun
proto tcp-client
remote A.B.C.D 443
resolv-retry infinite
cipher AES-256-CBC
# Cles
ca ca.crt
cert pcDistant.crt
key pcDistant.key
tls-auth ta.key 1
# Securite
nobind
persist-key
persist-tun
comp-lzo
verb 3

 

Pour assurer la compatibilité avec le client Windows OpenVPN, on fait une copie du fichier client.conf vers client.ovpn

 

cd /etc/openvpn/clientconf/pcDistant/
sudo cp client.conf client.ovpn

 

On devrait ainsi avoir les fichiers suivants dans le répertoire /etc/openvpn/clientconf/pcDistant/:

 

  • ca.crt: Certificat du serveur
  • client.conf: Fichier de configuration du client OpenVPN (Linux, BSD, MacOS X)
  • client.ovpn: Fichier de configuration du client OpenVPN (Windows)
  • pcDistant.crt: Certificat du client
  • pcDistant.key: Clés du client
  • ta.key: Clés pour l'authentification

Il ne reste plus qu'à mettre ces fichiers dans une archive ZIP et de la transmettre sur le PC client:

 

 sudo zip pcDistant.zip *.* 

 

Pour utiliser la commande zip il faut au préalable installer le package qui permet de le faire. Pour cela:

sudo apt-get install zip

 

Utilisation du VPN à partir d'un poste Windows

 

Je vous conseille d'utiliser la solution libre “OpenVPN Windows” à télécharger sur leur site officiel http://openvpn.net.


Une fois installé, il suffit de décompresser l'archive pcDistant.zip dans le répertoire C:\Program Files\OpenVPN\config et de se connecter en utilisant OpenVPN GUI, que vous trouverez facilement dans votre menu Démarrer. Une fois OpenVPN GUI lancé, il apparaîtra en bas à droite de votre barre de tâche. Un clic droit dessus, puis sur connect, et vous voila connecter via votre VPN!

Faites virevolter cet article sur internet!

author_avatar

Auteur: Yacine

Ingénieur Financier et Ingénieur Informaticien.

Je suis passionné par la finance et l'économie le jour. Geek invétéré durant les heures les plus sombres, d'où le titre du blog : Le Shadow Blog.

Classé dans : Raspberry Pi - Mots clés : Raspberry Pi, VPN, OpenVPN, VPN, OpenVPN, Pi

18 commentaires

avatar

Inouag le mercredi 16 janvier 2013 à 12:04 #1

Salut Yacine,

Pour commencer, merci pour se tuto...

J'ai un petit sushi avec la commande "code" pour la partie "configuration de la translation d'adresse (NAT)" le terminal me renvoi :
"-bash: code : commande introuvable" ... avec ça je suis avancé!!!

Je suis sur une Salckware 13.37 (fraichement installé et pas sans mal!!!) mais je suis le tuto pour mon RP (debian wheezy)...

Merci d'avance...

Inouag

avatar

Yacine le mercredi 16 janvier 2013 à 12:17 #2

@Inouag :

Il s'agit d'une erreur de ma part lors de la rédaction de l'article. C'est maintenant corrigé!
N'hésite pas, si jamais tu rencontres d'autres difficultés ;)

avatar

Inouag le mercredi 16 janvier 2013 à 13:46 #3

Merci pour ta réactivité!!!

J'ai juste eu des pb avec le fichier vars mais en reflechissant 2sec...

je n'ai plus qu'a configurer ma slack pour profiter du vpn!!!


Merci.

avatar

Yacine le mercredi 16 janvier 2013 à 14:23 #4

@Inouag :

Ton VPN devrait être fonctionnel en suivant le tuto. Pour quelles raisons as-tu choisi Slackware ?

avatar

Inouag le mercredi 16 janvier 2013 à 16:55 #5

J'ai plusieurs pc a la maison tous sous linux (Ubuntu/gnome) mais j'aime bien bidouiller et j'ai fais le tour d'ubuntu!!! On m'a conseillé Slackware (plus underground, stable et secu...) mais bon je me connais j'fais nimp' et dans dix jours j'aurais tous cassé!!! à côté de ça j'ai RP et un arduino :-)

Salutation!

avatar

olivier le lundi 21 janvier 2013 à 00:57 #6

Bonjour, est-ce que tu pourrais détaillé ce qui est personnalisable ?,
tu cite a plusieurs reprises "modifiez le a votre convenance" mais n'ayant qu'une experience restrainte... je souhaiterais des precision sur les parametres recommendés ! :

Car dans le fichiers de conf ou tu force les adresses proposer en 10.X.X.X, je suis un peu perdu .. mes adresses locale en classe C sont en 192.168.0.X et l'ip ext de la freebox en 99.X.X.X .. donc le 10.X.X.X et les dns en 8.8.X.X je les force quand meme ?

avatar

kamicameleon le lundi 21 janvier 2013 à 01:02 #7

Très bonne question tiens !
je me la pose à chaque fois que je vois "modifier le a votre convenance"
Des exemples a proposé dans le cadre de nos raspberry pi connecté derriere nos freebox et a volonté d'acces pour infogerance depuis notre lieu de travail ?

avatar

Yacine le lundi 21 janvier 2013 à 01:37 #8

@olivier :
Si tu parles du fichier "/etc/openvpn/easy-rsa/vars", tout est personnalisable, il s'agit uniquement des données qui permettent d'informer le client. Comme l'organisation, le nom du VPN ... etc. Tu peux donc mettre ce que tu veux ici, cela n'aura aucune incidence sur le fonctionnement de ton VPN.

L'utilisation des adresses en 10.X.X.X n'a rien à voir avec tes adresses locales.
Tes adresses locales en 192.168.0.X sont celles attribuées par ta Freebox aux différents appareils connectés à cette dernière.
Celles en 10.X.X.X sont celles attribuées par le VPN aux différents clients qui s'y connecteront.

En ce qui concerne les DNS 8.8.8.8 et 8.8.4.4. Il s'agit de DNS public fournit par Google. Tu trouvera plus de précision sur ces derniers dans la documentation officielle fournit par Google que voici : https://developers.google.com/speed/public-dns/docs/using?hl=fr

Mais pour résumer, ils fonctionnent comme OpenDNS, qui permet de passer outre les DNS de son fournisseur d'accès internet.(les DNS n'étant que des serveurs qui permettent de convertir des noms de domaine (comme shadowblog.fr) en adresse IP (Celle de votre Freebox dans notre cas).

Google explique que ça accélère la navigation sur internet car leurs DNS sont mis à jour plus rapidement(Dans notre cas, ça ne nous impacte pas, car il s'agit d'un VPN et non pas d'un hébergement de site web). Mais surtout, cela améliore la sécurité en protégeant entre autre du DNS poisonning et des attaques DoS. Je te recommande donc d'utiliser ces DNS là.

@kamicameleon :
Tu veux parler d'infogérance de ton serveur ?

avatar

seb le vendredi 01 février 2013 à 21:32 #9

Tout d'abord merci pour ce tuto.

Étant novice en linux j'ai tout suivis à la lettre (presque bêtement des fois) et j'ai vu quelques erreurs.

sudo cp client.conf client.ovpn
Il faut penser à aller dans /etc/openvpn/clientconf/pcDistant/ avant de lancer cette commande.

sudo zip pcDistant.zip *.*
La commande n'est pas possible par défaut, il faut faire un "sudo apt-get install zip" pour installer zip sur le raspi.

Si ça peut aider les prochains... ^^

Sinon, quelques questions.
A aucun moment on ne rentre l'ip publique du serveur, on ne rentre que celle du pc distant. J'imagine qu'il faut configurer la box pour qu'une redirection de la demande de connexion au VPN arrive au raspi, mais quoi?
Comment ça se passe pour une connexion depuis une IP inconnus? Je voyais le serveur VPN comme un moyen de connecter mon pc de n'importe où vers le serveur pas uniquement d'un endroit précis vers le serveur.

avatar

Yacine le mardi 05 février 2013 à 21:45 #10

@seb :

Merci pour tes remarques. J'ai corrigé les petites erreurs que tu m'as signalé.

Sinon pour répondre à tes questions:
1- Dans la configuration du fichier conf du client on indique bien l'adresse IP du serveur et le port qui est utilisé (Il s'agit du fichier client.conf ou j'indique qu'il faut modifier A.B.C.D). J'ai laissé par défaut le port 443, mais il est possible de le modifier.
2- Oui il faut faire une redirection de port. Par exemple, moi qui utilise une Freebox, je redirige tout simplement le port 443 de la Freebox vers le port 443 de mon Raspberry Pi.
3- Peut importe l'IP inconnu, il est possible de se connecter à son serveur quelque soit l'ordi client distant, tant que ce dernier dispose des fichiers que nous avons zippé bien sûr. Et c'est d'ailleurs tout l'intérêt d'un VPN. Pour reprendre ta dernière phrase : Un VPN permet d'utiliser la connexion de son serveur à partir de n'importe quel PC, quelque soit l'endroit ou il se trouve !
N'hésite pas, si jamais je n'ai pas été suffisamment clair.

avatar

seb le mardi 12 février 2013 à 21:33 #11

J'avais compris que l'IP qu'on mettait dans client.conf c'était l'IP publique du client. C'est tout de suite plus logique et clair comme ça. :)
Merci pour la précision.

avatar

Arno le samedi 22 juin 2013 à 14:53 #12

> sudo sh -c "iptables-save > /etc/iptables.rules"
>
> Il faut ensuite modifier le fichier /etc/network/interfaces
> pour y ajouter la ligne suivante après la définition de votre
> interface réseau principale ("iface eth0 inet..."):
>
> pre-up iptables-restore < /etc/iptables.rules

Bonjour et merci pour ce tuto, qui correspond exactement à ce que je recherchais, par contre je ne comprends pas comment adapter ces 2 étapes à mon cas...

J'utilise un simple script qui lance des commandes iptables les unes après les autres, et que j'ai placé dans /etc/init.d/.
Si j'utilise vos 2 commandes, les règles seront figées, et il faudra que je pense à les relancer à chaque fois que je modifierai mon /etc/init.d/firewall, c'est bien ça ?

avatar

David le mardi 07 janvier 2014 à 16:34 #13

Hello,

J'ai une question : lorsque je reboot le Raspberry je dois retaper 2 commandes :
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
sudo service openvpn start

Est-il possible que ça se fasse au démarrage de l'OS ou via un "raccourci" sur le bureau ?

Merci
David

avatar

dissezfr le lundi 20 janvier 2014 à 00:09 #14

Excellent tuto, clair et concis. Merci !

avatar

エロ動画ファンタジー le samedi 22 juillet 2017 à 15:12 #15

Definitely, what a great site and instructive posts, I definitely will bookmark your site.All the Best!

avatar

エロ動画無修正 le lundi 24 juillet 2017 à 09:29 #16

Greetings from Los angeles! I'm bored at work so I decided to check out your site on my iphone during lunch break.

I really like the knowledge you provide here and can't wait to
take a look when I get home. I'm amazed at how quick your blog loaded on my phone ..
I'm not even using WIFI, just 3G .. Anyways, superb site!

avatar

エロ動画 le vendredi 04 août 2017 à 19:07 #17

Nice blog here! Also your website loads up fast!
What host are you using? Can I get your affiliate link to your host?
I wish my web site loaded up as fast as yours lol

avatar

vpnranks reviews le vendredi 18 août 2017 à 07:58 #18

you're in point of fact a just right webmaster. The web site loading pace
is incredible. It kind of feels that you are doing any distinctive trick.
Moreover, The contents are masterwork. you have performed a excellent activity
on this subject!

Écrire un commentaire

Quelle est la première lettre du mot tchj ? : 

Réseaux Sociaux

Rechercher

Catégories

Derniers articles

Twitter

Mots clés