Added links and start to rewrite

This commit is contained in:
kleph 2013-07-10 01:19:37 +02:00
parent 351929956c
commit cd29ce945f

View file

@ -1,4 +1,4 @@
Title: Rediriger une partie du trafic pour faire face aux problèmes de peering Free <--> Google (et autres)
Title: Rediriger une partie du trafic vers une autre route
Author: kleph
Email: kleph@kleph.info
Category: Blog
@ -6,27 +6,32 @@ 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 extension pour faire ça avec XBMC, ça ne devait pas être difficile. J'avais juste oublié un détail, ma connexion est fournie par Free, donc on peut oublier le streaming hors de France (et a priori 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.
Ce soir je voulais suivre une des conférences TED en préparant à manger, et comme il y a une extension pour faire ça avec XBMC, ça ne devait pas être difficile. J'avais juste oublié un détail, ma connexion est fournie par Free, donc le streaming hors de France (et a priori surtout ce qui passe par le lien avec Google) fonctionne très mal. Dommage pour la fibre :'(
# Idée
Router seulement certains flux (streaming ou autre) à travers un VPN ayant de meilleurs liens.
J'avais déjà eu ce genre de problème auparavant, avec youtube évidement, ainsi que les lives twitch.
Pour youtube, un simple proxy suffit. Mais pour les flux RTMP, j'ai joué un peu avec les possibilité de routage de Linux. J'ai redirigé d'abord une partie, puis finalement tout le trafic sur le port 1194 à travers un VPN ayant de meileurs peerings.
# En pratique
## Prérequis
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)
Il faut aussi un noyau supportant le routage avance
TODO: config kernel
iptables -t mangle -A OUTPUT -p udp --dport 1935 -j MARK --set-mark 0x10
## 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][1].
Une fois ces paquets marqué, ils vont être reconnus au moment du routage pour ne pas sortir par le même endroit que d'habitude.
iptables -t mangle -A OUTPUT -p udp --dport 1935 -j MARK --set-mark 0x9
Une fois ces paquets marqués, avec la marque /0x9/, ils vont être interceptésau moment du routage pour ne pas sortir par le même endroit que d'habitude.
NOTE: Ici, j'utilise la chaîne **OUTPUT**, parce que la connexion est initialisée depuis la machine. Pour appliquer la marque aux paquets provenant d'une connexion routée par cette machine, il faut utiliser la chaîne **PREROUTING** (Voir plus bas).
# Les tables de routage du noyau 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étail ici, le [LARTC|http://lartc.org#] le fait déjà. TODO: mettre le lien vers une traduction
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étail ici, le [LARTC][2] le fait déjà.
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.
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
@ -34,6 +39,7 @@ J'ai donc rajouté une ligne à ce fichier :
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
@ -65,6 +71,13 @@ et voici donc cce que ça donne
ip rule add fwmark 1 pref 10 lookup vpn
# Liens
Les quelques liens cités dans cet article.
[1]: http://www.inetdoc.net/guides/iptables-tutorial/marktarget.html "MARK target"
[2]: http://lartc.org/howto/lartc.rpdb.multiple-links.html "LARTC"
[3]: http://www.inetdoc.net/guides/lartc/lartc.rpdb.multiple-links.html) "LARTC fr"
<!---
#vim: bg=light
vim: spelllang=fr