OpenVPN et Debian 8

Billet posté le 1 août 2015

Petite intro des familles

Il y a de ça quelques années j’avais mis en place des configurations OpenVPN sur d’anciennes distributions puis je ne m’en suis pas trop servi jusqu’à récemment.

Ce que décrit Korben (http://korben.info/installer-openvpn.html) me convient pas car Korben utilise OpenVPN AS qui supporte que jusqu’à deux utilisateurs simultanés ou bien il faut passer par une licence payante. De ce fait dans cet article nous nous tournons vers la version d’OpenVPN qui est soumis à l’AGPL.

La configuration que je connaissais ainsi que le paramétrage ont un peu changé.

OpenVPN OpenVPN

Tout d’abord posons un peu le contexte :

  • distribution sous Debian 8 - 64 bits
  • un VPS à l’étranger
  • un peu moins de 800 mo de RAM
  • 1 vCPU
  • openvpn 2.3.4-5

J’ai fait quelques recherches sur le web et je suis tombé sur cette page (http://www.damiengustave.fr/mise-en-place-dun-vpn-avec-openvpn-2-3-et-easy-rsa-3/) sauf qu’elle est plutôt orientée Ubuntu et que la configuration du client VPN n’est pas packagée tout en un. Je me propose ici de partir sur la très bonne base de Damien et d’ajouter les quelques différences qui j’ai dû apporter en étant sous Debian 8.

Les opérations à réaliser côté serveur VPN

On charge un module noyau (tun) et on installe openvpn :

modprobe tun
apt-get install openvpn
/etc/init.d/openvpn stop

On procède à l’installation d’easyrsa qui nous permet de faire l’autorité de certification (CA), clé privées et publiques pour notre serveur ainsi que pour les clients VPN :

cd /root
apt-get install git
git clone https://github.com/OpenVPN/easy-rsa.git
cd /root/easy-rsa/easyrsa3/
cp vars.example vars
vim vars

Dans le fichier vars il faut modifier que les informations suivantes :

    set_var EASYRSA_REQ_COUNTRY
    set_var EASYRSA_REQ_PROVINCE
    set_var EASYRSA_REQ_CITY
    set_var EASYRSA_REQ_ORG
    set_var EASYRSA_REQ_EMAIL
    set_var EASYRSA_REQ_OU
    set_var EASYRSA_KEY_SIZE

Il est important de modifier ces valeurs afin qu’elles soient correctes.

Ensuite, nous passons à l’initialisation de la PKI (https://fr.wikipedia.org/wiki/Infrastructure_%C3%A0_cl%C3%A9s_publiques) :

./easyrsa init-pki

La PKI étant maintenant initialisée nous pouvons créer l’autorité de certification (CA) :

./easyrsa build-ca

(un mot de passe sera demandé, c’est le mot de passe qui vous permet de protéger votre CA !)

On est loin d’en avoir encore fini. En effet, maintenant il faut créer le certificat serveur VPN ainsi que la clé associée :

./easyrsa build-server-full $(hostname -f) nopass

On va générer tant qu’à faire le certificat pour notre premier client / utilisateur :

./easyrsa build-client-full monuser nopass

Puis on en profite aussi pour générer les paramètres Diffie-Hellman (https://fr.wikipedia.org/wiki/%C3%89change_de_cl%C3%A9s_Diffie-Hellman) :

./easyrsa gen-dh

Et enfin on effectue quelques copies de fichiers :

cp /root/easy-rsa/easyrsa3/pki/dh.pem /etc/openvpn/
cp /root/easy-rsa/easyrsa3/pki/ca.crt /root/easy-rsa/easyrsa3/pki/private/$(hostname -f).key /root/easy-rsa/easyrsa3/pki/issued/$(hostname -f).crt /etc/openvpn/
zcat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

Le fichier de configuration du serveur VPN qui est /etc/openvpn/server.conf :

port 443
proto tcp
dev tun
ca ca.crt
cert vps-low.lovetux.net.crt     <---- à changer par le bon nom de fichier !
dh dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3

Quelques remarques sur le fichier /etc/openvpn/server.conf :

  • il écoute sur le port 443 sur le protocole TCP
  • il faut changer la valeur du paramètre cert
  • la plage IP qui sera utilisée est 10.8.0.0/24, modifiez-la si besoin
  • on considère qu’une fois le VPN établi tout le trafic doit passer par celui-ci
  • enfin on met une verbosité de 3, si vraiment vous avez des problèmes il est possible de mettre 9

On est presque prêt à démarrer le service openvpn sauf qu’il faut modifier avant le fichier /etc/default/openvpn afin qu’il contienne la ligne suivante : AUTOSTART=“server”

Puis on démarre les services openvpn : /etc/init.d/openvpn start

On peut vérifier le bon lancement du service en regardant le fichier /var/log/syslog ainsi que la sortie de la commande ifconfig tun0 :

Aug  1 17:34:17 vps-low ovpn-server[695]: TCPv4_SERVER link local (bound): [undef]
Aug  1 17:34:17 vps-low ovpn-server[695]: TCPv4_SERVER link remote: [undef]
Aug  1 17:34:17 vps-low ovpn-server[695]: MULTI: multi_init called, r=256 v=256
Aug  1 17:34:17 vps-low ovpn-server[695]: IFCONFIG POOL: base=10.8.0.4 size=62, ipv6=0
Aug  1 17:34:17 vps-low ovpn-server[695]: ifconfig_pool_read(), in='soliman,10.8.0.4', TODO: IPv6
Aug  1 17:34:17 vps-low ovpn-server[695]: succeeded -> ifconfig_pool_set()
Aug  1 17:34:17 vps-low ovpn-server[695]: IFCONFIG POOL LIST
Aug  1 17:34:17 vps-low ovpn-server[695]: soliman,10.8.0.4
Aug  1 17:34:17 vps-low ovpn-server[695]: MULTI: TCP INIT maxclients=1024 maxevents=1028
Aug  1 17:34:17 vps-low ovpn-server[695]: Initialization Sequence Completed

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 B)  TX bytes:397 (397.0 B)

Il nous faut autoriser notre serveur à servir de passerelle (gateway) :

echo 1 > /proc/sys/net/ipv4/ip_forward
cat /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -L -v

Vous pouvez souffler on a déjà fait du bon boulot !

On fait une pause et on résume ce qui a déjà été réalisé :

  • les logiciels ont été installés
  • on a crée notre autorité de certification
  • on a créer le certificat serveur ainsi que sa clé associée
  • on a aussi crée un certificat client ainsi que sa clé associée
  • on a démarré les services du serveur OpenVPN

Côté client ou sur notre poste de travail, tablette ou téléphone intelligent

Dans cette section il est nécessaire de comprendre que l’utilisateur qui va bénéficier de la connexion VPN n’est peut-être pas informaticien et il faut lui simplifier la vie.

Tout d’abord suivant son système d’exploitation il faudra installer le bon programme :

Reste plus que le fichier de configuration client à créer. Rappelons que le but est d’avoir qu’un seul fichier à donner à notre utilisateur que l’on peut découper comme ceci :

  • configuration cliente openvpn
  • la CA
  • le certificat client
  • la clé privée du client

Dit autrement voici comment construire le fichier :

client
dev tun
proto tcp
remote <hostname ou ip publique du serveur> 443
resolv-retry infinite
nobind
key-direction 1
persist-key
persist-tun
comp-lzo
verb 3
cipher BF-CBC

<ca>
copier le contenu du fichier /root/easy-rsa/easyrsa3/pki/ca.crt
</ca>

<cert>
copier le contenu de /root/easy-rsa/easyrsa3/pki/issued/monutilisateur.crt
(ne pas tout prendre, seulement ce qu'il y a entre -----BEGIN CERTIFICATE----- et -----END CERTIFICATE-----)
(je précise qu'il faut bien que -----BEGIN CERTIFICATE----- et -----END CERTIFICATE-----
soient bien dans la section)
</cert>

<key>
copier le contnue de /root/easy-rsa/easyrsa3/pki/private/monutilisateur.key
</key>

Reste plus qu’à tester !

Tu prends le programme openvpn qui correspond à ton système d’exploitation et tu injectes le fichier de configuration client que nous avons défini plus haut. Si tout va bien une adresse IP dans la plage 10.8.0.0/24 sera attribuée au poste de travail. Que fait pour tester ? Lancer par exemple un traceroute ou bien demander quelle est l’adresse IP publique qui est maintenant vue. J’ai plusieurs utilisateurs : on procède comment ?

On retourne sur le serveur OpenVPN et on effectue les commandes suivantes :

cd /root/easy-rsa/easyrsa3
./easyrsa build-client-full autreutilisateur nopass

Puis alors on suit à nouveau la procédure pour créer le fichier utilisateur qu’on donne à l’utilisateur.