4 votes

Comment puis-je forcer tout le trafic Internet à passer par un VPN PPTP tout en permettant l'accès au réseau local ?

J'ai un serveur sous Linux Mint 12 que je veux garder connecté à un VPN PPTP en permanence. Le serveur VPN est assez fiable, mais il tombe occasionnellement. Je veux donc faire en sorte que toute activité Internet soit désactivée si la connexion VPN est interrompue.

J'aimerais également trouver un moyen de le redémarrer automatiquement, mais ce n'est pas un problème aussi important puisque cela se produit assez rarement.

Je veux aussi pouvoir toujours me connecter à la boîte depuis mon réseau local, que le VPN soit activé ou non.

Voici à quoi ressemble mon ifconfig avec le VPN correctement connecté :

eth0      Link encap:Ethernet  HWaddr 00:22:15:21:59:9a  
          inet addr:192.168.0.171  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::222:15ff:fe21:599a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:37389 errors:0 dropped:0 overruns:0 frame:0
          TX packets:29028 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:37781384 (37.7 MB)  TX bytes:19281394 (19.2 MB)
          Interrupt:41 Base address:0x8000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1446 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1446 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:472178 (472.1 KB)  TX bytes:472178 (472.1 KB)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.10.11.10  P-t-P:10.10.11.9  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:23 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:1368 (1.3 KB)  TX bytes:1812 (1.8 KB)

Voici un iptables script que j'ai trouvé ailleurs et qui semblait correspondre au problème que j'essaie de résoudre, mais il a fini par bloquer tous les accès, mais je ne suis pas sûr de ce que je dois changer :

#!/bin/bash

