Installation & Configuration

Pour mettre en place un VPN IPSec/L2TP, nous avons réalisé un ansible que nous allons vous détailler par la suite. Pour lance ce ansible, changer d’abord dans l’hôte et les variables les adresses IP vous correspondant. Puis faites : ansible-playbook -i hosts playbook.yml --ask-pass

Configuration Iptables

Dans un premier temps, nous configurons le firewall pour laisser les flux udp nécessaires au VPN.

- name: Allow traffic vpn
  ansible.builtin.iptables:
    table: nat
    chain: POSTROUTING
    out_interface: "{{ INTERFACE }}"
    jump: SNAT
    to_source: "{{ IP_SERVEUR }}"

- name: Accept port 500
  ansible.builtin.iptables:
    chain: INPUT
    protocol: udp
    destination_port: 500
    jump: ACCEPT

- name: Accept port 4500
  ansible.builtin.iptables:
    chain: INPUT
    protocol: udp
    destination_port: 4500
    jump: ACCEPT

- name: Open port 1701
  shell: iptables -I INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT

Et nous configurons les paramètres IPV4.

- name: Enable ipv4 forward
  ansible.posix.sysctl:
    name: net.ipv4.ip_forward
    value: '1'

- name: Disable ipv4 accept redirects
  ansible.posix.sysctl:
    name: net.ipv4.conf.all.accept_redirects
    value: '0'

- name: Disable ipv4 send redirects
  ansible.posix.sysctl:
    name: net.ipv4.conf.all.send_redirects
    value: '0'

- name: Disable ipv4 rp filter
  ansible.posix.sysctl:
    name: net.ipv4.conf.default.rp_filter
    value: '0'

- name: Disable ipv4 accept source route
  ansible.posix.sysctl:
    name: net.ipv4.conf.default.accept_source_route
    value: '0'

- name: Disable ipv4 send redirects
  ansible.posix.sysctl:
    name: net.ipv4.conf.default.send_redirects
    value: '0'

- name: Enable icmp ignore bogus error responses
  ansible.posix.sysctl:
    name: net.ipv4.icmp_ignore_bogus_error_responses
    value: '1'

Installation et configuration de IPSec/L2TP avec PSK

IPSec : Strongswan

Pour configurer notre connexion IPSec nous utilisons Strongswan.

- name: Install strongswan
  ansible.builtin.apt:
    name: strongswan
    update_cache: yes

Ensuite nous modifiions le fichier /etc/ipsec.conf

version 2.0

config setup
  charondebug="all"
  uniqueids=yes
  strictcrlpolicy=no

conn shared
  leftnexthop=%defaultroute
  left={{ IP_SERVEUR }}
  right=%any
  authby=secret
  rekey=no
  keyingtries=5
  dpddelay=30
  dpdtimeout=120
  dpdaction=clear
  ike=3des-sha1,3des-sha2,aes-sha1,aes-sha1;modp1024,aes-sha2,aes-sha2;modp1024,aes256-sha2_512

conn l2tp-psk
  auto=add
  leftprotoport=17/1701
  rightprotoport=17/%any
  type=transport
  also=shared

conn xauth-psk
  auto=add
  leftsubnet=0.0.0.0/0
  also=shared

Dans ce fichier leftid correspond à l’adresse IP externe du serveur.

Puis on ajoute un secret (dans le fichier /etc/ipsec.secrets) pour permettre à l’utilisateur de se connecter avec une clé partagée.

{{ IP_SERVEUR }}   %any  : PSK "{{ SECRET_KEY }}"

Pour générer une bonne clé secrete, nous vous conseillons d’utiliser la commande : openssl rand -hex 30.

A ce stade, vous pouvez vérifier que tous vos paramètres sont bon en entrant la commande : sudo ipsec verify.

Ainsi que :

netstat -anu
Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat
udp        0      0 127.0.0.1:4500          0.0.0.0:*
udp        0      0 192.168.197.135:4500    0.0.0.0:*
udp        0      0 127.0.0.1:500           0.0.0.0:*
udp        0      0 192.168.197.135:500     0.0.0.0:*
udp        0      0 192.168.197.135:68      192.168.197.254:67      ESTABLISHED
udp        0      0 0.0.0.0:631             0.0.0.0:*
udp        0      0 0.0.0.0:57022           0.0.0.0:*
udp        0      0 0.0.0.0:5353            0.0.0.0:*
udp6       0      0 ::1:500                 :::*
udp6       0      0 :::52320                :::*
udp6       0      0 :::5353                 :::*

