Installation d'un serveur VPN sous debian wheezy avec openvpn

Posted on lun. 02 février 2015 in tuto

Salut à tous !

Aujourd'hui petit tuto sur l'installation d'un VPN sur serveur debian wheezy !

C'est quoi un VPN ?

Un Virtual Private Network, c'est un réseau comme votre réseau local chez vous, mais qui est disponible via Internet, avec du chiffrement en prime. Les intérêts sont multiples, par exemple accéder à un ordinateur qui se trouve chez vous, ou contourner un pare-feu pour jouer en cours... *ahem* C'est aussi un excellent moyen de masquer votre trafic dans le réseau local et d'avoir une ip de sortie différente (celle de votre serveur), dans un autre pays par exemple.

Pour cela, il nous faut un serveur pour faire tourner notre serveur VPN, sur lequel les différents ordinateurs du VPN peuvent se connecter, et d'où l'accès internet sortira.

Allez, c'est parti !

Installation et PKI

Première étape, installer openvpn. Bah on va pas chercher compliqué :

apt-get update
apt-get upgrade
apt-get install openvpn

Ensuite, il faut générer une PKI (Public Key Infrastructure). C'est un système de clefs et de certificats qui permettra de chiffer le trafic. Openvpn propose tout ce qu'il faut pour le faire en quelques commandes :

mkdir /etc/openvpn/easy-rsa/
cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa

Il faut ensuite modifier le fichier vars pour modifier quelques options :

key 2048
export KEY_COUNTRY="FR"
export KEY_PROVINCE="FR"
export KEY_CITY="FR"
export KEY_ORG="exemple.com"
export KEY_EMAIL="exemple@exemple.com"

(remplacez les valeurs de KEY_ORG et KEY_EMAIL par vos valeurs)

Générez les certificats :

source vars
./clean-all
./build-dh
./pkitool --initca
./pkitool --server server
openvpn --genkey --secret keys/ta.key
cp keys/ca.crt keys/ta.key keys/server.crt keys/server.key keys/dh2048.pem /etc/openvpn/ 
mkdir /etc/openvpn/jail && mkdir /etc/openvpn/clientconf

Configuration serveur OpenVPN

La configuration de openvpn se trouve dans le fichier /etc/openvpn/server.conf :

    # Serveur UDP/1194
    mode server
    proto udp
    port 1194
    #Ici l'utilisation de tun va permettre de créer une interface réseau tun0 (par exemple) qui correspondra a notre vpn
    dev tun

    # Clés certificats
    ca ca.crt
    cert server.crt
    key server.key
    dh dh2048.pem
    tls-auth ta.key 1
    key-direction 0
    cipher AES-256-CBC

    # Réseau
    # Les ip distribuées aux machines seront de la forme 10.8.0.x
    server 10.8.0.0 255.255.255.0
    # Cette option permet a un client de joindre les autres clients du VPN. Si vous souhaitez utiliser votre VPN uniquement pour avoir une sortie réseau distance, vous pouvez ne pas mettre cette option.
    client-to-client
    push "redirect-gateway def1 bypass-dhcp"
    # On utilise les serveurs DHCP de google pour les clients, changez selon votre choix
    push "dhcp-option DNS 8.8.8.8"
    push "dhcp-option DNS 8.8.4.4"
    keepalive 10 120

    # Sécurité : le programme est lancé sans aucun droits et coincé dans le dossier (vide) jail.
    user nobody
    group nogroup
    chroot /etc/openvpn/jail
    persist-key
    persist-tun
    # On utilise de la compression pour soulager le réseau
    comp-lzo

    # Log
    verb 3
    mute 20
    status openvpn-status.log
    # On enregistre les logs dans un fichier dédié :
    log-append /var/log/openvpn.log

Pour que nos clients puissent accéder à internet, il va falloir faire suivre (forward) les paquets, il faut donc activer cette possibilité (bloquée par défaut). Pour cela, il faut exécuter la commande suivante :

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

Et pour que cette configuration soit conservée au reboot il vaut modifier le fichier /etc/sysctl.conf et décommenter la ligne :

net.ipv4.ip_forward = 1

Il faut aussi paramétrer le masquerading avec netfilter avec la commande

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

Pour ceux qui ont un firewall netfilter, pensez à rajouter les règles suivantes (a minima, pas de filtrage) :

    # iptables -t filter -A INPUT -p udp --dport 1194 -j ACCEPT
    # iptables -A FORWARD -i tun0 -j ACCEPT
    # iptables -A FORWARD -o tun0 -j ACCEPT
    # iptables -t filter -A OUTPUT -p udp --sport 1194 -j ACCEPT

Et voila pour le serveur !

Configuration clients

Maintenant, on prépare les configurations clients, toujours depuis le serveur, avec les certificats. Retenez bien le mot de passe du certificat pour vous connecter ensuite :

    # cd /etc/openvpn/easy-rsa
    # source vars
    # ./build-key-pass mon-serveur-vpn
    # cp /etc/openvpn/ca.crt /etc/openvpn/ta.key keys/mon-serveur-vpn.crt keys/mon-serveur-vpn.key /etc/openvpn/clientconf/mon-serveur-vpn/
    # cd /etc/openvpn/clientconf/mon-serveur-vpn/

Créez le fichier client.conf :

    # Client
    client
    dev tun
    proto udp
    #Ici remplacez A.B.C.D par l'IP de votre serveur
    remote A.B.C.D 1194
    resolv-retry infinite
    cipher AES-256-CBC

    # Clé
    ca ca.crt
    cert mon-serveur-vpn.crt
    key mon-serveur-vpn.key
    tls-auth ta.key 0
    key-direction 1

    # Sécurité
    nobind
    persist-key
    persist-tun
    comp-lzo
    verb 3

Pour des soucis de compatibilité, copiez le en lui donnant l'extension ovpn :

    # cp client.conf client.ovpn

Puis on crée une archive avec toute notre configuration client :

    # cd ..
    # tar zcvf vpnconf.tgz mon-serveur-vpn

Une fois cette partie effectuée, il vous suffit de récupérer et décompresser l'archive sur votre client et d'importer la configuration dans votre gestionnaire de connexion (networkmanager par exemple pour linux), en lui donnant le mot de passe du certificat.

Une fois connecté à votre VPN, vous pouvez aller sur internet pour afficher votre ip (j'utilise http://whatsmyip.net), et si tout va bien, vous verrez l'IP de votre serveur ! Et voila, votre VPN fonctionne !