#Set variables
IPT=/sbin/iptables
VPN=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 10.`
LAN=192.168.0.0/24

#Flush rules
$IPT -F
$IPT -X

#Default policies and define chains
$IPT -P OUTPUT DROP
$IPT -P INPUT DROP
$IPT -P FORWARD DROP

#Allow input from LAN and tun0 ONLY
$IPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A INPUT -i tun0 -m conntrack --ctstate NEW -j ACCEPT
$IPT -A INPUT -s $LAN -m conntrack --ctstate NEW -j ACCEPT
$IPT -A INPUT -j DROP

#Allow output from lo and tun0 ONLY
$IPT -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
$IPT -A OUTPUT -o tun0 -m conntrack --ctstate NEW -j ACCEPT
$IPT -A OUTPUT -d $VPN -m conntrack --ctstate NEW -j ACCEPT
$IPT -A OUTPUT -j DROP
exit 0

Merci pour votre aide.

3voto

mgorven Points 29736

Ces règles iptables ne permettent pas le trafic vers le serveur VPN, donc le VPN ne peut pas être établi. Vous avez besoin des règles suivantes dans le fichier OUTPUT avant la finale DROP où 1.2.3.4 est l'adresse IP du serveur VPN. Ces règles autorisent les connexions TCP au port 1723 (le canal de contrôle PPTP) et les paquets GRE (le canal de données).

iptables --append OUTPUT --destination 1.2.3.4 --protocol tcp --dport 1723 --jump ACCEPT
iptables --append OUTPUT --destination 1.2.3.4 --protocol gre --jump ACCEPT

2voto

mgorven Points 29736

Il y a deux approches à cela, celle basée sur le routage et celle basée sur le pare-feu.

Approche du routage

La table de routage typique d'une machine non connectée à un VPN ressemble à ceci :

10.23.11.0/24 dev eth0
default via 10.23.11.1

La première route est destinée aux hôtes du réseau local, et la seconde route envoie tout le reste vers la passerelle par défaut. Lorsqu'il est connecté à un VPN, la table de routage ressemble à ceci (où 1.2.3.4 est l'IP publique du serveur VPN et 10.8.0.1 est l'IP privée du serveur VPN) :

10.23.11.0/24 dev eth0
1.2.3.4 via 10.23.11.1
default via 10.8.0.1

La première route est la même, et la troisième route est celle qui envoie tout sur le VPN. Notez cependant la deuxième règle : elle indique que pour atteindre l'IP publique du serveur VPN, les paquets doivent être envoyés via la passerelle par défaut. Ceci afin que les paquets tunnelisés créés par le client VPN atteignent réellement le serveur ; si cette route n'est pas en place, les paquets créés par le client VPN seront à nouveau envoyés sur le VPN et n'atteindront jamais le serveur.

Maintenant, si la troisième route est supprimée, les paquets destinés à n'importe quel endroit sur Internet en dehors du serveur VPN n'auront pas de route correspondante, et l'hôte ne les enverra donc jamais. Nous voulons donc que la table de routage ressemble à ceci lorsque le VPN n'est pas connecté :

10.23.11.0/24 dev eth0
1.2.3.4 via 10.23.11.1

Les hôtes du réseau local peuvent toujours être atteints, et le serveur VPN peut toujours être atteint (puisque nous devons être en mesure de démarrer le VPN), mais tout le reste ne sera pas acheminé. Obtenir cette configuration peut être un peu délicat, surtout si vous utilisez DHCP. Une configuration statique sur Debian impliquerait ce qui suit en /etc/network/interfaces cependant :

auto eth0
iface eth0 inet static
    address 10.23.11.10
    netmask 255.255.255.0
    up ip route add 1.2.3.4 via 10.23.11.1

Notez qu'il n'y a pas de gateway puisque c'est ce qui installe la route par défaut.

L'inconvénient de cette approche est que le trafic non VPN vers le serveur VPN est toujours autorisé à sortir en clair. Si vous exécutez d'autres services sur le serveur VPN et que vous devez vous assurer qu'ils sont protégés, vous devrez utiliser l'approche du pare-feu.

Editar : @JamesRyan suggère que cette approche est fragile car une route par défaut pourrait être ajoutée automatiquement ou accidentellement. Une autre approche consiste à ajouter une route trou noir, qui envoie le trafic à un endroit où il ne sera pas acheminé plus loin. Cependant, cela ne fonctionnera pas avec une route par défaut ajoutée automatiquement, car elle utilise déjà la métrique 0, la plus haute priorité. La route par défaut doit toujours être supprimée, mais quelque chose comme ce qui suit peut être ajouté.

default via 127.255.255.255

Approche pare-feu

L'idée ici est de bloquer tout le trafic sortant sur l'interface physique, à l'exception du trafic tunnelé créé par le client VPN et du trafic destiné au LAN. Le trafic à autoriser pour le VPN dépend du protocole utilisé. PPTP utilise le port TCP 1723 comme canal de contrôle, et GRE comme le tunnel réel. OpenVPN utilise le port UDP 1194. Les règles du pare-feu ressembleraient à ceci :

iptables --append OUTPUT --out-interface eth0 --destination 10.23.11.0/24 --jump ACCEPT
iptables --append OUTPUT --out-interface eth0 --destination 1.2.3.4 --protocol tcp --dport 1723 --jump ACCEPT
iptables --append OUTPUT --out-interface eth0 --destination 1.2.3.4 --protocol gre --jump ACCEPT
iptables --append OUTPUT --out-interface eth0 --jump REJECT

La première règle accepte le trafic pour le réseau local. Les deuxième et troisième règles acceptent le trafic VPN vers le serveur VPN. La quatrième règle rejette tout autre trafic sortant de l'interface physique.

La seule autre chose que vous devrez peut-être accepter est le DNS si vous utilisez un serveur DNS qui n'est pas sur le LAN, car le client VPN doit probablement faire une recherche DNS afin de trouver le serveur VPN. La règle suivante insérée avant le REJECT autoriserait le trafic DNS vers le service DNS public de Google.

iptables --append OUTPUT --out-interface eth0 --destination 8.8.8.8 --protocol udp --dport 53 --jump ACCEPT

1voto

JamesRyan Points 8138

Ajouter une autre route par défaut avec une métrique plus élevée pointant vers une interface nulle. Lorsque le VPN n'est pas disponible, la deuxième route s'activera et bloquera le trafic.

0voto

mulaz Points 10362

Il ne s'agit pas d'une queston iptables - vous n'avez pas besoin d'iptables pour cela.

Il suffit de définir la route par défaut pour passer par le VPN, et c'est tout. Vous pouvez également ajouter une autre route par défaut avec une métrique plus faible à utiliser, lorsque le VPN est hors service.

Votre réseau local est directement connecté, il a donc la priorité sur la passerelle par défaut.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X