• Serveurs
  • [Discussion] Faire passer le trafic bitTorrent dans un tunnel VPN

jean-luc wrote:Bref..c'est comme un NAS...

Je pense mieux comprendre ...

J'ai déjà eu ce type de problèmes, sur une cubieboard me servant de NAS... ;"update-resolv-conf" te modifie ton fichier "/etc/resolv.conf" dès le lancement d'openvpn; et j'avais beau utiliser bind en nameserver ou opendns "update-resolv-conf" me modifiait mes nameservers avec les dns de mon FAI (FREE) qui se refusait de résoudre quand ma cubieboard avait pris l'ip du vpn et n'avait plus celle de free....

Solution :
Remplir correctement "/etc/resolv.conf" avec les nameservers adéquats en fonction ou non de l'utilisation de bind9 ou utiliser les nameservers de google ou d'opendns et empêcher toute modification de ce fichier par un "chattr +i "/etc/resolv.conf"

J'ai bien dit..je pense ....à confirmer...
Le problème vient de Synology :
Linux Kernel IP Advanced Routing
C'est ce détail uniquement qui m'empêche de faire la même chose sur mon NAS...

Après je voulais me monter un serveur Debian de toute façon, pour tester pas mal de choses, donc j'en profite aussi pour en faire une seedbox. Mais c'est vrai, plus pour m'amuser qu'autre chose.

Pour les DNS, je pensais avoir besoin de ceux fournis par le VPN, mais à partir du moment où tout le trafic torrent passe par le VPN, ça ne devrait pas être nécessaire ? En fait je veux juste être certain que rTorrent/ruTorrent ne permettent pas de voir mon adresse IP publique fournie par le FAI, mais je ne sais pas comment fonctionne ma configuration actuelle si rTorrent doit résoudre un nom. Je ne sais même pas si il peut avoir à le faire...

Concernant les DNS par défaut, pas d'inquiétude pour moi, je les maîtrise au niveau de mon routeur, j'ai remplacé ma box FAI par un routeur perso, et j'indique à toutes mes machines d'utiliser mon routeur comme serveur DNS.
Le problème vient de Synology :
Linux Kernel IP Advanced Routing
Mettre à jour le kernel si "CONFIG_IP_ADVANCED_ROUTER=y" n'a pas été implémenté...sinon point de salut...

Sinon pour tes DNS je ne m'inquiète pas...c'est que uniquement j'ai déjà eu le cas ou "update-resolv-conf" me modifiait à mon insu "/etc/resolv.conf"...
D'accord, merci pour l'info.
Merci beaucoup pour le tuto !
Ça fait un moment que je voulais le faire sur mon transmission sans prendre la peine de rechercher les différentes doc, un grand merci 🙂
16 jours plus tard
Pacnam wrote:D'accord, merci pour l'info.
Sinon comme t'es embêté avec le routage "CONFIG_IP_ADVANCED_ROUTER" non implémenté dans ton kernel; dans le up.sh tu mets simplement :
sed -i 's/.*"bind-address-ipv4":.*/    "bind-address-ipv4": \"'$4'\",/' /etc/transmission-daemon/settings.json
Comme ça transmission sera bind directement sur ton vpn, et tu pourras t'affranchir de l'interface et du routage vers lo:1 dans l'exemple du tuto.

Je l'ai testé sur une cubieboard avec rtorrent :
sed -i 's/.*bind =.*/bind = '$4'/' /home/seedbox1/.rtorrent.rc
...et ça marche..

12 jours plus tard
Bonjour,

tu dis que cette méthode permet de s'affranchir de l'interface et du routage, on peut donc modifier les fichier up.sh et down.sh et enlever toutes les règles iptable ? du coup si tu pouvais me donner un exemple de ce que pourrait être ces deux fichiers avec cette solution.

merci
4 mois plus tard
laster13 wrote:Bonjour,

tu dis que cette méthode permet de s'affranchir de l'interface et du routage, on peut donc modifier les fichier up.sh et down.sh et enlever toutes les règles iptable ? du coup si tu pouvais me donner un exemple de ce que pourrait être ces deux fichiers avec cette solution.
merci
Salut;
Je viens de m'apercevoir que tu m'avais posé une question ...ça date des vacances...
Regarde ici :
http://www.ichimonji10.name/blog/1/

