This commit is contained in:
parent
71013418c9
commit
889e9c7cfd
1 changed files with 40 additions and 25 deletions
|
@ -12,75 +12,90 @@ Summary: Cet article montre comment j'ai redirigé une partie de mon trafic à t
|
||||||
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, les connexions vers d'autres réseaux, aux "heures de pointe", sont, chaotiques, pour rester poli, dommage pour la fibre :'(
|
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, les connexions vers d'autres réseaux, aux "heures de pointe", sont, chaotiques, pour rester poli, dommage pour la fibre :'(
|
||||||
|
|
||||||
# Idée
|
# Idée
|
||||||
|
|
||||||
J'avais déjà eu ce genre de problème auparavant, avec youtube évidement, ainsi que les lives [twitch](http://www.twitch.tv).
|
J'avais déjà eu ce genre de problème auparavant, avec youtube évidement, ainsi que les lives [twitch](http://www.twitch.tv).
|
||||||
Pour youtube, un simple proxy suffit, ainsi que pour les vidéos déjà enregistrées de twitch. Mais pour les flux RTMP, j'ai joué un peu avec les possibilités de routage de Linux. J'ai redirigé d'abord une partie, puis finalement tout le trafic à destination du port 1935 à travers un VPN pour sortir depuis une machine ayant de meilleurs peerings.
|
Pour youtube, un simple proxy suffit, ainsi que pour les vidéos déjà enregistrées de twitch. Mais pour les flux RTMP, j'ai joué un peu avec les possibilités de routage de Linux. J'ai redirigé d'abord une partie, puis finalement tout le trafic à destination du port 1935 à travers un VPN pour sortir depuis une machine ayant de meilleurs peerings.
|
||||||
|
|
||||||
# En pratique
|
# En pratique
|
||||||
|
|
||||||
## Prérequis
|
## Prérequis
|
||||||
|
|
||||||
La mise en place du VPN n'est pas décrite ici, ce n'est pas l'objet.
|
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)
|
N'importe quel type de VPN routable devrait faire l'affaire. (j'utilise openvpn)
|
||||||
|
|
||||||
Il faut aussi un noyau supportant le routage avancé.
|
Il faut aussi un noyau supportant le routage avancé.
|
||||||
TODO: config kernel
|
TODO: config kernel
|
||||||
|
|
||||||
## Marquage des paquets
|
## 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].
|
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].
|
||||||
|
|
||||||
iptables -t mangle -A OUTPUT -p udp --dport 1935 -j MARK --set-mark 0x9
|
```console
|
||||||
|
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és au moment du routage pour ne pas sortir par le même endroit que d'habitude.
|
Une fois ces paquets marqués, avec la marque /0x9/, ils vont être interceptés au 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).
|
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
|
# 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][2] le fait déjà (et en français, [ici][3]).
|
|
||||||
|
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à (et en français, [ici][3]).
|
||||||
|
|
||||||
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 :
|
J'ai donc rajouté une ligne à ce fichier :
|
||||||
|
|
||||||
2 vpn
|
```console
|
||||||
|
2 vpn
|
||||||
|
```
|
||||||
|
|
||||||
Et ensuite, je vais affecter une passerelle par défaut à cette table différente de celle de la table principale :
|
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
|
```console
|
||||||
|
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 :
|
Il reste ensuite à définir la règle pour associer les paquets marqués par iptables à cette table de routage :
|
||||||
|
|
||||||
ip rule add fwmark 9 pref 10 lookup vpn
|
```console
|
||||||
|
ip rule add fwmark 9 pref 10 lookup vpn
|
||||||
|
```
|
||||||
|
|
||||||
# Conclusion
|
# Conclusion
|
||||||
|
|
||||||
Donc en résumé, les paquets seront reconnus par iptables, en 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...
|
Donc en résumé, les paquets seront reconnus par iptables, en 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 sont pas transmises sur le réseau.
|
NOTE: Les marques sont locales à la machine et ne sont pas transmises sur le réseau.
|
||||||
|
|
||||||
## Sur la passerelle VPN
|
## Sur la passerelle VPN
|
||||||
|
|
||||||
Cette passerelle me sert aussi de point d'accès wifi, avec la passerelle par défaut normale.
|
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, une adresse en 10.0.0.1 chez moi. Dans la chaine PREROUTING cette fois car le traffic d'origine n'est pas local (cf. [Parcours des paquets dans netfilter][4])
|
J'ai donc ajouté le même script en modifiant l'IP de destination pour forcer ce type de trafic à passer par le VPN, une adresse en 10.0.0.1 chez moi. Dans la chaine PREROUTING cette fois car le traffic d'origine n'est pas local (cf. [Parcours des paquets dans netfilter][4])
|
||||||
|
|
||||||
# Le script
|
# Le script
|
||||||
|
|
||||||
Voici le script que j'utilise pour faire tout ça. Finalement il est plutôt simple.
|
Voici le script que j'utilise pour faire tout ça. Finalement il est plutôt simple.
|
||||||
|
|
||||||
:::bash
|
```bash
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# route some ports/applications through the VPN
|
# 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 0x9
|
|
||||||
iptables -t mangle -A OUTPUT -p tcp --dport 1935 -j MARK --set-mark 0x9
|
|
||||||
|
|
||||||
# add route to redirect these packets
|
|
||||||
ip route add default via ${VPN_GATEWAY} table vpn
|
|
||||||
|
|
||||||
# add rule to detect marked packets and to send that trafic to the new routing table
|
|
||||||
ip rule add fwmark 9 pref 10 lookup vpn
|
|
||||||
|
|
||||||
|
VPN_GATEWAY=192.168.1.1
|
||||||
|
|
||||||
|
# mark the packets
|
||||||
|
# RTMP
|
||||||
|
iptables -t mangle -A OUTPUT -p udp --dport 1935 -j MARK --set-mark 0x9
|
||||||
|
iptables -t mangle -A OUTPUT -p tcp --dport 1935 -j MARK --set-mark 0x9
|
||||||
|
|
||||||
|
# add route to redirect these packets
|
||||||
|
ip route add default via ${VPN_GATEWAY} table vpn
|
||||||
|
|
||||||
|
# add rule to detect marked packets and to send that trafic to the new routing table
|
||||||
|
ip rule add fwmark 9 pref 10 lookup vpn
|
||||||
|
```
|
||||||
|
|
||||||
# Liens
|
# Liens
|
||||||
|
|
||||||
Les quelques liens cités dans cet article.
|
Les quelques liens cités dans cet article.
|
||||||
|
|
||||||
[1]: http://www.inetdoc.net/guides/iptables-tutorial/marktarget.html "MARK target"
|
[1]: http://www.inetdoc.net/guides/iptables-tutorial/marktarget.html "MARK target"
|
Loading…
Reference in a new issue