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
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'
Pour configurer notre connexion IPSec nous utilisons Strongswan.
- name: Install strongswan
ansible.builtin.apt:
name: strongswan
update_cache: yes
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.
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 :
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
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
Pour utiliser des certificats, partez sur la base de l’installation précédente.
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.
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.
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.
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