Salut,

J'ai trouvé ce tuto chez kanka.ch :Faire transiter uniquement le trafic torrent dans un tunnel openvpn sur un serveur debian squeeze et j'ai trouvé utile de vous le faire partager, j'ai essayé de le simplifier un peu et de l'adapter à la config des seedbox porposées sur mondedie.fr. J'ai également un peu modifié les scripts afin de supprimer des sources d'erreurs chez moi.

Si comme moi vous souhaitez faire passer votre traffic rtorrent, et uniquement ce traffic, dans un tunnnel VPN, je vous donne la marche à suivre.

Grace à ces manipulations l'adresse publique qui va chercher les torrents n'est pas celle de votre serveur mais celle du VPN.

L'idée est d'ouvrir un tunnel chez un fournisseur de VPN, d'y faire passer le traffic torrent et seulement celui-ci, et si le tunnel se ferme de stopper le traffic.

Dans ce tuto nous sommes en root (pensez à sudo éventuellement) et les mentions <entre_crochets> sont à personnaliser.

1. Si ça n'est pas déjà fait on installe openVPN
apt-get install openvpn
2. On crée une table de routage pour le VPN
echo 1 VPN >> /etc/iproute2/rt_tables 
3. On crée une interface locale nommée lo:1
nano /etc/network/interfaces
on ajoute à la fin :
auto lo:1
        iface lo:1 inet static
        address 192.168.0.1
        netmask 255.255.255.255
Note : Choisissez une adresse de réseau local qui n'est pas encore utilisée sur votre réseau. Nous allons lier rtorrent à cette interface qui sera coupée du monde si le tunnel tombe. Donc moi j'ai pris l'adresse 192.168.0.1 car le réseau 192.168.0.0 n'est pas utilisé sur mon serveur. Mais j'aurai tout aussi bien pu prendre 192.168.123.1 ou 10.123.0.1, bref toute ip d'un réseau non routable.


4. Paramétrage d'openVPN

Récupérez chez votre fournisseur de VPN vos fichiers de configuration .conf ou .ovpn On va considérer dans cet exemple que le fournisseur de VPN passe par une interface tun (ça aurait pu être une tap).

Par défaut openvpn paramètre sur votre système les tables de routage pour faire transiter tout le traffic par le tunnel. Grâce à l'option route-nopull nous allons lui indiquer de ne pas le faire. Nous paramétrerons plus tard les routes nous même à l'aide de scripts.

nano /etc/openvpn/fichierdeconf.conf
Editez votre fichier de conf de manière à ce qu'il ressemble à ce qui suit, en prenant soin toutefois de laisser certaines options propres à votre fournisseur et au paramétrages de son serveur.
float
client
dev tun
proto udp
nobind

;Pas de modification depuis le serveur de la table de routage
route-nopull

;Scripts locaux gérant les routes et le client torrent
script-security 2
up /etc/openvpn/up.sh
down /etc/openvpn/down.sh

; HOST
remote <adresseduserveurvpn.domain.tld> <portduserveurvpn>
resolv-retry infinite

; AUTH
#auth-user-pass pass
#persist-key
#persist-tun



remote-cert-tls server
cipher AES-256-CBC
comp-lzo no
verb 3
explicit-exit-notify 5
NOTES :
- Dans mon exemple, l’authentification au serveur se fait directement par des certificats inclus dans le fichier de conf, et non par un mot de passe. C'est à vous d'adapter l'authentification en fonction de votre fournisseur.
- Le route-nopull sert à ignorer le push fait par le serveur openvpn
- script-security indique à openvpn quels scripts exécuter quand il ouvre le tunnel et quand il le ferme
- keepalive 10 60 demande à openvpn d'envoyer un ping toutes les 10 secondes et de se reconnecter au bout de 60 secondes si le ping ne répond pas.