Mon openvpn étant lancé par nobody, dans /etc/sudoers :
nobody  ALL=(ALL) NOPASSWD:  /etc/openvpn/script-up.sh, /etc/openvpn/script-down.sh
Mon up.sh :
sudo /etc/openvpn/script-up.sh $1 $4 $5
Mon down.sh :
sudo /etc/openvpn/script-down.sh $1 $4 $5
Mon script-up.sh :
#!/bin/bash
sed -i "/^bind/ s/bind.*/bind \= $2/g" /home/seedbox1/.rtorrent.rc
sed -i "/^bind/ s/bind.*/bind \= $2/g" /home/seedbox2/.rtorrent.rc
ip rule add from "$2" table VPN
ip route add table VPN default via "$3"
ip route add table VPN "$3" via "$2" dev "$1"
/usr/local/bin/rstart &
systemctl start rt@user1.service
systemctl start rt@user1.service
exit
Mon script-down.sh :
#!/bin/bash
ip rule delete from "$2" table VPN
ip route flush table VPN
systemctl stop rt@user1.service
systemctl stop rt@user1.service
exit
Ce qui donnerait pour le tuto d'ici avec openvpn lancé en root (pas besoin de la ligne sudoers ni script-up ou script-down) mais directement :

up.sh :
#!/bin/bash
sed -i "/^bind/ s/bind.*/bind \= $4/g" /home/user1/.rtorrent.rc
sed -i "/^bind/ s/bind.*/bind \= $4/g" /home/user2/.rtorrent.rc
#rajouter autant de lignes sed que d'user seedbox...
ip rule add from "$4" table VPN
ip route add table VPN default via "$5"
ip route add table VPN "$5" via "$4" dev "$1"
systemctl start rt@user1.service
systemctl start rt@user2.service
#rajouter autant de lignes systemctl que d'user seedbox...
killall checkVPN
/usr/bin/checkVPN &
exit
down.sh :
#!/bin/bash
killall checkVPN
ip rule delete from "$4" table VPN
ip route flush table VPN
systemctl stop rt@user1.service
systemctl stop rt@user2.service
#rajouter autant de lignes systemctl que d'user seedbox...ou
killall screen
exit
2 mois plus tard
Bonjour,

Génial Jean-Luc ! Ça fonctionne parfaitement !!!

Je te réponds bien longtemps après, j'ai eu pas mal de choses à gérer ces derniers temps. Je viens de changer de fournisseur VPN, et j'ai profité de modifier les fichiers de configuration pour tester ta méthode, que j'avais gardé dans un coin de ma tête avec intérêt.

J'en profite pour te demander comment tu as modifié checkVPN ? Je ne sais pas vraiment manier les scripts bash, mais celui d'origine ne peut plus fonctionner puisque l'on n'utilise plus l'interface virtuelle dédiée.

/usr/bin/checkVPN :
#!/bin/bash

# PING vers www.google.com toutes les 5 min.
# Si aucun paquet n est recu 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
Je suppose qu'il faut que j'essaie de remplacer "192.168.0.1" par l'adresse IP indiquée dans le ligne "bind = X.X.X.X" de .rtorrent.rc ? Mais je dois faire appel à cette ligne, comme tu le fais avec ton sed ?

[EDIT] J'ai commencé à lire le lien que tu as cité, en fait c'est tout bête (corrige-moi si je me trompe ^^), il suffit de remplacer l'adresse IP de l'interface de sortie par l'interface virtuelle créée par OpenVPN, tun0. On a donc :
ping -I tun0 -c 1 www.google.com
Et ça fonctionne.


Et deuxième question, comme tout n'est pas encore parfaitement clair pour moi, pourrais-tu me confirmer (ou infirmer) le point suivant s'il te plaît ?

Lorsque je lis les logs d'OpenVPN, j'obtiens :
ovpn: SENT CONTROL [Fournisseur VPN]: 'PUSH_REQUEST' (status=1)
ovpn: PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1,dhcp-option DNS X.X.X.X,dhcp-option DNS X.X.X.Y,ping 10,comp-lzo no,route Z.Z.Z.X,topology net30,ifconfig Z.Z.Z.Y Z.Z.Z.Z'
ovpn: Options error: option 'redirect-gateway' cannot be used in this context ([PUSH-OPTIONS])
ovpn: Options error: option 'dhcp-option' cannot be used in this context ([PUSH-OPTIONS])
ovpn: Options error: option 'dhcp-option' cannot be used in this context ([PUSH-OPTIONS])
ovpn: Options error: option 'route' cannot be used in this context ([PUSH-OPTIONS])
(Je peux envoyer les vraies adresses IP en MP si nécessaire.)

