blog/content/parade_peering_free.mdown
2013-07-10 01:19:37 +02:00

4.2 KiB

Title: Rediriger une partie du trafic vers une autre route Author: kleph Email: kleph@kleph.info Category: Blog Date: 2013/07/09 Tags: Linux, Free, Internet Lang: fr

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

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)

Il faut aussi un noyau supportant le routage avance TODO: config kernel

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.

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 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.

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=192.168.1.1

# 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

Liens

Les quelques liens cités dans cet article.

[3]: http://www.inetdoc.net/guides/lartc/lartc.rpdb.multiple-links.html) "LARTC fr"