Introduction
Cet article explique comment monter une passerelle VPN PPTP (très simple à mettre en oeuvre) sur Linux Debian. Il y a pleins d’article sur le sujet sur internet. Pour une raison x ou y, il a fallu que j’en consulte beaucoup pour avoir une solution fonctionnelle de bout en bout.
Une passerelle vous permet de router le traffic de votre périphérique au travers de la passerelle. la passerelle n’est pas un point terminal. elle doit donc être capable de faire suivre (forwarder) le traffic au prochain “saut” (HOP)
Trois éléments sont importants:
- installation et configuration du serveur de tunnel PPTP
- configuration du serveur pour l’autoriser a forwardé le traffic entre deux interfaces réseau
- configuration du firewall
Installation et configuration du serveur PPTP
Installez le package du serveur pptpd depuis un compte utilisateur autorisé ou depuis de compte root.
compteadmin@vps123456:~$ sudo apt-get install pptpd
....
compteadmin@vps123456:~$
Editez le fichier de configuration /etc/pptpd.conf pour ajouter la configuration réseau a appliquer. Ici, on autorise la creation de 10 tunnels. Les IP d’interconnection seront sur le reseau 192.168.5.0/25 dans notre exemple. Attention: le subnet a choisir doit etre différents de celui du reseau du PC et du réseau de la gateway. c’est une interconnection. Donc n’importe quel subnet pourrait etre mis. Cela dit, on préfere utiliser des IP dans les réseaux “brulés” 10.0.0.0/8 ou 192.168.0.0/16. Mais ils sont souvent utilisés par les box ou les réseaux d’entreprise.
compteadmin@vps123456:~$ sudo vi /etc/pptpd.conf
....
localip 192.168.5.5-14
remoteip 192.168.5.235-244
compteadmin@vps123456:~$
Editez le fichier de configuration /etc/ppp/pptpd-options pour modifier les options des tunnels
compteadmin@vps123456:~$ sudo vi /etc/ppp/pptpd-options
....
ms-dns 8.8.8.8
ms-dns 8.8.4.4
nobsdcomp
noipx
mtu 1490
mru 1490
compteadmin@vps123456:~$
Certaines configurations sur internet indiquent que l’on peut indiquer des valeurs pour mtu et mru. cela dit, en fonction des configurations des réseaux ou est configuré votre client VPN, ces valeurs ne sont pas adéquates.
Les comptes utilisateurs sont créés dans le fichier /etc/ppp/chap-secrets. les droits de ce fichier sont réservés uniquement a root, sinon cela représenterait une faille de sécurité. Il est important de respecter le format: les champs doivent être séparés par un caractère de tabulation ou un/des espaces Voici un exemple de compte:
compteadmin@vps123456:~$ sudo vi chap-secrets
....
# client server secret IP addresses
nomutilisateur * motdepasseutilisateur *
compteadmin@vps123456:~$ sudo pptpd restart
compteadmin@vps123456:~$
Autoriser le serveur à forwarder les données
Par défaut, un serveur ne se compte pas comme un routeur et les packets ne sont pas forwardable d’une interface vers une autre:
compteadmin@vps123456:~$ sudo cat /proc/sys/net/ipv4/ip_forward
0
compteadmin@vps123456:~$
Vous pouvez écrire la valeur 1 dans le fichier up_forward pour activer le routage mais cela ne sera par persistent: au prochain redémarrage du serveur, la valeur sera de nouveau écrasées. Pour cela, nous allons modifier les paramètres du serveur et les appliquer:
compteadmin@vps123456:~$ sudo vi /etc/sysctl.conf
.....
net.ipv4.ip_forward=1
compteadmin@vps123456:~$ sudo sysctl -p /etc/sysctl.conf
net.ipv4.ip_forward = 1
compteadmin@vps123456:~$
Configurer le firewall
Le firewall a un role essentiel: celui de natter le traffic provenant du tunnel avant d’être envoyé vers la route par defaut du serveur. Sans cela, point de salut: il serait impossible de recevoir les packets en réponse.
Voici les commandes necessaires pour la configuration du firewall dans notre exemple de configuration. Le traffic est natté vers l’interface ens3 de mon serveur. Cela pourrait être eth0. Utilisez ifconfig pour récupérer la bonne valeur.
compteadmin@vps123456:~$ sudo iptables -I INPUT -p tcp --dport 1723 -m state --state NEW -j ACCEPT
compteadmin@vps123456:~$ sudo iptables -I INPUT -p gre -j ACCEPT
compteadmin@vps123456:~$ sudo iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE
compteadmin@vps123456:~$ sudo iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -s 192.168.5.0/24 -j TCPMSS --clamp-mss-to-pmtu
compteadmin@vps123456:~$
La première règle autorise le traffic entrant sur le port 1723 de pptp.
la seconde règle autorise le traffic GRE pour les tunnels.
La troisième règle natte le traffic vers l’inteface réseau ens3
La quatrième règle … mystère.
Pour les rendre persistente, ajoutez les a votre script de configuration du firewall trouvée sur internet et modifiée.
#!/bin/sh
### BEGIN INIT INFO
# Provides: start and stop iptable
# Required-Start: $local_fs $network
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop iptable with rules
# Description: start and stop uptables with rules
### END INIT INFO
FW_start() {
echo "[Démarrage du pare-feu]"
# Supprime tous les filtres
iptables -F
iptables -t filter -F
iptables -t nat -F
iptables -t mangle -F
# Ne pas casser les connexions déjà établies
iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# SSH
iptables -t filter -A INPUT -p tcp --dport 2222 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 2222 -j ACCEPT
# PPTP
iptables -I INPUT -p tcp --dport 1723 -m state --state NEW -j ACCEPT
iptables -I INPUT -p gre -j ACCEPT
iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -s 192.168.5.0/24 -j TCPMSS --clamp-mss-to-pmtu
echo "Filtrages [OK]"
# Attribut une politiques "ACCEPT" aux tables
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t filter -P INPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT
echo "Politiques [OK]"
}
FW_stop() {
echo "[Arret du pare-feu]"
# Supprime tous les filtres
iptables -F
iptables -t filter -F
iptables -t nat -F
iptables -t mangle -F
# Attribut une politiques "ACCEPT" aux tables
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t filter -P INPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT
}
W_restart() {
FW_stop;
sleep 2;
FW_start;
}
case "$1" in
'start')
FW_start
;;
'stop')
FW_stop
;;
'restart')
FW_restart
;;
'status')
iptables -L
iptables -t nat -L
iptables -t mangle -L
;;
*)
echo "Usage: firewall {start|stop|restart|status}"
;;
esac