5. On va maintenant créer le script up.sh
nano /etc/openvpn/up.sh
Modifier selon votre config ce qui est <entre_crochets> soit : <tun0>, <XXXX:XXXX> le port-range spécifié dans vos .rtorrent.rc, <XXXX> le port udp utilisé pour l'utilisation des dht, et <eth0> votre interface passerelle à l'internet. <user1> et <user2>... sont vos utilisateurs rtorrent.
#! /bin/sh
# This script enables policy routing after the tunnel interface is brought up
# Policy routing is used to make sure response packets go through the tunnel interface
# This is mandatory when your ISP has setup anti-spoofing filters

#Créer une chaine iptables nommée SERVICES, renverra un warning sans conséquences si déjà crée. Pour la propreté de la conf. vous pouvez éventuellement supprimer cette directive et la mettre dans un de vos scripts qui se lance au démarrage du système.

iptables -N SERVICES


#Obtenir l'adresse IP donnée par le VPN à tun0, à supposer que votre vpn crée une interface de ce nom.
NET_DEV="<tun0>"
NET_IP="$(command ifconfig "${NET_DEV}" \
    | command grep 'inet ' \
    | command sed -e 's/^.*inet [^:]*:\([^ ]*\) .*$/\1/')"



# Add a default route via <tun0> into the VPN routing table
ip route add default dev tun0 table VPN

# Pass traffic from lo:1 (192.168.0.1) to the VPN routing table, using policy routing ("ip rule" commands)
ip rule add from 192.168.0.1/32 table VPN

# Pass traffic from tun0 IP address to the VPN routing table
ip rule add from ${NET_IP}/32 table VPN

#On ajoute les règles iptables pour faire le NAT

 # Source NAT and destination NAT rules
  iptables -A PREROUTING -t nat -i <tun0> -p tcp --dport <XXXX:XXXX> -j DNAT --to 192.168.0.1
  iptables -A PREROUTING -t nat -i <tun0> -p udp --dport <port udp pour les dht XXXX> -j DNAT --to 192.168.0.1
  iptables -A POSTROUTING -t nat -o <tun0> -j MASQUERADE
  # Allow session continuation traffic
  iptables -A INPUT -i <tun0> -m state --state RELATED,ESTABLISHED -j ACCEPT
  # Allow Bittorrent traffic via tun0
  iptables -A SERVICES -p tcp --dport XXXX:XXXX -j ACCEPT                     # rTorrent random range
  iptables -A SERVICES -p udp --dport <port udp pour les dht XXXX> -j ACCEPT                          # DHT
  # Disallow BitTorrent traffic via eth0 - Just to be extra safe [img]/assets/images/smileys/wink.png[/img]
  iptables -A FORWARD -s 192.168.0.1/32 -o <eth0> -j DROP

#Démarrage de rtorrent
/etc/init.d/<user1>-rtorrent start
/etc/init.d/<user2>-rtorrent start
# etc etc...

#Démarrage du script vérifiant que le VPN est toujours actif
killall checkVPN
/usr/bin/checkVPN &

6. On crée le script down.sh
nano /etc/openvpn/down.sh
Et on y met ceci toujours remplacer <tun0> <XXXX:XXXX>, <XXXX> et <eth0> par les valeurs qui correspondent à votre config.
#! /bin/sh
# This script disables policy routing before the tunnel interface is brought down

#Trouver l'adresse IP affectée à tun0 par le VPN
NET_DEV="<tun0>"
NET_IP="$(command ifconfig "${NET_DEV}" \
    | command grep 'inet ' \
    | command sed -e 's/^.*inet [^:]*:\([^ ]*\) .*$/\1/')"

#On arrête le script qui va vérifier l'existence du tunnel VPN
killall checkVPN

#On stoppe rtorrent
/etc/init.d/<user1>-rtorrent stop
/etc/init.d/<user2>-rtorrent stop
# etc etc...


#On efface les règles iptables ajoutées

iptables -D FORWARD -s 192.168.0.1/32 -o <eth0> -j DROP
iptables -D SERVICES -p udp --dport <XXXX> -j ACCEPT # DHT
iptables -D SERVICES -p tcp --dport <XXXX:XXXX> -j ACCEPT # rTorrent random range
iptables -D INPUT -i <tun0> -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -D POSTROUTING -t nat -o <tun0> -j MASQUERADE
iptables -D PREROUTING -t nat -i <tun0> -p udp --dport <XXXX> -j DNAT --to 192.168.0.1
iptables -D PREROUTING -t nat -i <tun0> -p tcp --dport <XXXX:XXXX> -j DNAT --to 192.168.0.1

