Client VPN PPTP configurer pour certaines applications

Bien le bonjour,
En ce moment, il y a de nombreuse offre pour devenir “anonyme” sur Internet. Une de ses offres : Le VPN

[size=150]I) Comment mettre en place une connection VPN en PPTP en tant que Client, sur Debian[/size]

Tout d’abord il faut installer le paquet:

apt-get install pptp-linux

Editer le fichier chap-secrets

nano /etc/ppp/chap-secrets

Mettre * si l’adresse ip fournit par votre serveur VPN est dynamique

[code]# Secrets for authentication using CHAP

client server secret IP addresses

nom_utilisateur PPTP votre_mot_de_passe *[/code]

exemple:

[code]# Secrets for authentication using CHAP

client server secret IP addresses

loupa PPTP tchatchatcha *[/code]

Creer le fichier nom_du_service

nano /etc/ppp/peers/nom_du_service

Exemple:

nano /etc/ppp/peers/PhantomPeer

Et copier dedans:

#Il faut modifier les nom de type $tatata$ pty "pptp $AdresseIP_ou_NomDNS_du_serveur_VPN$ --nolaunchpppd" name $nom_utilisateur$ remotename PPTP require-mppe-128 file /etc/ppp/options.pptp ipparam $nom_du_service$ persist

L’option persist permet de réactiver la connexion automatiquement en cas de perte de connexion

Exemple:

pty "pptp pptp.phantompeer.com --nolaunchpppd" name loupa remotename PPTP require-mppe-128 file /etc/ppp/options.pptp ipparam PhantomPeer persist

Tester la connexion avec la commande de diagnosique

pon nom_du_service debug dump logfd 2 nodetach

exemple:

pon PhantomPeer debug dump logfd 2 nodetach

Pour lancer la commande sans diagnostique de connexion

pon nom_du_service

Stopper la connexion:

poff nom_du_service

[size=150]II) Rendre la connexion automatique au démarrage de vote Debian[/size]

Editer le fichier “interfaces”

nano /etc/network/interfaces

Ajouter dans le fichier

auto tunnel iface tunnel inet ppp provider nom_du service

Exemple:

auto tunnel iface tunnel inet ppp provider PhantomPeer

[size=150]III) Configuration de la Debian pour utiliser le VPN pour certaines applications:[/size]

J’image qu’il y a certain qui aimerai ne pas balancer tout leur trafic sur le VPN mais juste quelques applications.
Surtout ceux qui possède plusieurs ordinateurs et qui utilise certain service qui ne marcherai plus dans le cas d’une direction complete du traffic sur le VPN.

J’ai donc, après quelques recherches, trouver une solution.
Je remercie PascalHambourg pour son exemple sur le routage avancé, ça m’a permis de mettre en place cette partie.

Explication du fonctionnement:
[ul]- Il faudra tout d’abord créer un table celle du système, elle servira à creer une route par default differente de celle utilisé pour acceder directement à Internet.

  • Les paquets seront marqué par apport au protocole et au port choisit (ex: protocole tcp, port 80 => Marquage des paquet http en mode connecté)
  • Une fois marqué, les paquets seront router vers la nouvelle table de routage créé
  • Etant donnée que la nouvelle table de routage possèdera l’interface du VPN en route par default, les paquets marqué seront acheminé directement sur l’interface du VPN.[/ul]

Pour la création de la nouvelle table de routage:

echo 1 VPN >> /etc/iproute2/rt_tables

Changez “VPN” par n’importe quel nom:

[size=120]1) Diriger certaine application sur l’interface du VPN grace à un script[/size]

Créer un fichier puis ajouter le script dedans

Voici le script:

[code]#! /bin/sh

#On récupere l’adresse ip de l’interface VPN.
#Modifier ppp0 si ce n’est pas l’interface de votre VPN
IpInterfaceVpn=$(ifconfig ppp0 | sed -n ‘s/.adr:([^ ]).*/\1/p’)

#A modifier suivant votre configuration
MonInterfaceLan=‘eth1’
InterfaceViaInternet=‘eth0’
InterfaceViaVPN=‘ppp0’
NomTable=‘VPN’

#Désactiver la validation d’adresse source sur l’interface du VPN
sysctl -w net.ipv4.conf.ppp0.rp_filter=0