Cela a l'air de correspondre à ce qui est expliqué dans ce ticket :
https://community.openvpn.net/openvpn/ticket/291

Est-ce que cela veut dire que mon routage fonctionne bien et qu'il s'agit simplement d'un message d'erreur inadapté ?
Je précise que mon torrent "check my torrent IP" me renvoie bien l'adresse IP du serveur de mon fournisseur de VPN.

Merci !!!

[EDIT 2] En fait, rtorrent a l'air de crasher très vite avec ta méthode, alors que ça a l'air de tenir avec l'interface virtuelle dédiée. J'ai l'impression que c'est parce que $4 est régulièrement modifiée.
4 mois plus tard

Bonjour à tous,
Merci Zobrak pour ce tuto qui complète bien celui de Kanka.ch. Cependant je n'y arrive pas. Je ne dois pas être très loin mais ça coince

Assez Nouveau sur Linux, je viens d'acquérir une rasp pi 2 sur laquelle j'ai installé openvpn et transmission et suivi la procédure indiquée.
J'ai un compte VPN sur Freedomip et un port ouvert udp tcp (30001)
J'ai transféré les ports 30001, 443 dans ma box numéricable (192.168.0.1) vers ma rasp en ip fixe 192.168.0.29.

Après un /etc/init.d/openvpn start et ifconfig, je n'ai pas de tun0 ( comme sbouby )
sur cat /var/log/syslog |grep openvpn, voici le message d'erreur :

raspberrypi ovpn-client[503]: WARNING: file '/etc/openvpn/freedomip/mdp/pass.txt' is group or others accessible
raspberrypi ovpn-client[503]: WARNING: file '/etc/openvpn/freedomip/ta.key' is group or others accessible
raspberrypi ovpn-client[503]: Control Channel Authentication: using '/etc/openvpn/freedomip/ta.key' as a OpenVPN static key file
 raspberrypi ovpn-client[562]: /etc/openvpn/freedomip/scripts/up.sh tun0 1500 1560 10.8.1.154 10.8.1.153 init
raspberrypi systemd[1]: openvpn@client.service: main process exited, code=exited, status=1/FAILURE
raspberrypi systemd[1]: Unit openvpn@client.service entered failed state.
raspberrypi systemd[1]: Stopping system-openvpn.slice.
raspberrypi systemd[1]: Removed slice system-openvpn.slice

Voici mon "clientNL.conf":

client
# Ports availables: 443, 53, 8080, 1194, 110, 995
port 443
# Mode availables: TCP (default / safer) and UDP (faster)
proto tcp
dev tun
#Pas de modification depuis le serveur de la table de routage 
route-nopull
remote nl.freedom-ip.com
resolv-retry infinite
ca /etc/openvpn/freedomip/ca.crt
tls-auth /etc/openvpn/freedomip/ta.key 1
auth-user-pass /etc/openvpn/freedomip/mdp/pass.txt
cipher AES-256-CBC
comp-lzo
verb 1
nobind
ns-cert-type server
script-security 2
up /etc/openvpn/up.sh
down /etc/openvpn/down.sh
;Maintien de la connexion: ping envoye toutes les 10s, restart si pas de reponses pendant 60s
keepalive 10 60

Mon fichier up.sh :

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.10.1) to the VPN routing table, using policy routing ("ip rule" commands)
ip rule add from 192.168.10.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 443 -j DNAT --to 192.168.10.1
  iptables -A PREROUTING -t nat -i tun0 -p udp --dport 443 -j DNAT --to 192.168.10.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 30001 -j ACCEPT  # transmission random range
  iptables -A SERVICES -p udp --dport 30001 -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.10.1/32 -o eth0 -j DROP

#Démarrage de transmission

/etc/init.d/transmission-daemon restart

#Démarrage du script vérifiant que le VPN est toujours actif

killall checkVPN
/usr/bin/checkVPN &

Mon fichier down.sh :

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 arrête transmission
/etc/init.d/transmission-daemon stop

#On efface les regles iptables ajoutees

