Initial import of draft source routing article

This commit is contained in:
kleph 2013-07-09 22:24:09 +02:00
parent c069f694d9
commit cc09f882d9

View file

@ -0,0 +1,68 @@
Title: Rediriger une partie du trafic pour faire face aux problèmes de peering Free <--> Google (et autres)
Author: kleph
Email: kleph@kleph.info
Category: Blog
Date: 2013/07/09
Tags: Linux, Free, Internet
Lang: fr
Ce soir je voulais écouter une des conférence TED en préparant à manger, et comme il y a une extention pour faire ça avec XBMC, ça ne devait pas être difficile. J'avais juste oublié un détail, ma connexon est fournie par Free, donc on peut oublier le streaming hors de France (et a prioiri surtout ce qui passe par le lien avec Google). Un nouvel usage pour lequel la fibre ne sert à rien non plus.
J'avais déjà eu ce genre de problème auparavant, avec youtube évidement, ainsi que les live twitch. donc j'ai résolu le problème d'une manière pas forcément propre, mais qui a le mérite de fonctionner, sans faire passer toute la connexion à travers un VPN.
# Idée
Router seulement certains flux (streaming ou autre) à travers un VPN ayant de meilleurs liens.
La mise en place du VPN n'est pas décrite ici, ce n'est pas l'objet.
N'importe quel type de VPN routable devrait faire l'affaire (j'utilise openvpn)
# marquage des paquets
On va tout d'abord isoler et marquer les paquets que l'on souhaite rediriger. Je l'ai fait avec iptables qui a une cible spécialement prévu à cet effet, MARK. (TODO: lien vers la doc d'iptables là dessus)
iptables -t mangle -A OUTPUT -p udp --dport 1935 -j MARK --set-mark 0x10
Une fois ces paquets marqué, ils vont être reconnus au moent du routage pour ne pas sortir par le même endroit que d'habitude.
# Les tables de routage du nouyau linux
En plus de la table de routage principale que l'on obtient avec la commande "ip route", le noyau linux comporte d'autres tables. Je ne les décrirai pas en détai ici, le [LARTC|http://lartc.org#] le fait déjà. TODO: mettre le lien vers une traduction
Sachez juste qu'il est possible de rajouter des tables, en plus de la table "main", et que le fichier /etc/iproute2/rt_tables permet de nommer ces tables pour rendre plus explicite les n°. Vous verez d'ailleurs que ce fichier contient déjà des alias vers les tables par défaut.
J'ai donc rajouté une ligne à ce fichier :
2 vpn
Et ensuite, je vais affecter une passerelle par défaut à cette table différente de celle de la table principale :
ip route add default via 192.168.1.1 table vpn
Il reste ensuite à définir la règle pour associer les paquets marqués par iptables à cette table de routage :
ip rule add fwmark 1 pref 10 lookup vpn
# conclusion
Donc en résumé, les paquets seront reconnus par iptables, fonction de critères classiques tels que l'adresse et/ou le port de destination, mais sachez que tous les critères d'iptables peuvent être utilisés pour celà, adresse/port source, ipset, nom d'utilisateur, etc...
NOTE: les marques sont locales à la machine et ne sonit pas transmise sur le réseau
# Sur la passerelle VPN
Cette passerelle me sert aussi de point d'accès wifi, avec la passerelle par défaut normale.
J'ai donc ajouté le même script en modifiant l'IP de destination pour forcer ce type de trafic à passer par le VPN. Dans la chaine PREROUTING cette fois car le traffic d'origine n'est pas local (cf TODO: lien vers le cheminement dans les tables d'iptables)
# Le script
et voici donc cce que ça donne
#!/bin/sh
# route some ports/applications through the VPN
VPN_GATEWAY
# mark the packets
# RTMP
iptables -t mangle -A OUTPUT -p udp --dport 1935 -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -p tcp --dport 1935 -j MARK --set-mark 0x1
# add route to redirect these packets
ip route add default via ${VPN_GATEWAY} table vpn
ip rule add fwmark 1 pref 10 lookup vpn