#Si vous voulez rajouter le marquage d’autre paquets reçus, c’est ici.
#Marquer les paquets reçus par l’interface LAN
iptables -t mangle -A PREROUTING -i $MonInterfaceLan -p tcp --dport 80 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -i $MonInterfaceLan -p udp --dport 80 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -i $MonInterfaceLan -p udp --dport 5500:5510 -j MARK --set-mark 0x1

#Si vous voulez rajouter le marquage d’autre paquets émis, c’est ici.
#Marquer les paquets émis par le routeur vers internet si nécessaire
iptables -t mangle -A OUTPUT -o $InterfaceViaInternet -p tcp --dport 80 -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -o $InterfaceViaInternet -p udp --dport 80 -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -o $InterfaceViaInternet -p udp --dport 5500:5510 -j MARK --set-mark 0x1

#Router les paquets marqués avec la table de routage alternative
ip rule add fwmark 0x1 table $NomTable

#Créer une route par défaut dans la table alternative
ip route add default dev $InterfaceViaVPN via $IpInterfaceVpn table $NomTable

#Router l’adresse source avec l’adresse de l’interface de sortie
iptables -t nat -A POSTROUTING -o $InterfaceViaVPN -j SNAT --to $IpInterfaceVpn[/code]

Le rendre executable via la commande

chmod +x votre_fichier

C’est une solution, mais ce n’est pas la meilleur car le script ne marchera pas si vous le mettez au demarrage de l’ordinateur.
Il vous faudra l’activer vous meme.

De plus, tout routage spécifique pour une connexion pptp doit être definis spécifiquement dans les config de pptp-linux (merci PascalHambourg)

[size=120]2) Diriger certaine application sur l’interface du VPN de façon automatique[/size]

Nous allons dans cette partie travailler dans les dossiers:
[ul]- /etc/ppp/ip-up.d => Scripts lancés apres l’etablissement de la connexion PPTP

  • /etc/ppp/ip-down.d => Scripts lancés apres une coupure ou la désactivation de la connexion PPTP[/ul]

Dans ces dossiers, il nous est possible d’utiliser plusieurs variable d’environnement dans nos scripts fournis par le service pppd:
[ul]- $PPP_IFACE= Nom de l’interface

  • $PPP_TTY= Le téléscripteur (tty)
  • $PPP_SPEED= La vitesse du lien
  • $PPP_LOCAL= L’adresse ip local du VPN (chez nous)
  • $PPP_REMOTE=L’adresse ip sur le serveur VPN distant[/ul]

Nous allons donc tout d’abord créé le script lancé au demarrage de la connexion:

nano /etc/ppp/ip-up.d/ActivationRoutageVPN

[code]#!/bin/sh

#A modifier suivant votre configuration
MonInterfaceLan=‘eth1’
InterfaceViaInternet=‘eth0’
NomTable=‘VPN’

#Désactiver la validation d’adresse source sur l’interface du VPN
sysctl -w net.ipv4.$PPP_IFACE.rp_filter=0

#Si vous voulez rajouter le marquage d’autre paquets reçus, c’est ici.
#Marquer les paquets reçus par l’interface LAN
iptables -t mangle -A PREROUTING -i $MonInterfaceLan -p tcp --dport 80 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -i $MonInterfaceLan -p udp --dport 80 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -i $MonInterfaceLan -p udp --dport 5500:5510 -j MARK --set-mark 0x1

#Si vous voulez rajouter le marquage d’autre paquets émis, c’est ici.
#Marquer les paquets émis par le routeur vers internet si nécessaire
iptables -t mangle -A OUTPUT -o $InterfaceViaInternet -p tcp --dport 80 -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -o $InterfaceViaInternet -p udp --dport 80 -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -o $InterfaceViaInternet -p udp --dport 5500:5510 -j MARK --set-mark 0x1

#Router les paquets marqués avec la table de routage alternative
ip rule add fwmark 0x1 table $NomTable

#Créer une route par défaut dans la table alternative
ip route add default dev $PPP_IFACE via $PPP_LOCAL table $NomTable

#Router l’adresse source avec l’adresse de l’interface de sortie
iptables -t nat -A POSTROUTING -o $PPP_IFACE -j SNAT --to $PPP_LOCAL[/code]

Jusqu’à là, ça ne change pas trop de mon script précédent, à part les variable d’environnement que j’ai ajouté.

Ne pas oubliez les droits d’execution du fichier

chmod +x /etc/ppp/ip-up.d/ActivationRoutageVPN

