Docker à la maison : ruTorrent derrière un VPN (WireGuard/OpenVPN)

bittorrent 21 sept. 2021

Voici un exemple de configuration, via Docker donc compatible Linux/Windows/MacOS, qui permet d’utiliser un client BitTorrent (rTorrent/ruTorrent dans mon cas) via un VPN (sous Docker aussi). Pour cet article j’utilise un compte NordVPN que quelqu’un m’a prêté. Je précise que, contrairement à 99.9% des sites qui font référence à cette société, ceci n’est pas un article sponsorisé.
Mon fournisseur VPN classique, AirVPN, ne propose que le protocole OpenVPN et je voulais tester avec Wireguard (plus rapide, mieux pour du P2P via une ligne fibre 1GBps). Un ami m’a filé son compte vu qu’il ne se sert pas de toutes ses connexions autorisées chez eux.

Je fais ça sur un vieux NUC sous Ubuntu serveur 20.04. Donc les Dockers utilisés sont pour architecture x86/AMD64 mais pas pour ARM (Rasp etc).

Vu que le client BitTorrent se connectera à Internet via le Docker VPN, il ne faut pas ouvrir les ports (-p 12:12 par exemple) sur le Docker rTorrent/ruTorrent mais bien sur le Docker VPN.

J’utilise un Docker créé spécialement par Bubuntux pour NordVPN (OpenVPN ou Nordlynx -Wireguard-) :

docker run -d \
--name vpnp2p \
-e TZ=Europe/Paris \
--restart always \
--cap-add=NET_ADMIN \
-e USER=mon_email_nordvpn \
-e PASS=mon_mot_de_passe_nordvpn \
-e TECHNOLOGY=NordLynx \
-e CONNECT='--group p2p fr' \
-e KILLSWITCH=Enable \
-e NETWORK=10.0.4.0/24 \
-p 924:80 \
-p 51415-51415:51415-51415 \
--label=com.centurylinklabs.watchtower.enable=true \
ghcr.io/bubuntux/nordvpn:latest

Je l’appelle “vpnp2p” histoire de le différencier d’autres Docker VPN que je pourrais ajouter plus tard. Les USER et PASS sont les email et mot de passe du compte NordVPN.
NordLynx indique au Docker de se connecter via le protocole Wireguard (leur implémentation de ce protocole) qui est moins lourd qu’OpenVPN et réduit moins le débit Internet une fois activé. Ce que je trouve mieux pour du P2P.
Je lui stipule de se connecter exclusivement aux serveurs NordVPN dédiés au P2P et situés en FRANCE.
J’active le killswtich intégré au Docker. De fait, en cas de déconnexion du VPN, l’accès Internet est coupé. Puisque mon client BitTorrent n’accédera à Internet que par ce Docker VPN, il n’aura donc plus accès à Internet en cas de coupure du VPN. Pratique pour éviter la HADOPI ou autre.
Je lui dis de ne pas bloquer un de mes LAN, puisque mon serveur DNS est dessus… Ça me permettra aussi d’avoir accès à ruTorrent (la WebUI) depuis mes PC à la maison.
Pour connaître son sous-réseau : ip route | awk ‘!/ (docker0|br-)/ && /src/ {print $1}’
Comme je le disais, c’est le Docker VPN qui se connecte à Internet, pas le Docker rTorrent/ruTorrent, il faut donc rediriger les ports sur ce container :
-p 924:80 \ port de la WebUI (je mets 924, mettez ce que bon vous semble)
-p 51415-51415:51415-51415 \ ports d’échanges BT
Et enfin, comme j’utilise Watchtower pour les MàJ de mes containers Docker, j’ajoute le – – label pour le prendre en charge.



Je rencontre un bogue avec le container de Bubuntux (j’ai pu me connecter 1 seule fois à NordVPN). Du coup on peut faire la même chose, mais en OpenVPN, avec le Docker d’Azinchen. Un peu le même principe qu’avant dans les options à la différence qu’il n’y a pas de killswitch.

docker run -d \
--name vpnp2p \
-e TZ=Europe/Paris \
--restart always \
--cap-add=NET_ADMIN \
--device=/dev/net/tun \
-e USER=email_nordvpn \
-e PASS=mot_de_passe_nordvpn \
-e PROTOCOL=openvpn_udp \
-e COUNTRY=France \
-e CATEGORY=P2P \
-e RECREATE_VPN_CRON="5 */3 * * *" \
-e RANDOM_TOP=7 \
-e CHECK_CONNECTION_CRON="*/5 * * * *" \
-e CHECK_CONNECTION_URL="https://google.fr" \
-e CHECK_CONNECTION_ATTEMPT_INTERVAL=2 \
-e NETWORK=10.0.4.0/24 \
-p 924:80 \
-p 51415-51415:51415-51415 \
--label=com.centurylinklabs.watchtower.enable=true \
azinchen/nordvpn

Pour tester l’efficacité d’un container Docker VPN, vous pouvez l’utiliser pour afficher votre IP avec/sans lui :

# Afficher son IP "normale"
curl icanhazip.com

# Afficher son IP via le Docker VPN
docker exec -it vpnp2p curl icanhazip.com

# Afficher son IP via le Docker rTorrent/ruTorrent et donc, logiquement, le Docker VPN (à faire une fois le Docker installé, je mets la charrue avant les bœufs)
docker exec -it rutorrentcomics curl icanhazip.com


Pour connecter un Docker à ce VPN il suffira simplement de lui passer commande – – net=container:vpnp2p
Ce que je fais avec ce Docker de rTorrent/ruTorrent de romancin.

docker run -d \
--name=rutorrentcomics \
--restart always \
-v /home/aerya/docker/rutorrentcomics/config:/config \
-v /mnt:/downloads \
-e PGID=0 -e PUID=0 \
-e TZ=Europe/Paris \
--net=container:vpnp2p \
--label=com.centurylinklabs.watchtower.enable=true \
romancin/rutorrent:0.9.8

Je le nomme rutorrentcomics
La configuration de rTorrent de ruTorrent est locale et ne sera donc pas effacée si on stoppe/retire le Docker : /home/aerya/docker/rutorrentcomics/config
Les téléchargements se feront dans /mnt. Si vous les voulez dans votre /home, il suffit de mettre /home/aerya:/downloads
Il utilisera donc le container Docker VPN pour se connecter à Internet et sera MàJ par Watchtower.

Pour ajouter une authentification user:pwd à votre interface Web :

# Entrez dans le container Docker
docker exec -it rutorrentcomics bash

# Créez un nom d'utilisateur
sh -c "echo -n 'aerya:' > /config/nginx/.htpasswd"

# Créez un mot de passe (à taper 2 fois)
sh -c "libressl passwd -apr1 >> /config/nginx/.htpasswd"

Le fichier est sauvegardé dans la configuration locale, dans /config/nginx/.htpasswd

root@NUC2:/home/aerya/docker/rutorrentcomics/config/nginx# ls -a
.  ..  conf.d  .htpasswd  nginx.conf

On peut tout à fait utiliser son propre VPS/dédié pour y créer un serveur VPN (OpenVPN/WireGuard). Voici diverses solutions fiables & tenues à jour (et documentées) :
Docker oVPN server (KyleManna)
Docker WG server (LinuxServer)
Script d’Angristan oVPN
Script d’Angristan WG

Et des clients en format Docker afin de rester cohérent avec la partie rTorrent/ruTorrent :
– oVPN : option firewall | option killswitch
WG mais pas de Killswitch

Mots clés