iptables -D FORWARD -s 192.168.10.1/32 -o eth0 -j DROP
iptables -D SERVICES -p udp --dport 30001 -j ACCEPT # DHT
iptables -D SERVICES -p tcp --dport 30001 -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 443 -j DNAT --to 192.168.10.1
iptables -D PREROUTING -t nat -i tun0 -p tcp --dport 443 -j DNAT --to 192.168.10.1

Remove rule for the secondary loopback IP address (192.168.0.1)

ip rule del from 192.168.10.1/32 table VPN

Remove rule for tun0 IP address

ip rule del from ${NET_IP}/32 table VPN

Remove the default route via tun0 from the IPRED routing table

ip route del default dev tun0 table VPN

Interface :

auto lo
iface lo inet loopback

iface eth0 inet manual

allow-hotplug wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

allow-hotplug wlan1
iface wlan1 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
auto lo:1
        iface lo:1 inet static
        address 192.168.10.1
        netmask 255.255.255.255

les lignes importantes de transmission settings.json

  "bind-address-ipv4": "192.168.10.1", 
    "bind-address-ipv6": "fe80::", 
    "blocklist-enabled": false, 
    "download-dir": "/media/disque1/Data", 
    "incomplete-dir": "/media/disque1/Temp", 
    "incomplete-dir-enabled": true, 
    "peer-port": 30001, 
    "peer-port-random-high": 30001, 
    "peer-port-random-low": 30001, 
    "peer-port-random-on-start": false, 
    "port-forwarding-enabled": false, 
    "rpc-bind-address": "0.0.0.0", 
    "rpc-port": 9091, 
    "rpc-url": "/transmission/", 
    "rpc-username": "moi", (pour les essais)
    "rpc-whitelist": "127.0.0.1", 
    "rpc-whitelist-enabled": false, 

mon fichier interfaces :

Include files from /etc/network/interfaces.d:

source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

iface eth0 inet manual

allow-hotplug wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

allow-hotplug wlan1
iface wlan1 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
auto lo:1
        iface lo:1 inet static
        address 192.168.10.1
        netmask 255.255.255.255

mon rt_tables

#
# reserved values
#
255	local
254	main
253	default
0	unspec
#
# local
#
#1	inr.ruhep
1 VPN

mon checkVPN :

while [ 1 > 0 ]; do
        sleep 300
	T=`ping -I 192.168.10.1 -c 1 [url=http://www.google.com]www.google.com[/url] |grep "packets transmitted"`
	if [[ ${T:23:1} != "1" ]]
	then 
		/etc/init.d/openvpn restart
	fi
done

si cette discussion est toujours suivie, est-ce qu'une âme charitable pourrait m'aider et m'indiquer où se trouve mon (mes) erreurs ?
Merci d'avance
PS : au passage, comment faites-vous pour que votre code soit sur fond noir ?

9 mois plus tard