# Remove rule for the secondary loopback IP address (192.168.0.1)
ip rule del from 192.168.0.1/32 table VPN

# Remove rule for tun0 IP address
ip rule del from  ${NET_IP}/32 table VPN

# Remove rule for the secondary loopback IP address (192.168.0.1)
ip rule del from 192.168.0.1/32 table VPN

# Remove the default route via tun0 from the IPRED routing table
ip route del default dev <tun0> table VPN

7. Création du script de vérification de l'état du tunnel

Comme expliqué plus haut, openvpn avec l'option keepalive vérifie de lui même que le tunnel soit toujours actif, mais pour une meilleure connectivité on doublonne avec le script suivant :
nano /usr/bin/checkVPN
dans lequel on met :

#! /bin/bash

#On fait un ping vers www.google.com toutes les 5min, et si aucun paquet n'est reçu en retour (0 packets received, le 0 étant à la position 23 sur la ligne venant de ping) on relance le VPN
#

while [ 1 > 0 ]; do
        sleep 300
	T=`ping -I 192.168.0.1 -c 1 www.google.com |grep "packets transmitted"`
	if [[ ${T:23:1} != "1" ]]
	then 
		/etc/init.d/openvpn restart
	fi
done
8. On rend les scripts exécutables.
cd /etc/openvpn && chmod +x up.sh down.sh /usr/bin/checkVPN

NOTES :


-Si votre identification au serveur se fait par mot de passe, pensez à indiquer dans votre fichier pass votre login et mot de passe avec la syntaxe :

Login du VPN
Mot de passe du VPN
[/i]

et pensez à sécuriser ce fichier :
chmod 700 /etc/openvpn/pass
[/i]

- Si vous n'utilisez openVPN qu'en mode client, éditez /etc/default/openvpn
Cherchez : #AUTOSTART="client"
Décommentez et commentez les autres AUTOSTART
(Si vous faites tourner un serveur openvpn, adaptez votre configuration)


[h]
9. Paramétrage de rtorrent[/h]
On va maintenant indiquer à rtorrent de passer par l'interface du VPN. Editez vos fichier .rtorrent.rc :
nano /home/<user1>/.rtorrent.rc
et ajoutez-y l'option
bind = 192.168.0.1
Et pareillement pour les autres utilisateurs.

10. On y est presque

On vérifie dans /etc/init.d/openvpn
CONFIG_DIR=/etc/openvpn
On stoppe rtorrent.
service <user1>-rtorrent stop
service <user2>-rtorrent stop
...
On lance openvpn
service openvpn start
On vérifie ses logs. (chez moi c'est le syslog)
On peut vérifier que les règles iptables on bien été ajoutées
iptables -L
On vérifie les instances rtorrent :
ps -aux |grep rtorrent
On peut aussi vérifier que rtorrent se bind à la bonne adresse :
netstat -lptn |grep rtorrent
qui donne quelque chose du genre :
tcp        0      0 127.0.0.1:500{x}          0.0.0.0:*               LISTEN      24180/rtorrent
tcp        0      0 192.168.0.1:XXXX       0.0.0.0:*               LISTEN      24137/rtorrent

Et voilà !

Je vous invite à lire l'article sur kanka.ch :Faire transiter uniquement le trafic torrent dans un tunnel openvpn sur un serveur debian squeeze et ses commentaires qui sont riches d'enseignements.

NOTES :
Il faudra penser à activer le port-forwarding chez votre fournisseur vpn (chez le mien j'ai pu activer 20 ports successifs qui correspondent au port-range de rtorrent)
Dans rutorrent j'ai un avertissement comme quoi le port n'est pas joignable, mais ma connectivité n'est pas affectée.


Pour les questions et suggestions d'amélioration, ça se passe ici : http://mondedie.fr/d/5934
Répondre…