Forum Freedom-IP

Forum d'entraide de la communauté Freedom-IP

Vous n'êtes pas identifié(e).

#1 2015-11-01 14:26:48

skuizy
Membre
Inscription : 2015-11-01
Messages : 7

[Résolu]Policy routing sur raspberry

Bonjour à tous,

Tout d’abord, désolé pour la tartine..

Après avoir pas mal galéré depuis hier pour mettre en place cette solution je m'en remet à vous !

D'après tout ce que j'ai pu lire sur internet, je n'en suis pas loin, mais il y a toujours quelque chose qui bloque....

Mon problème est le suivant :

Actuellement je peux soit être connecté au VPN (pptp) et rediriger tout mon traffic par l'interface ppp0 créée par le daemon, soit ne pas être connecté et tout mon traffic passe par l'interface eth0.

Je voudrais pouvoir être connecté en permanence au vpn et rediriger uniquement le traffic de certaines applications via l’interface ppp0.

Les distributions récentes n'autorisant plus le filtrage par PID, je lance donc mes applications avec un utilisateur différent, afin de filtrer par UID.

Ma config :
Machine / OS : RaspberryPI 2 sous raspbian jessie
Connexion à FIP : pptp

Voici l'état de ma connexion AVANT d'être connecté au VPN :

$ ifconfig
eth0      Link encap:Ethernet  HWaddr b8:27:eb:74:93:0e
          inet adr:192.168.0.122  Bcast:192.168.0.255  Masque:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:34139 errors:0 dropped:0 overruns:0 frame:0
          TX packets:37830 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:1000
          RX bytes:4361590 (4.1 MiB)  TX bytes:11030373 (10.5 MiB)

lo        Link encap:Boucle locale
          inet adr:127.0.0.1  Masque:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:1337 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1337 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0
          RX bytes:368707 (360.0 KiB)  TX bytes:368707 (360.0 KiB)

$ ip route list table main
default via 192.168.0.1 dev eth0
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.122  metric 202

$ ip route list table novpn

$ sudo iptables -L -t filter
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

$ sudo iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

$ sudo iptables -L -t mangle
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

$ ip rule
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

Ensuite lorsque je me connecte à FIP :

$ sudo pon nl_fip

$ ifconfig

eth0      Link encap:Ethernet  HWaddr b8:27:eb:74:93:0e  
          inet adr:192.168.0.122  Bcast:192.168.0.255  Masque:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:39118 errors:0 dropped:0 overruns:0 frame:0
          TX packets:43037 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:1000 
          RX bytes:4946494 (4.7 MiB)  TX bytes:12216270 (11.6 MiB)

lo        Link encap:Boucle locale  
          inet adr:127.0.0.1  Masque:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:1529 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1529 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0 
          RX bytes:423803 (413.8 KiB)  TX bytes:423803 (413.8 KiB)

ppp0      Link encap:Protocole Point-à-Point  
          inet adr:10.99.0.44  P-t-P:10.99.0.1  Masque:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1496  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:149 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:3 
          RX bytes:1052 (1.0 KiB)  TX bytes:19308 (18.8 KiB)

$ ip route list table main

default dev ppp0  scope link 
default via 192.168.0.1 dev eth0 
10.99.0.1 dev ppp0  proto kernel  scope link  src 10.99.0.44 
178.33.89.168 via 192.168.0.1 dev eth0  src 192.168.0.122 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.122  metric 202 
$ ip route list table novpn

$ sudo iptables -L -t filter

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
$ sudo iptables -L -t nat

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
$ sudo iptables -L -t mangle

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
$ ip rule

0:	from all lookup local 
32766:	from all lookup main 
32767:	from all lookup default 

