Retourner à la liste des tutos

Partage de connexion VPN 2 cartes reseau


Activation du Forward


Première vérification, s'assurer que le Forward est active sur le serveur.
Éditer le fichier /etc/sysctl.conf et vérifier que la ligne net.ipv4.ip_forward=1 est bien présente.

IPTable rules


Ensuite on va mettre en place un petit script qui va rediriger le trafic de notre carte réseau VPN Virtuelle (tap0) vers par exemple une NIC Ethernet physique (eth0).

Voici le script:

Bash

iptables -t nat -A POSTROUTING -o tap0 -j MASQUERADE
iptables -A FORWARD -i tap0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o tap0 -j ACCEPT


Il faut bien évidemment exécuter ce script en ROOT.
Dans un second temps, il faut mettre en place un serveur DHCP. Cette étape n'est pas obligatoire mais peut dans certains cas être intéressante.

Le problème c'est qu'avec ce script, les règles ne sont pas prises en compte. Il faut donc installer le paquet iptables-persistent. Puis après avoir défini ces règles à la main, on enregistre la configuration avec:
Bash
iptables-save


Serveur DHCP


Installation du serveur DHCP:
Bash
apt install isc-dhcp-server


Puis il faut demander au serveur DHCP de s'occuper de certaines cartes réseau. Ici on veut attribuer une adresse IP aux clients qui se connectent sur le eth0. Donc on ajoute eth0 dans le fichier de configuration /etc/default/isc-dhcp-server:

Bash
INTERFACES="eth0"


Ensuite on met en place un certains nombre de règles (mask, dns routeur, plages ip ...)


Exemple de configuration du serveur DHCP /etc/dhcp/dhcpd.conf:

Bash

ddns-update-style none;
log-facility local7;
default-lease-time 600;
max-lease-time 7200;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.0.255;
option routers 192.168.0.1;
option domain-name-servers 192.168.0.1, 1.1.1.1;
option domain-name "lan_vpn";
option ntp-servers 192.168.0.1;

subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.10 192.168.0.100;
}


Ne pas oublier de donner une adresse IP à l'interface en question, en passant par le fichier de configuration /etc/network/interfaces

Connexion VPN


Enfin on peut démarrer notre connexion VPN avec:
Bash
sleep 10
/usr/sbin/openvpn --config /path/to/config/file.ovpn --daemon


Cette ligne devrait être ajoutée au Cron ROOT. On spécifie le chemin précis de OpenVPN car le shell est potentiellement minimal à ce stade et n'a peut-être pas connaissance du répertoire de ce programme.
On attend une dizaine de secondes afin de laisser le réseau se mettre en place avant de démarrer le VPN.

Si le serveur doit renseigner et partager son adresse IP publique régulièrement à un autre serveur (DynDNS), alors le VPN peut poser problème. Dans le cas présent, j'ai ajouté une route spéciale qui indique que le site dont je me sert pour connaitre mon IP doit être contacté en passant par une autre carte réseau que la tap0.

Un petit script à ajouter au /etc/rc.local avec comme contenu:
Bash
ip route add xxx.xxx.xxx.xxx/32 via 192.168.0.1 dev ethX

Fait très bien l'affaire !

Rediriger seulement une interface vers le VPN



Pour éviter que tous le trafic du serveur passe par la connexion VPN, on peut modifier quelques règles de routage.
Lorsqu'on démarre une connexion avec OpenVPN, 3 règles viennent s'ajouter à la table de routage:

0.0.0.0/1 -> GW du VPN
128.0.0.0/1 -> GW du VPN
<ip_du_serveur_vpn> -> GW classique du serveur

Il faut alors supprimer les deux premières:
Bash

ip route delete 0.0.0.0/1
ip route delete 128.0.0.0/1


Ensuite, il faut créer une règle pour définir la GW par défaut d'une nouvelle table de routage:
Bash

ip route add default via 10.9.0.1 dev tap0 table 11


Avec cette commande, on dit que la GW par défaut pour tous les réseaux sera 10.9.0.1 sur l'interface tap0.
On dit également que cette règle s'applique pour la table de routage qui a l'ID 11. On choisit 11 arbitrairement, en effet, les ID < 10 sont réservés, on aurait pu prendre 10 si on le souhaitait.

Pour le moment cette table de routage n'est utilisée par personne..
On va donc indiquer au système qui doit utiliser cette table:

Bash

ip rule add iif eth1 table 11


Grace à cette commande, on informe le système que si l'interface eth1 cherche une route, il devra se référer à la table de routage avec l'ID 11.

Il ne faut pas oublier de faire du NAT sur ce serveur et sur le serveur VPN, ou de faire un IP MASQUERADE pour que la GW du serveur VPN sache à qui renvoyer les paquets. En effet, la GW du serveur VPN distant n'a aucune connaissance de notre LAN (192.168.2.0/24).

Normalement l'IP MASQUERADE ou le NAT ont déjà été mis en place précédemment, cf IPTable rules.

Si l'on opte pour ne rediriger que le trafic en provenance d'une interface bien particulière, alors on peut retirer les deux dernières lignes du script iptables de la partie IPTable rules.

On peut vérifier les routes que le système va utiliser avec la commande:

Bash

route -n


On peut également vérifier que la route de la table de routage 11 est bien enregistrée:

Bash

ip route show table 11


Enfin on peut tester et observer quelle route notre système va emprunter par défaut, et quelle route il emprunterait si la requête venait de notre LAN sur l'interface eth1:

Bash

ip -o route get 1.1.1.1
ip -o route get 1.1.1.1 from 192.168.2.2 iif eth1


Voila voila !