qui vous montre que les connexions sur les ports 500 et 4500 sont ouvertes.

L2TP : xl2tpd

Pour configurer la couche L2TP, nous utilisons le package xl2tpd et ppp.

- name: Install xl2tpd
  ansible.builtin.apt:
    name: xl2tpd
    update_cache: yes

- name: Install ppp
  ansible.builtin.apt:
    name: ppp
    update_cache: yes

Nous configurons ensuite xl2tpd en modifiant le fichier /etc/xl2tpd/xl2tpd.conf :

[global]
port = 1701

[lns default]
ip range = 10.0.1.10-10.0.1.100
local ip = 10.0.1.1
require chap = yes
refuse pap = yes
require authentication = yes
name = {{ VPN_NAME }}
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

Dans cette configuration :

  • ip range permet de définir la plage ip des adresses que le vpn va attribuer
  • local ip correspond à l’adresse ip du serveur au niveau vpn

Nous ajoutons ensuite des secrets chap, dans le fichier /etc/ppp/chap-secrets.

# {{ USER_ANDROID }} {{ VPN_NAME }} "{{ PASSWD_ANDROID }}" "{{ ANDROID_IP }}"
{{ USER_ANDROID }} * {{ PASSWD_ANDROID }} *

Chaque ligne correspond à un utilisateur, et pour chacun nous définissons un login, mot de passe et si on le souhaite une adresse ip (dans notre cas nous avons mis une * qui laisse le vpn attribuer une adresse automatiquement).

Puis nous configurons PPP (fichier /etc/ppp/options.xl2tpd):

+mschap-v2
ipcp-accept-local
ipcp-accept-remote
ms-dns 8.8.8.8
ms-dns 8.8.4.4
noccp
auth
mtu 1280
mru 1280
proxyarp
lcp-echo-failure 4
lcp-echo-interval 30
connect-delay 5000

Restart

Pour que les modifications soit prises en compte nous redémarrons ipsec et l2tp :

- name: restart service ipsec
  ansible.builtin.service: 
    name: ipsec
    state: restarted
 
- name: restart service xl2tpd
  ansible.builtin.service: 
    name: xl2tpd
    state: restarted

Installation et configuration de IPSec/L2TP avec Certificat

Pour utiliser des certificats, partez sur la base de l’installation précédente.

Echange de certificats

Coté SRV01

Pour établir la connection entre windows et le serveur SRV01, il faut générer un certificat :

openssl req -new -out vpn.pem

Enter PEM pass phrase:
Country: FR
State: 
Locality: Kremlin
Organization: EPITAF
OU:
CN: vpn
E-mail:
Challenge password:
Optional company name:

Remplissez les champs avec vos informations.
Ajoutez ce certificat à /etc/ssl/private/vpn.pem et /etc/ipsec.d/certs.

Coté Windows

Téléchargez dans l’authorité de certification, le nouveau certificat que vous venez de générer avec openssl. Ouvrez le et passez le en .cer en utilisant DER encoded binary X.509.

Exportez ensuite le certificat public de votre CA sur SRV01.

Coté SRV01

Changez l’extension du certificat d’autorité :

openssl x509 -inform DER -in windows.cer -outform PEM -out windows.pem

Puis ajoutez le aux certificats d’ipsec dans le dossier /etc/ipsec.d/cacerts.

Configuration ipsec

Modifiez le fichier /etc/ipsec.conf en ajoutant les lignes :

leftid=@vpn.pem
leftcert=/etc/ipsec.d/certs/vpn.pem

Sortez la clé privée du certificat :

openssl req -new -keyout vpn.pem

Et ajoutez la à /etc/ipsec.d/private/vpn.pem

Pour finir, modifiez /etc/ipsec.secrets

{{ IP_SERVEUR }}   %any  : RSA vpn.pem "passphrase"

Et redémarrez ipsec

sudo systemctl restart ipsec