(l'IP publique de ma connexion est bien celle du VPN)

Je définis ensuite mes règles iprule/iproute/iptables comme ça afin de faire transiter tous les paquets via la table de routage novpn, sauf ceux qui seront marqués (en fonction de l'utilisateur) pour transiter via la table main (qui route bien vers le VPN comme on a pu le voir plus haut)

$ sudo ip rule add fwmark 0 table novpn
$ sudo ip rule add fwmark 2 table main

$ sudo ip route add default via 192.168.0.1 dev eth0 table novpn
$ sudo ip route add 192.168.0.0/24 src 192.168.0.122 dev eth0 table novpn

$ sudo iptables -t mangle -A PREROUTING -j MARK --set-mark 0
$ sudo iptables -t mangle -A OUTPUT --match owner --uid-owner vpnuser -j MARK --set-mark 2
$ sudo iptables -A OUTPUT --match mark --mark 2 --out-interface eth0 -j DROP

Ce qui me donne le résultat suivant :

$ ifconfig

eth0      Link encap:Ethernet  HWaddr b8:27:eb:74:93:0e  
          inet adr:192.168.0.122  Bcast:192.168.0.255  Masque:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:42211 errors:0 dropped:0 overruns:0 frame:0
          TX packets:45990 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:1000 
          RX bytes:5318327 (5.0 MiB)  TX bytes:13009663 (12.4 MiB)

lo        Link encap:Boucle locale  
          inet adr:127.0.0.1  Masque:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:1653 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1653 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0 
          RX bytes:459527 (448.7 KiB)  TX bytes:459527 (448.7 KiB)

ppp0      Link encap:Protocole Point-à-Point  
          inet adr:10.99.0.44  P-t-P:10.99.0.1  Masque:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1496  Metric:1
          RX packets:54 errors:0 dropped:0 overruns:0 frame:0
          TX packets:745 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:3 
          RX bytes:3383 (3.3 KiB)  TX bytes:132632 (129.5 KiB)

$ ip route list table main

default dev ppp0  scope link 
default via 192.168.0.1 dev eth0 
10.99.0.1 dev ppp0  proto kernel  scope link  src 10.99.0.44 
178.33.89.168 via 192.168.0.1 dev eth0  src 192.168.0.122 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.122  metric 202 
$ ip route list table novpn

default via 192.168.0.1 dev eth0 
192.168.0.0/24 dev eth0  scope link  src 192.168.0.122 
$ sudo iptables -L -t filter

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere             mark match  0x2
$ sudo iptables -L -t nat

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
$ sudo iptables -L -t mangle

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
MARK       all  --  anywhere             anywhere             MARK and 0x0

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
MARK       all  --  anywhere             anywhere             owner UID match vpnuser MARK set 0x2

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
$ ip rule

0:	from all lookup local 
32764:	from all fwmark 0x2 lookup main 
32765:	from all lookup novpn 
32766:	from all lookup main 
32767:	from all lookup default 

Et là, les choses se gâtent...
L'IP publique de ma connexion est bien ma vraie IP publique lorsque je ne suis pas connecté en tant que vpnuser.
Lorsque je suis connecté en tant que vpnuser, je n'ai pas de traffic.

En activant les logs correspondants aux filtres, je me suis aperçu que l'ensemble des paquets en provenance de vpnuser étaient bien marqués, mais qu'ils étaient dropés.

J'ai donc désactivé la règle qui drop les paquets marqués, ce qui m'a permis de m’apercevoir qu'ils n'étaient pas routés vers le vpn.

Ce qui me parait logique maintenant, car pour qu'ils soient routés en fonction du marquage, ils doivent êtres marqués dans la chain PREROUTING de la table mangle (d'après le man iptables-extensions) .
Sauf que, d'après le dmesg l'option --match owner ne fonctionne que dans la chain OUTPUT...

$ sudo iptables -t mangle -A PREROUTING --match owner --uid-owner vpnuser -j MARK --set-mark 2

$ dmesg
[11730.149978] x_tables: ip_tables: owner match: used from hooks PREROUTING, but only valid from OUTPUT/POSTROUTING

Help  cry  cry cry cry
Et merci d'avance aussi ^^

Dernière modification par skuizy (2015-11-03 20:00:55)

Hors ligne

#2 2015-11-01 14:44:39

David
Bof !!!
Inscription : 2012-01-30
Messages : 6 119

Re : [Résolu]Policy routing sur raspberry

Bonjour ...

Il est normal que le marquage d'un paquet se fasse sur Filter / Output, puisqu'il est défini par l'ID utilisateur ou celui du groupe de la machine locale. Tout ce qui sort de votre machine (les applications ou services) passe obligatoirement par Filter / Outpout.

Cordialement, David.


C.G.U.                Règles

Hors ligne

#3 2015-11-01 15:07:18

skuizy
Membre
Inscription : 2015-11-01
Messages : 7

Re : [Résolu]Policy routing sur raspberry

Malheureusement, d'après ce que je comprends et ce que je constate, le marquage fait sur Filter / Output intervient après le routage... et ne sert donc à rien dans mon cas...

Lorsque je configure mes iptables comme ceci :

sudo iptables -A OUTPUT --match owner --uid-owner vpnuser -j MARK --set-mark 2

Le trafic passe bien, mais la commande suivante me renvoie ma vraie IP publique :

curl http://api.ipify.org

Hors ligne

#4 2015-11-01 15:28:36

David
Bof !!!
Inscription : 2012-01-30
Messages : 6 119

Re : [Résolu]Policy routing sur raspberry

Re ...

Vous mettez des routes pour les "Non VPN" mais aucune n'est défini pour "VPN" !!?

Et désolé, ce n'est pas la table  Filter mais Mangle ...


C.G.U.                Règles

Hors ligne

#5 2015-11-01 15:54:43

skuizy
Membre
Inscription : 2015-11-01
Messages : 7

Re : [Résolu]Policy routing sur raspberry

Peut-être que le problème vient de là... Je n'ai effectivement défini explicitement aucune route pour les paquets VPN, mais ces routes sont définis dans la table de routage main au moment de la connexion au vpn. Cela ne suffit pas ? Etant donné que les paquets marqués 2 sont redirigés vers cette table main...

Le résultat est le même que la règle soit définie sur mangle/OUTPUT ou mangle/PREROUTING...

Merci en tous cas de vous donner du mal pour m'aider à résoudre ce problème smile

Hors ligne

#6 2015-11-01 15:58:16

David
Bof !!!
Inscription : 2012-01-30
Messages : 6 119

Re : [Résolu]Policy routing sur raspberry

Re ...

Et quelles sont les règles IP définies lors de la connexion au VPN !? Elles sont de ce type :

sudo ip route add default dev tun0 table main

C.G.U.                Règles

Hors ligne

#7 2015-11-01 16:05:01

skuizy
Membre
Inscription : 2015-11-01
Messages : 7

Re : [Résolu]Policy routing sur raspberry

Celles créées par pppd et, comme indiqué dans l'OP, sont les suivantes :

10.99.0.1 dev ppp0  proto kernel  scope link  src 10.99.0.44 
178.33.89.168 via 192.168.0.1 dev eth0  src 192.168.0.122 

Je rajoute via un script ip-up.d la suivante :

default dev ppp0  scope link

Je n'ai pas d'interface tun0 cependant, mais une ppp0.

Hors ligne

#8 2015-11-01 16:31:22

David
Bof !!!
Inscription : 2012-01-30
Messages : 6 119

Re : [Résolu]Policy routing sur raspberry

Re ...

Oui ... ppp0 smile

Mais en faisant un :

ip route add default dev ppp0 table main

à la place de :

default dev ppp0  scope link

De plus il me semble que certaines tables comme "main" sont réservées. Pourquoi ne pas avoir créée une table spécifique VPN  dans "/etc/iproute2/rt_tables" !?


C.G.U.                Règles

Hors ligne

#9 2015-11-01 17:00:07

skuizy
Membre
Inscription : 2015-11-01
Messages : 7

Re : [Résolu]Policy routing sur raspberry

Le script fait un

route add default dev ppp0

Qui, il me semble, est équivalant à

ip route add default dev ppp0 table main

Le "default dev ppp0 scope link" n'était que le résultat d'un "ip route list" wink

Je n'ai pas créé de table supplémentaire dans le rt_tables pour 2 raisons :

  1. Je ne savais pas que la main était réservée, et je n'avais jamais vraiment eu de problème en la modifiant jusqu'ici...

  2. Je ne sais pas comment pppd ajoute ses routes... Je ne peux donc pas lui dire de les ajouter dans une table différente. Et comme l'adresse IP m'est attribuée dynamiquement par le VPN, il était plus simple de continuer à utiliser la main...

Hors ligne

#10 2015-11-03 19:57:26

skuizy
Membre
Inscription : 2015-11-01
Messages : 7

Re : [Résolu]Policy routing sur raspberry

Problème réglé ! big_smile

Je suis passé par une table séparée pour plus de clarté (même si je pense toujours que la main suffit ^^)

Ensuite j'ai adapté les commandes du script proposé ici (la bible de pppd en fait !!!)

Et je me suis retrouvé avec ce script à placer dans le /etc/ppp/ip-up.d/

ip rule add fwmark 0 table novpn
ip rule add fwmark 2 table vpn

ip route add default via 192.168.0.1 dev eth0 table novpn
ip route add 192.168.0.0/24 src 192.168.0.122 dev eth0 table novpn

iptables -t mangle -A OUTPUT -j MARK --set-mark 0
iptables -t mangle -A OUTPUT --match owner --uid-owner vpnuser -j MARK --set-mark 2


ip route add default dev $1 table vpn
iptables -I OUTPUT 1 -s 0.0.0.0/0 -d $5/32 -j ACCEPT -o $1
iptables -I INPUT 1 -s $5/32 -d 0.0.0.0/0 -j ACCEPT -i $1
iptables -I FORWARD 1 -s 0.0.0.0/0 -d $5/32 -j ACCEPT -o $1
iptables -t nat -A POSTROUTING -o $1 -j MASQUERADE
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

La méthode est un peu moche pour l'instant puisque mes redirections de routes sont définies à la connexion du vpn, mais l'idée de base y est smile

Pour info, le $1 correspond à l'interface montée par pppd à la connexion (ppp0 en général) et le $5 correspond à l'adresse privée du serveur vpn.

Dernière modification par skuizy (2015-11-03 20:00:29)

Hors ligne

Pied de page des forums