Mettre en place un VPN L2TP/IPSEC

De Ikoula Wiki
Révision datée du 8 mars 2016 à 11:17 par Ikbot (discussion | contributions) (Robot : Remplacement de texte automatique -cloud computing +{{Template:Cloud computing}})
Jump to navigation Jump to search

Introduction

Un VPN (Virtual Private Network) est un système permettant de créer un lien direct entre des ordinateurs distants. On utilise notamment ce terme dans le milieu de la dématérialisation fiscale et dans le travail à distance, ainsi que pour l'accès à des structures de type cloud computing. L'avantage du L2TP (Layer 2 Tunelling Protocol) réside dans l'utilisation d'une clé prépartagée en plus des identifiants de connexion habituels. A cela s'ajoute IPSEC, une technologie d'encapsulation cryptée dans la trame IP.

Prérequis

Pour suivre ce tuto vous devez disposer de:

  • Une machine sous une distribution Linux (Debian 8, Fedora, CentOS, Ubuntu, Raspberry Pi, ...) Ne fonctionne pas sous Debian 8 à cause des repository d'OpenSwan qui n'existent plus
  • Connaître votre adresse ip publique, si vous ne la connaissez pas allez ici!

Tutoriel

Tout d'abord, loguez vous en root (ou via un utilisateur qui a les droits superuser). vous pouvez utiliser Putty pour vous connecter à une machine à distance via SSH ou ouvrez simplement un terminal si vous avez accès à l'interface graphique de votre machine.

Update et installation des paquets

Tout d'abord, mettez à jour votre machine et installez les repository nécessaires:

apt-get update && apt-get upgrade -y
apt-get install openswan xl2tpd ppp lsof

OpenSwan va vous poser des questions, répondez y avec les valeurs par défaut

Ajout des règles au firewall