Nous allons ensuite créé le script lancé en cas de fin de connexion

nano /etc/ppp/ip-down.d/DesactivationRoutageVPN

[code]#!/bin/sh

#A modifier suivant votre configuration
MonInterfaceLan=‘eth1’
InterfaceViaInternet=‘eth0’
NomTable=‘VPN’

#Suppression des routes ajouté dans le script précédent.
iptables -t mangle -D PREROUTING 3
iptables -t mangle -D PREROUTING 2
iptables -t mangle -D PREROUTING 1

iptables -t mangle -D OUTPUT 3
iptables -t mangle -D OUTPUT 2
iptables -t mangle -D OUTPUT 1

#Suppression de la route pour les paquets marqués dans la table de routage alternative
ip rule del fwmark 0x1 table $NomTable

#Suppression de la route par default issue de la table alternative
ip route del default dev $PPP_IFACE via $PPP_LOCAL table $NomTable

Suppression de la route nat permettant de router l’adresse source avec l’adresse de l’interface de sortie

iptables -t nat -D POSTROUTING 2[/code]

Vérifié bien le numero de vos anciennes regles :mrgreen: :

iptables -t mangle -L --line-numbers iptables -t nat -L --line-numbers

Voila, j’ai essayé de détailler le plus possible pour que ce tuto soit accessible pour tout le monde
J’espere que ça aidera des gens :wink: .

N’esitez pas si vous voyez des ameliorations à faire.
Bonne journée à tous


Les articles et les documentations
http://pptpclient.sourceforge.net/ => Site officiel de pptp-linux (Anglais)
http://bibabox.fr/tag/vpn/ => Une autre documentation sur la mise en place du Vpn PPTP (Français)
http://doc.ubuntu-fr.org/iptables => Documentation sur iptables (Français)

Les commandes, règles et routes liées à une interface pppN doivent être exécutées à chaque fois après l’établissement du VPN, et annulées après sa fermeture. Pour les automatiser il est possible de les mettre dans des scripts ad hoc placés dans /etc/ppp/ip-up.d/ et /etc/ppp/ip-down.d/. Cerise sur le gâteau, ils reçoivent le nom de l’interface dans la variable d’environnement $PPP_IFACE. L’identification du VPN peut se faire avec l’option de pppd “ipparam” dans le fichier /etc/ppp/peers/PhantomPeer, dont la valeur se retrouve dans la variable d’environnement $PPP_IPPARAM.

Très intéressant tout ça :023

ça marche nikel, j’ai ajouter une autre section du coup.
Par contre il vaut mieux utilisé la variable $PPP_LOCAL que $PPP_IPPARAM.

Les deux variables n’ont pas du tout le même rôle.
$PPP_LOCAL contient l’adresse IP configurée sur l’interface pppN, qui est généralement attribuée par le serveur. Sauf si elle est fixe ou dans une plage connue et univoque, elle ne permet pas d’identifier la connexion PPP parmi d’autres que pourrait faire la machine.
$PPP_IPPARAM le peut au contraire, puisqu’elle contient une valeur inscrite dans le fichier d’options /etc/ppp/peers/ de la connexion.

Exemple chez moi : mon routeur Debian établit deux types de connexions PPP gérées par pppd :

  • une connexion internet sur une ligne ADSL
  • des connexions VPN PPTP
    Pour chaque type de connexion, il faut exécuter des commandes différentes à l’établissement et à la terminaison. Je peux différencier chaque type de connexion PPP dans les scripts grâce à $PPP_IPPARAM.

Evidemment, si pppd ne doit gérer qu’une seule connexion, alors $PPP_IPPARAM n’est pas nécessaire.

Autres remarques :

  1. Il n’est pas nécessaires de supprimer la route liée à $PPP_IFACE lors de la terminaison de la connexion : les routes liées à une interface sont automatiquement supprimées lorsque celle-ci est désactivée.

  2. Il n’est pas nécessaire de recréer et supprimer les règles, routes… qui ne dépendent pas de la présence du VPN, du nom de l’interface ou de son adresse. Il suffit de les créer une fois pour toutes au démarrage du système. Ici, les seule choses qui varient sont la route par défaut de la table de routage alternative et la règles iptables SNAT.

  3. Je trouve plus sûr et clair de supprimer une règle iptables en remplaçant -A par -D dans la commande de création plutôt qu’en la désignant par son numéro, ce qui est risqué en cas de modification des règles.