J ai teste 2 fois le TUTO dans une VM avec debian 8.
Lorsque openvpn et rutorrent sont lancés , rien ne se passe et tun0 n est pas créé.
Tout conseil est le bienvenu.

  • Aerya a répondu à ça.

    Ernie95 Des infos seraient les bienvenues, on ne peut pas deviner...

    Quelle type d'info ?

    Debian 8.6 et j'utilise vpntunnel

    1) contenu de /etc/network/interfaces

        source /etc/network/interfaces.d/*
    #auto lo
    #iface lo inet loopback
    # The primary network interface
    # allow-hotplug eth0
    # iface eth0 inet dhcp
    auto eth0
    iface eth0 inet static
            address 192.168.zzz.yy
            netmask 255.255.255.0
            broadcat 192.168.zzz.255
            gateway 192.168.zzz.xx
    #for openvpn
    auto l0:1
    iface l0:1 inet static
    address 192.168.0.1
    netmask 255.255.255.255

    2) contenu de /etc/openvpn/openvpn.conf

    client
    dev tun
    proto tcp
    nobind
    route-nopull
    ; Cert
    ns-cert-type server
    cipher BF-CBC
    ;Scripts
    script-security 2
    up /etc/openvpn/up.sh
    down /etc/openvpn/down.sh
    ;Host
    resolv-retry infinite
    ;auth
    auth-user-pass pass
    keepalive 10 30
    sndbuf 0
    rcvbuf 0
    remote "adresse et port du fournisseur"
    persist-key
    persist-tun
    persist-remote-ip
    comp-lzo
    verb 2
    <ca>
    le certificat
    <ca>

    3) résultat de ifconfig

    eth0      Link encap:Ethernet  HWaddr 08:00:27:8b:ac:52  
              inet adr:192.168.zzz.yy  Bcast:192.168.zzz.255  Masque:255.255.255.0
              adr inet6: sdddddd/64 Scope:Lien
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:66019 errors:0 dropped:4 overruns:0 frame:0
              TX packets:2582 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 lg file transmission:1000 
              RX bytes:4188137 (3.9 MiB)  TX bytes:318097 (310.6 KiB)
    
    lo        Link encap:Boucle locale  
              inet adr:127.0.0.1  Masque:255.0.0.0
              adr inet6: ::1/128 Scope:Hôte
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:31 errors:0 dropped:0 overruns:0 frame:0
              TX packets:31 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 lg file transmission:0 
              RX bytes:2160 (2.1 KiB)  TX bytes:2160 (2.1 KiB)

    4) résultat de iptables -L

    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination 

    5) résultat de ps -aux |grep rtorrent

    root      3043  0.0  0.1  12748  2288 pts/0    S+   11:46   0:00 grep rtorrent

    VPS ou dédié ? Car sur VPS il faut encore souvent activer TUN/TAP dans son panel de gestion. Alors que sur dédié en général le script d'installation (si tu as utilisé un script) active cette interface virtuelle. Sinon

    sudo modprobe tun

    Je suis dans une machine virtuelle sous phpvbox (mis sur un nas).

    J ai installé sans script (manuellement en suivant le TUTO)

    Esg ce que dans debian 8.6 par rapport à wheezy il y a un Deamon à activer ou une commande à faire pour que tun soit autorisé ?

    De plus le fichier /etc/init.d/openvpn contient autostart en All alors que le fichier de etc/Default/openvpn est en Client pour autostart

    Je ne connais pas PHPvBox mais si c'est une VM il te faut activer TUN/TAP dans ton "interface" ou sur ton NAS. Ça ne dépend pas de l'OS, juste de l'hôte et de la VM. Il faut regarder la doc de ton NAS.

    Merci

    Même dans le host tun n apparaît pas.
    J ai bien bridgé eth0 avec la carte réseau de mon nas pour voir acces au reseau et internet.

    Mais pas de tun

    Je vais regarder en détail. Ce qui me surprend c est qu avec wheezy pas de soucis en VM.

    Bonjour Ernie, toujours sur Nas4free je vois 🙂

    Je me sers de ce tuto sur une carte banana pI avec une distribution bananian basée sur du Jessie et cela fonctionne parfaitement bien à une nuance près, j'utilise le tuto de kanta qui a toujours bien fonctionné pour moi
    https://tech.kanka.ch/index.php/faire-transiter-uniquement-les-torrents-dans-un-tunnel-openvpn-sur-un-serveur-debian/

    Je te conseille de procéder par élimination et de suivre le tuto avec transmission tel qu'il est préconisé dans le tuto. Si ca fonctionne tu transposes avec rutorrent.

    Hello Laster13
    Eh oui toujours sur nas4free 🙂

    Je soupconne une erreur dan le fichier de config openvpn.conf.
    L'interface tun ne s'active une fois le lien fait avec vpntunnel.

    SI j'ai rien c'est que le lien avec vpntunnel plante

    Je vais recommencer en partant du lien source que tu sites.

    7 jours plus tard

    cela fonctionne.
    Le point était sur le fichier de vpntunnel à modifier. Il a fallu que je modifie et sépare le fichier en 2 : 1 avec les paramètres et un avec la clé.

    4 mois plus tard

    Bonsoir,
    Je vais me lancer à partir d'un serveur créé à partir du script rtorrent de ce site, mais un point me turlupine.
    Dans ce tuto, dans le script up.sh on a :

    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
    on renseigne les ports utilisé par rtorrent

    dans le tuto de référence tech.kanka.ch

    Source NAT and destination NAT rules to make sure the incoming and ougoing packets on 192.168.0.1 are $

    iptables -A PREROUTING -t nat -i $1 -p tcp --dport 443 -j DNAT --to 192.168.0.1
    iptables -A PREROUTING -t nat -i $1 -p udp --dport 443 -j DNAT --to 192.168.0.1
    iptables -A POSTROUTING -t nat -o $1 -j MASQUERADE

    on indique le port du VPN.
    Quel est la bonne méthode ???