Ensuite, nous allons ajouter une regle à iptables pour autoriser la trafic du VPN: (remplacez %SERVERIP% par l'ip de votre serveur)

iptables -t nat -A POSTROUTING -j SNAT --to-source %SERVERIP% -o eth0


Puis executez les commandes suivantes pour activer le routing des paquets IP:

echo "net.ipv4.ip_forward = 1" |  tee -a /etc/sysctl.conf
echo "net.ipv4.conf.all.accept_redirects = 0" |  tee -a /etc/sysctl.conf
echo "net.ipv4.conf.all.send_redirects = 0" |  tee -a /etc/sysctl.conf
echo "net.ipv4.conf.default.rp_filter = 0" |  tee -a /etc/sysctl.conf
echo "net.ipv4.conf.default.accept_source_route = 0" |  tee -a /etc/sysctl.conf
echo "net.ipv4.conf.default.send_redirects = 0" |  tee -a /etc/sysctl.conf
echo "net.ipv4.icmp_ignore_bogus_error_responses = 1" |  tee -a /etc/sysctl.conf
for vpn in /proc/sys/net/ipv4/conf/*; do echo 0 > $vpn/accept_redirects; echo 0 > $vpn/send_redirects; done
sysctl -p

Rendons les persistantes au redémarrage de la machine:

nano /etc/rc.local

et ajoutez à la fin juste avant le exit 0

for vpn in /proc/sys/net/ipv4/conf/*; do echo 0 > $vpn/accept_redirects; echo 0 > $vpn/send_redirects; done
iptables -t nat -A POSTROUTING -j SNAT --to-source %SERVERIP% -o eth+


Mise en place d'IPSEC


On crée un nouveau fichier de configuration ipsec:

mv /etc/ipsec.conf /etc/ipsec.conf.bak && nano /etc/ipsec.conf

puis collez-y ceci: En n'oubliant pas de remplacer %SERVERIP% par l'adresse ip du serveur

version 2 # conforms to second version of ipsec.conf specification

config setup
    dumpdir=/var/run/pluto/
    #in what directory should things started by setup (notably the Pluto daemon) be allowed to dump core?

    nat_traversal=yes
    #whether to accept/offer to support NAT (NAPT, also known as "IP Masqurade") workaround for IPsec

    virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v6:fd00::/8,%v6:fe80::/10
    #contains the networks that are allowed as subnet= for the remote client. In other words, the address ranges that may live behind a NAT router through which a client connects.

    protostack=netkey
    #decide which protocol stack is going to be used.

    force_keepalive=yes
    keep_alive=60
    # Send a keep-alive packet every 60 seconds.

conn L2TP-PSK-noNAT
    authby=secret
    #shared secret. Use rsasig for certificates.

    pfs=no
    #Disable pfs

    auto=add
    #the ipsec tunnel should be started and routes created when the ipsec daemon itself starts.

    keyingtries=3
    #Only negotiate a conn. 3 times.

    ikelifetime=8h
    keylife=1h

    ike=aes256-sha1,aes128-sha1,3des-sha1
    phase2alg=aes256-sha1,aes128-sha1,3des-sha1
    # https://lists.openswan.org/pipermail/users/2014-April/022947.html
    # specifies the phase 1 encryption scheme, the hashing algorithm, and the diffie-hellman group. The modp1024 is for Diffie-Hellman 2. Why 'modp' instead of dh? DH2 is a 1028 bit encryption algorithm that modulo's a prime number, e.g. modp1028. See RFC 5114 for details or the wiki page on diffie hellmann, if interested.

    type=transport
    #because we use l2tp as tunnel protocol

    left=%SERVERIP%
    #fill in server IP above

    leftprotoport=17/1701
    right=%any
    rightprotoport=17/%any

    dpddelay=10
    # Dead Peer Dectection (RFC 3706) keepalives delay
    dpdtimeout=20
    #  length of time (in seconds) we will idle without hearing either an R_U_THERE poll from our peer, or an R_U_THERE_ACK reply.
    dpdaction=clear
    # When a DPD enabled peer is declared dead, what action should be taken. clear means the eroute and SA with both be cleared.

On crée ensuite le preshared secret (la clé prépartagée):

nano /etc/ipsec.secrets

puis entrez cette ligne:

%SERVERIP%  %any:   PSK "VotreClePlusOuMoinsSecurisee"

Pensez à remplace %SERVERIP% par l'ip de votre serveur. si vous séchez pour la création de votre clé vous pouvez utilisez la commande suivante:

openssl rand -hex 30


On vérifie que tout se passe bien, vous utilisez donc cette commande:

ipsec verify

et vous devez obtenir:

Checking your system to see if IPsec got installed and started correctly:
Version check and ipsec on-path                                 [OK]
Linux Openswan U2.6.38/K3.13.0-24-generic (netkey)
Checking for IPsec support in kernel                            [OK]
 SAref kernel support                                           [N/A]
 NETKEY:  Testing XFRM related proc values                      [OK]
    [OK]
    [OK]
Checking that pluto is running                                  [OK]
 Pluto listening for IKE on udp 500                             [OK]
 Pluto listening for NAT-T on udp 4500                          [OK]
Checking for 'ip' command                                       [OK]
Checking /bin/sh is not /bin/dash                               [WARNING]
Checking for 'iptables' command                                 [OK]
Opportunistic Encryption Support                                [DISABLED]

Configuration de xl2tpd

Commençons par éditer un nouveau fichier de configuration:

mv /etc/xl2tpd/xl2tpd.conf /etc/xl2tpd/xl2tpd.conf.bak && nano /etc/xl2tpd/xl2tpd.conf

puis collez-y ceci:

[global]
ipsec saref = yes
saref refinfo = 30

;debug avp = yes
;debug network = yes
;debug state = yes
;debug tunnel = yes

[lns default]
ip range = 172.16.1.30-172.16.1.100
local ip = 172.16.1.1
refuse pap = yes
require authentication = yes
;ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

Configuration de PPP

Pour cette partie, nous allons de nouveau créer un nouveau fichier de configuration (trop de nouveau dans une seule phrase :3):

mv /etc/ppp/options.xl2tpd /etc/ppp/options.xl2tpd.bak && nano /etc/ppp/options.xl2tpd

puis insérez-y ceci:

require-mschap-v2
ms-dns 8.8.8.8
ms-dns 8.8.4.4
auth
mtu 1200
mru 1000
crtscts
hide-password
modem
name l2tpd
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4

Ici, j'ai utilisé les DNS publics de Google, libre à vous de les modifier et d'utiliser ceux de votre choix! ;)

Ajout des utilisateurs

ENFIN! Cette étape cruciale va vous permettre de définier les login et mot de passe des utilisateurs de votre vpn, modifiez simplement ce fichier:

nano /etc/ppp/chap-secrets

ci-dessous une ligne typique:

jean          l2tpd   0F92E5FC2414101EA            *


ATTENTION: ce fichier est sensible à la casse, si vous mettez une majuscule, vous devrez la conserver lorsque vous taperez votre login ou mot de passe.

Pour finir on redémarre

/etc/init.d/ipsec restart && /etc/init.d/xl2tpd restart



Cet article vous a semblé utile ?

1



Vous n'êtes pas autorisé à publier de commentaire.