Démon de transmission sur OpenVPN

20

J'ai récemment acquis un BeagleBone Black, sur lequel j'ai installé Ubuntu en utilisant cette méthode . Tout a fonctionné jusqu'à présent. Je veux utiliser mon BeagleBone comme une boîte torrent, mais je ne veux pas le faire directement via ma connexion Internet (je ne pense pas que mon FAI l'aimera) - j'ai donc acheté un abonnement VPN à partir d'un serveur européen . J'ai déjà connecté manuellement mon ordinateur portable à ce VPN avant d'exécuter la transmission. Je sais que la connexion VPN fonctionne dans Ubuntu et l'hôte fournit des informations de configuration pour OpenVPN. Chose ennuyeuse, la nature dynamique de l'adresse IP attribuée signifie qu'elle changerait fréquemment, donc lorsque j'utilisais mon ordinateur portable avec le VPN, je définissais manuellement l'adresse d'écoute dans Transmission à la valeur requise.

Idéalement, j'aimerais la configuration suivante:

  • La transmission ne fonctionne que sur le VPN et il est interdit d'exécuter des torrents sur la connexion WAN normale
  • Seul le trafic dirigé vers la transmission sera accepté ou envoyé via le VPN, tout autre trafic non sollicité sera supprimé
  • La transmission utilise le port approprié pour écouter, en fonction de l'adresse IP attribuée
  • OpenVPN démarre automatiquement au démarrage, qui démarre ensuite la transmission
  • L'interface graphique Web de la transmission est accessible via le LAN, et éventuellement via Internet depuis ma connexion WAN (c'est-à-dire sans retour via le VPN)
seanlano
la source
3
Les réponses personnelles ne sont pas mauvaises. Ne vous excusez pas pour eux. Vous n'avez pas non plus à expliquer que c'est ce que vous faites ... C'est un comportement encouragé
RobotHumans
D'accord avec @hbdgaf. Inutile de s'excuser. Excellent travail sur tous les fronts.
JakeGould

Réponses:

23

Remarque: (2016-02-22) J'ai réalisé que cette configuration fuit les requêtes DNS vers les trackers torrent via le WAN normal, au lieu de l'envoyer via le VPN. J'examine comment résoudre ce problème. Je vais continuer à exécuter ma configuration, car la connexion elle-même utilise correctement le VPN.


Mise à jour: j'ai remarqué que lorsque je paramétrais la transmission pour qu'elle télécharge du jour au lendemain sur le Beaglebone, l'utilisation du processeur passait à 100% après un certain temps. Cela ne semble pas se produire après la même période de temps, parfois c'est bien toute la nuit, d'autres fois, il se débat après 10 minutes. Il peut également récupérer en mettant en pause tous les torrents et en attendant que la charge du processeur revienne à la normale, puis en redémarrant. J'enquête toujours. Une solution de contournement pourrait être de faire une pause et de reprendre périodiquement les torrents, bien que ce ne soit pas une très bonne solution de contournement. Notez que ce problème ne s'applique qu'au Beaglebone et probablement aux autres appareils ARM. Je n'ai jamais eu ce problème sur un processeur x86.


introduction

J'ai développé et testé cette solution pour Ubuntu 14.04, fonctionnant sur un BeagleBone Black. Le fournisseur VPN que j'utilise s'appelle ibVPN . Cela devrait fonctionner avec tout matériel pris en charge (c'est-à-dire sur un ordinateur x86 "normal"), avec n'importe quel fournisseur VPN compatible OpenVPN - et devrait probablement fonctionner pour 14.10 ou version ultérieure. À un moment donné, je pense qu'Ubuntu utilisera SystemD pour le démarrage, ce qui signifie que les scripts Upstart utilisés ici devront être migrés. Mise à jour: Jonas Kalderstam a une réponse ci-dessous pour utiliser SystemD. Je suppose également que ufw est utilisé comme pare-feu, si vous utilisez quelque chose de différent, les commandes ufw devront être modifiées.

Je suppose que tout le travail se fait via une connexion SSH au système, bien que cela fonctionnerait aussi bien s'il était tapé dans un terminal physique.

Ceci est un assez long tutoriel, veuillez tout d'abord le lire et assurez-vous que vous êtes à l'aise avec ce que vous allez faire.

J'ai également remarqué que la transmission ne se lie pas correctement à une adresse IP pour envoyer des données UPnP / NAT-PMP - c'est-à-dire que les données du torrent passent correctement par le VPN, mais si la redirection de port UPnP est activée, la transmission demandera la redirection de port du routeur local , pas via le VPN du serveur VPN. Par conséquent, j'ai désactivé le transfert de port par le script Upstart, car il peut sembler avoir fonctionné, mais ce n'est pas le cas. Il devrait être possible d'utiliser iptables et iproute pour forcer tout le trafic provenant de l'utilisateur de la transmission debian via le VPN, mais je suis toujours à la recherche de cela. Cela devrait également fonctionner si la route par défaut a été modifiée pour envoyer toutes les données Internet via le VPN, mais je ne voulais pas le faire car j'utilise également ce serveur pour d'autres choses, et cela entraînerait également toutes les mises à jour du système via le VPN. VPN.Cette question contient des informations supplémentaires si vous voulez vraiment que UPnP fonctionne sur le VPN . Mise à jour: falk0069 a une astuce fantastique ci-dessous pour aider à encourager UPnP sur le VPN.

Installation et configuration d'OpenVPN

Je vous recommande d'essayer de faire fonctionner votre connexion VPN avec Ubuntu avant d'essayer de la faire fonctionner ici - c'est-à-dire à partir d'un bureau. Cela confirmera que vous avez la configuration correcte et réduira le temps passé à déboguer.

Tout d'abord, installez les packages requis

sudo apt-get install openvpn

Ensuite, créez un répertoire dans lequel stocker les fichiers de configuration. J'utilise / opt / ibVPN, car c'est le fournisseur que j'utilise. Changez-le en ce que vous voulez.

sudo mkdir /opt/ibVPN

La première chose à faire dans ce nouveau répertoire est de créer le fichier de configuration pour exécuter le client VPN. ibVPN fournit un fichier de configuration de base pour les utilisateurs Linux, que je viens juste de copier et de coller.

cd /opt/ibVPN
sudo vim config.ovpn

Copiez et collez votre version modifiée dans vim, en utilisant les paramètres de votre fournisseur VPN. (Pour info, collez le terminal Ubuntu est Ctrl+Shift+V) Vous devriez pouvoir l'obtenir auprès de votre fournisseur VPN.

remote 888.888.888.888 1194 udp      #This address will be different for you
client
dev tap1
resolv-retry infinite
script-security 3 system
explicit-exit-notify 3
persist-key
mute-replay-warnings
ca ibvpn.com.crt
comp-lzo
verb 3
mute 20
ns-cert-type server
fragment 1300
route-delay 2
reneg-sec 0
max-routes 5000
link-mtu 1578

auth-user-pass pass
auth-nocache
persist-tun
route-noexec
lport 1195
lladdr 00:FF:11:AA:BB:CC
route-up "/opt/home/openvpn/route-up.sh"
down "/opt/home/openvpn/down.sh"

Pour ceux qui ne connaissent pas vim, appuyez sur Insert pour taper ou coller du texte, puis appuyez sur Escape et tapez :wq pour enregistrer et quitter. Bien sûr, vous n'avez pas besoin d'utiliser vim - n'importe quel éditeur de texte fonctionnera.

J'expliquerai rapidement ce fichier de configuration: les 18 premières lignes spécifient les paramètres spécifiques à utiliser avec le serveur, ceux-ci proviennent d'ibVPN - les vôtres seront probablement légèrement différents si vous avez un fournisseur différent. Les lignes suivantes sont des options modifiées que j'ai spécifiées.

  • Si votre fichier de paramètres contient des lignes auth-user*, commentez-les. Pour que cette configuration fonctionne automatiquement, nous devons avoir un fichier avec le nom d'utilisateur et le mot de passe - assurez-vous donc que le mot de passe que vous avez choisi pour le fournisseur VPN est fort, aléatoire et unique.

  • Le auth-user-pass passindique à OpenVPN de rechercher un fichier appelé passpour lire l'utilisateur et le mot de passe.

  • auth-nocache supprime le mot de passe de la mémoire, ce qui pourrait légèrement augmenter la sécurité si vous en avez peur.

  • persist-tun essaiera de garder la même adresse IP du serveur si votre connexion est interrompue, ce qui devrait, espérons-le, signifier moins de démarrage et d'arrêt de Transmission-daemon.

  • route-noexecindique au client OpenVPN de ne pas utiliser automatiquement les routes fournies par le serveur - ce qui entraînerait tout le trafic réseau sur le VPN. Nous voulons simplement envoyer du trafic torrent, nous aurons donc besoin d'utiliser différents paramètres de routage.

  • lport 1195 indique au client OpenVPN d'utiliser le port 1195 au lieu de 1194 - dans mon cas, je veux également exécuter un serveur OpenVPN sur le même appareil, et le serveur devra utiliser le port 1194. Même si vous n'exécutez pas de serveur OpenVPN, il ne fait pas de mal à faire ce changement.

  • J'ai changé la ligne dev tapen dev tap1, pour forcer le périphérique virtuel à être tap1 au lieu d'être attribué par OpenVPN, à nouveau en raison de l'exécution d'un serveur OpenVPN distinct. Même si vous n'exécutez pas de serveur VPN, ce changement ne devrait pas avoir d'importance. Les scripts de pare-feu ont été écrits pour être utilisés tap1, donc si vous préférez utiliser un autre appareil, n'oubliez pas de modifier ces scripts le cas échéant.

  • lladdr 00:FF:11:AA:BB:CC indique à OpenVPN d'attribuer l'interface tap pour avoir cette adresse MAC, ce qui peut être utile pour les règles de pare-feu iptables.

  • route-upet downexécutez des scripts pour démarrer et arrêter le démon de transmission selon les besoins - ceux-ci sont nécessaires ici car ils s'exécutent avec des variables d'environnement contenant des informations sur la connexion, qui sont nécessaires pour lier correctement Transmission à la bonne adresse IP et au bon port.

Dans mon cas, j'avais un certificat de serveur du fournisseur VPN - qui doit également être dans le même répertoire que le fichier de configuration.

sudo vim /opt/ibVPN/ibvpn.com.crt

Copiez et collez cela, ou déplacez-le via SCP ou SSHFS.

-----BEGIN CERTIFICATE-----
MIIDeDCCAuGgAwIBAgIJAMVKgpjMPUfxMA0GCSqGSIb3DQEBBQUAMIGFMQswCQYD
VQQGEwJVUzELMAkGA1UECBMCQ0ExFTATBgNVBAcTDFNhbkZyYW5jaXNjbzEVMBMG
A1UEChMMRm9ydC1GdW5zdG9uMRgwFgYDVQQDEw9Gb3J0LUZ1bnN0b24gQ0ExITAf
BgkqhkiG9w0BCQEWEm1lQG15aG9zdC5teWRvbWFpbjAeFw0xMDA3MjExOTU5MzVa
Fw0yMDA3MTgxOTU5MzVaMIGFMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFTAT
BgNVBAcTDFNhbkZyYW5jaXNjbzEVMBMGA1UEChMMRm9ydC1GdW5zdG9uMRgwFgYD
VQQDEw9Gb3J0LUZ1bnN0b24gQ0ExITAfBgkqhkiG9w0BCQEWEm1lQG15aG9zdC5t
eWRvbWFpbjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAz23m3BXY5Asiw8Dx
T4F6feqsp+pIx6ivftTniyUCbSAxI1J1s1x75DzxmUpIwPu5xavzgPXgZr8FT81X
JGqF9km4AE95iddJawKx0wNgdTo7GximQq9rw0dsQIB5hZZQ9TJwHC3VOnmEic5A
OawKOCybMcRs8saLakZOgh7Xc+UCAwEAAaOB7TCB6jAdBgNVHQ4EFgQUeRhE2N4l
XwL4H1dbjkZ4ou6fj3AwgboGA1UdIwSBsjCBr4AUeRhE2N4lXwL4H1dbjkZ4ou6f
j3ChgYukgYgwgYUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEVMBMGA1UEBxMM
U2FuRnJhbmNpc2NvMRUwEwYDVQQKEwxGb3J0LUZ1bnN0b24xGDAWBgNVBAMTD0Zv
cnQtRnVuc3RvbiBDQTEhMB8GCSqGSIb3DQEJARYSbWVAbXlob3N0Lm15ZG9tYWlu
ggkAxUqCmMw9R/EwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQASt0pl
WzVseQLTNM8Mlgw4ZnGAv/x2xnijmMqrkE+F7pnaOicGpxgCfMKzjZuJu0TNJqF2
fibE7GhMdomD4dLFgIu8Wb5E7iQ1CSBEOGumRhK8qCsDzjr7WXUdhqA6Xvo+ylU6
DMzy0Wn3NNvfGC+qxOgybYCJwDnVPi0CEDSbzQ==
-----END CERTIFICATE-----

Évidemment, si vous n'utilisez pas de compte ibVPN, votre certificat sera différent.

Faisons maintenant le fichier de mot de passe:

sudo vim /opt/ibVPN/pass

La première ligne doit être le nom d'utilisateur complet, puis la deuxième ligne doit être le mot de passe. Ce doit être le seul contenu de ce fichier.

[email protected]
myBIGstrongpassword1234567890

Nous devons également sécuriser les autorisations sur ce fichier, sinon OpenVPN ne démarrera pas.

sudo chmod 400 pass

Cela rendra le fichier en lecture seule, et uniquement pour le propriétaire (c'est-à-dire qu'aucun autre utilisateur ne peut le lire du tout)

Ces commandes créeront les fichiers à exécuter au démarrage et les définiront pour être exécutables uniquement par root.

sudo touch route-up.sh
sudo touch down.sh
sudo chmod 700 route-up.sh
sudo chmod 700 down.sh

À ce stade, c'est probablement une bonne idée de tester si la connexion VPN fonctionne réellement. Commencez la connexion avec:

sudo openvpn --cd /opt/ibVPN --config config.ovpn

Vous verrez des avertissements indiquant que les commandes externes haut et bas n'ont pas pu être exécutées, mais ne vous en faites pas. Si cela fonctionne, vous verrez Initialization Sequence Completedsur le terminal. Appuyez sur Control+Cpour mettre fin à la connexion. Si cela ne fonctionne pas, vous devrez rechercher pourquoi et le corriger avant de continuer. J'ai trouvé qu'il fallait parfois quelques coups pour commencer à travailler. Assurez-vous que votre fichier de mot de passe est correct. Il existe de nombreuses ressources sur Internet à propos d'OpenVPN, alors jetez un œil.

À ce stade, il est probablement plus facile de passer à la transmission opérationnelle. Une fois que vous êtes sûr que le VPN et la transmission peuvent fonctionner séparément, ils peuvent être combinés.

Installation et configuration de Transmission

Installez les packages requis:

sudo apt-get install transmission-daemon

Par défaut, la transmission s'exécute automatiquement au démarrage. Étant donné que nous utiliserons finalement OpenVPN pour démarrer la transmission, nous voulons désactiver cela. Pour ce faire, modifiez le fichier de configuration de Transmission-daemon

sudo vim /etc/default/transmission-daemon

Et changez la ligne suivante pour lire:

ENABLE_DAEMON=0

Maintenant, la transmission ne démarre pas au démarrage.

Créons maintenant un répertoire pour que les paramètres de transmission résident et pour que les torrents téléchargés y entrent. Cela suppose que vous avez déjà configuré un disque quelconque et qu'il est monté dans / media / arm-disk /. Pour des raisons de sécurité, le démon sera exécuté par son propre utilisateur plutôt que comme root ou comme "ubuntu". Un nouvel utilisateur est créé par le programme d'installation de transmission-daemon, "debian-transmission". Cet utilisateur doit posséder le dossier que nous créons et avoir un accès en lecture et en écriture à l'emplacement de stockage des torrents en cours de téléchargement.

sudo mkdir /opt/transmission
sudo chown debian-transmission:debian-transmission /opt/transmission
sudo mkdir /media/arm-disk/torrents-complete
sudo chown debian-transmission:debian-transmission /media/arm-disk/torrents-complete
sudo mkdir /media/arm-disk/torrents-incomplete
sudo chown debian-transmission:debian-transmission /media/arm-disk/torrents-incomplete

Maintenant, nous devons commencer la transmission, brièvement, afin qu'il crée le fichier de paramètres dont nous avons besoin:

sudo -u debian-transmission -g debian-transmission /usr/bin/transmission-daemon --config-dir /opt/transmission --foreground

Cette commande démarre transmission-daemon en tant qu'utilisateur debian-transmission, lui indique d'utiliser le répertoire / opt / transmission pour les fichiers de paramètres et lui dit de continuer à s'exécuter au premier plan. Une fois qu'il a fonctionné pendant quelques secondes, appuyez sur Control+Cpour le terminer. Nous pouvons maintenant modifier le fichier de paramètres.

sudo -u debian-transmission vim /opt/transmission/settings.json

Nous devons maintenant modifier les lignes suivantes à partir de leurs valeurs par défaut pour lire:

"download-dir": "/media/arm-disk/torrents-complete",

"incomplete-dir": "/media/arm-disk/torrents-incomplete",

"incomplete-dir-enabled": true,

"rpc-whitelist": "127.0.0.1,192.168.1.*",

Enregistrez et quittez (Escape, tapez: wq et appuyez sur Entrée)

Les deux modifications du milieu permettront l'utilisation du répertoire "incomplet", séparant vos torrents finis de ceux qui ne sont pas terminés. Ce n'est pas tout à fait nécessaire, mais personnellement, je le trouve extrêmement utile. La dernière modification permet à l'interface graphique Web d'être accessible par n'importe quel ordinateur du réseau local (en supposant que votre sous-réseau LAN soit 192.168.1.0, modifiez-le s'il est différent).

C'est maintenant une bonne idée d'exécuter à nouveau Transmission, pour voir si cela fonctionne et peut réellement télécharger un torrent. Nous utiliserons une fenêtre de navigateur Web pour accéder à l'interface graphique et ajouter un torrent. Tout d'abord, autorisons l'accès à l'interface graphique Web via le pare-feu à partir du LAN, puis réexécutez le démon de transmission.

sudo ufw allow in from 192.168.0.0/16 to any port 9091
sudo -u debian-transmission -g debian-transmission /usr/bin/transmission-daemon --config-dir /opt/transmission --foreground

Visitez cette URL dans Firefox (ou le navigateur que vous préférez): http://XXX.XXX.XXX.XXX:9091 , où XXX est remplacé par l'adresse de votre serveur sur le LAN (c.-à-d. 192.168.1.10). Trouvez un torrent à télécharger, par exemple Big Buck Bunny en 1080p60hz. Il s'agit d'un court métrage gratuit, légalement disponible en téléchargement gratuit. Dans l'interface graphique de transmission, cliquez sur le bouton "Ouvrir torrent" et collez ce lien (ou tout autre torrent que vous aimez) dans la première case. Appuyez ensuite sur "Télécharger". Si la transmission fonctionne correctement, le torrent commencera à se télécharger. Si ce n'est pas le cas, vous devrez déterminer pourquoi avant de continuer. Il existe de nombreuses ressources disponibles sur Internet pour utiliser le démon de transmission. Il se peut également que le torrent que vous avez choisi ne fonctionne pas, essayez d'abord quelques autres.

Une fois le téléchargement terminé, appuyez sur Control+Cdans la fenêtre du terminal pour arrêter le démon de transmission.

Configurer la transmission de liaison à l'interface VPN

Faisons maintenant un script Upstart, qui sera utilisé pour démarrer la transmission lorsque le VPN sera prêt.

sudo mv /etc/init/transmission-daemon.conf /etc/init/transmission-daemon.conf.bak

Ne vous inquiétez pas si cela se plaint, c'est juste pour faire une sauvegarde du fichier Upstart, s'il en existait un - il pourrait ne pas en avoir. Ouvrons vim pour éditer le nouveau:

sudo vim /etc/init/transmission-daemon.conf

Collez-le dans l'éditeur:

description "transmission-daemon, attached to OpenVPN tunnel tap1"

start on transmission-daemon-start
stop on runlevel [!2345] or transmission-vpn-down

# This includes the information from OpenVPN into this environment

export LOCAL_IP
env PORT=51413

# give time to send info to trackers
kill timeout 30

# Run as unprivileged user
setuid debian-transmission
setgid debian-transmission

# Start transmission again if it stops for some reason
respawn
# If transmission stops 5 times in a minute, give up trying to respawn it
respawn limit 5 60

exec /usr/bin/nice -15 /usr/bin/transmission-daemon --config-dir /opt/transmission --bind-address-ipv4 $LOCAL_IP --peerport $PORT --no-portmap --foreground

Enregistrez et fermez vim. ( Escape, puis tapez :wq). Encore une fois, ouvrez vim:

sudo vim /etc/init/transmission-up.conf

Et collez ceci:

description "Script to create firewall and routing rules for transmission-daemon"

start on transmission-vpn-up

# This includes the information from OpenVPN into this environment
export VPN_GATEWAY
export LOCAL_IP
env PORT=51413

task

script
    # Set up IP route, firewall rules
    # It doesn't matter if they already exist, they will be skipped
    /sbin/ip route add default via $VPN_GATEWAY dev tap1 table 200
    /sbin/ip rule add from $LOCAL_IP table 200
    /sbin/ip route flush cache
    /usr/sbin/ufw insert 1 reject out on eth0 from any port $PORT
    /usr/sbin/ufw insert 1 reject in on eth0 to any port $PORT
    /usr/sbin/ufw insert 1 deny in on tap1 to any
    /usr/sbin/ufw insert 1 allow in on tap1 to any port $PORT proto udp

    # Start the actual transmission-daemon process, in a separate task so that unprivileged user/group can be set
    /sbin/initctl emit transmission-daemon-start LOCAL_IP=$LOCAL_IP

end script

Encore une fois, enregistrez et fermez vim. ( Escape, puis tapez :wq). Finalement:

sudo vim /etc/init/transmission-down.conf

Collez ceci:

description "Script to remove firewall rules for transmission-daemon"

start on runlevel [!2345] or stopping openvpn-transmission
env PORT=51413

task

script
    # Take down IP route, firewall rules
    # It doesn't really matter if they don't get taken down, but this will be cleaner
    /usr/sbin/ufw delete reject out on eth0 from any port $PORT
    /usr/sbin/ufw delete reject in on eth0 to any port $PORT
    /usr/sbin/ufw delete deny in on tap1 to any
    /usr/sbin/ufw delete allow in on tap1 to any port $PORT proto udp

    /sbin/ip route flush cache

end script

Ces scripts indiquent à Upstart d'écouter le signal "transmission-vpn-up". Le script "transmission-up.conf" configure ensuite les règles de routage requises pour envoyer le trafic depuis l'adresse VPN locale via l'interface VPN, et définit le pare-feu pour autoriser le trafic du VPN vers le port d'écoute pour la transmission. Le trafic dirigé vers le port d'écoute de Transmission depuis l'interface LAN normale est bloqué. Le script "transmission-daemon.conf" démarre alors transmission-daemon avec les paramètres requis pour le lier à l'adresse IP VPN. Notez que cette commande garantira également que UPnP / NAT-PMP est désactivé - voir ma note en haut sur la redirection de port. Le "nice -15" définit la transmission comme ayant une priorité plus faible, ce que j'ai trouvé utile lors de l'utilisation du BeagleBone spécifié plus bas - parfois la transmission peut monopoliser les ressources, ce qui ralentit le système. Au moins avec une faible priorité, des tâches système plus importantes peuvent toujours s'exécuter. Le script "transmission-down.conf" supprimera les règles de pare-feu lorsque le VPN est arrêté. Trois scripts différents sont utilisés pour que le démon de transmission puisse être exécuté en tant qu'utilisateur non privilégié, mais les règles de pare-feu peuvent être exécutées en tant que root.

Revenons maintenant aux paramètres d'OpenVPN et éditons les scripts "route-up" et "down" pour déclencher le démarrage et l'arrêt de notre script de transmission.

sudo vim /opt/ibVPN/route-up.sh

Collez-le dans vim:

#! /bin/bash

/sbin/initctl emit transmission-vpn-up VPN_GATEWAY=$route_vpn_gateway LOCAL_IP=$ifconfig_local

Tout ce que ce script fait, c'est dire à Upstart que le démon de transmission doit démarrer, et lui donne les informations dont il a besoin pour se connecter à la connexion VPN.

sudo vim /opt/ibVPN/down.sh

Encore une fois, plus de collage:

#! /bin/bash

/sbin/initctl emit transmission-vpn-down

Ce script est encore plus simple - il signale l'arrêt du démon de transmission.

À ce stade, c'est probablement une bonne idée de s'assurer que le propriétaire de l'ensemble du dossier de configuration VPN est l'utilisateur root - puisque ces scripts s'exécutent en tant que root, toute personne qui pourrait les modifier pourrait exécuter tout ce qu'ils voulaient en tant qu'utilisateur root.

sudo chown root:root -R /opt/ibVPN
sudo chmod 700 -R /opt/ibVPN
sudo chmod 400 /opt/ibVPN/pass

Cela signifie désormais que seul l'utilisateur root peut modifier ou afficher les paramètres de connexion VPN.

OK, nous avons presque fini! Testons si notre configuration fonctionne jusqu'à présent:

sudo openvpn --cd /opt/ibVPN --config config.ovpn

Connectez-vous à nouveau à l'interface graphique Web de transmission et reprenez le torrent existant ou ajoutez-en un nouveau. Il devrait pouvoir être téléchargé, peut-être après quelques minutes d'attente pour les pairs. Une façon astucieuse que j'ai trouvée de tester si cela fonctionne ou non est de regarder iftop. Installez iftop et exécutez:

sudo apt-get install iftop
sudo iftop -i tap1

Cet écran affichera toutes les connexions passant par le VPN. Si votre torrent se télécharge et utilise correctement le VPN, il y aura beaucoup d'adresses IP et de noms d'hôtes ici. Regardez également iftop pour la connexion LAN:

sudo iftop -i eth0

Ici, vous devriez voir une grande quantité de trafic vers une seule adresse IP, étant le serveur VPN, puis seulement un trafic minimal vers d'autres périphériques LAN - en supposant que vous n'exécutez pas d'autres services sur votre BeagleBone.

Vous pouvez confirmer que le VPN fonctionne en suivant ces instructions .
Ce site vous permet de télécharger un torrent pour voir l'adresse IP que les autres pairs utilisent pour vous connecter - si tout fonctionne, ce sera l'adresse IP VPN et non votre propre adresse IP WAN.

Si vous rencontrez des problèmes, vous pouvez voir le journal des erreurs Upstart en procédant comme suit:

sudo tail -f /var/log/upstart/transmission-daemon.log

Dans une fenêtre de terminal / SSH distincte, essayez d'exécuter la commande tail tout en démarrant la connexion VPN comme ci-dessus et recherchez les messages d'erreur. J'espère que vous pourrez résoudre le problème en voyant les messages d'erreur, si ce n'est pas fouiller sur Internet, ou poster un commentaire.

Configurez tout pour démarrer automatiquement

Si vous êtes satisfait de lancer manuellement la commande pour démarrer le tunnel OpenVPN, ou si vous voulez le faire avec votre propre script, alors vous avez terminé. Mais je voulais qu'il démarre au démarrage, j'ai donc créé un autre script Upstart pour lancer OpenVPN.

sudo vim /etc/init/openvpn-transmission.conf

C'est la dernière chose que nous devons coller!

description "OpenVPN client, with attached transmission-daemon"

start on started networking
stop on runlevel [!2345] or stopped networking

# Give time for Transmission to send info to trackers, wait for graceful close
kill timeout 45

# Start the OpenVPN tunnel again if it stops for some reason
respawn
# If it stops 5 times in a minute, give up trying to respawn it
respawn limit 5 60


exec openvpn --cd /opt/ibVPN --config config.ovpn

post-stop script
    # Pause for a few seconds, before exiting
    /bin/sleep 3s
end script

Tout cela ne fait qu'attendre que le système signale que le réseau est prêt, puis il démarrera le tunnel OpenVPN - qui à son tour démarrera la transmission. Lorsque le système est éteint ou si le réseau est arrêté pour une raison quelconque, Upstart supprimera les règles de pare-feu et fermera le démon de transmission. Facile! Cela continuera également à fonctionner après un redémarrage, alors maintenant vous êtes prêt.

Pour interagir avec Transmission, utilisez l'interface graphique Web comme nous l'avons fait pendant la phase de configuration. Il est également possible de rendre l'interface graphique accessible sur Internet, en configurant la redirection de port. Il existe de nombreux didacticiels sur la façon de procéder, donc je ne le répéterai pas ici.

Quant à obtenir les téléchargements terminés du BeagleBone, j'utilise NFS. Je peux obtenir des vitesses d'environ 8 Mo / s en copiant sur le LAN du BeagleBone vers mon ordinateur de bureau - ce qui est assez bon pour un appareil aussi peu énergivore. Ubuntu fournit des informations pratiques pour la configuration de cela.

seanlano
la source
Hou la la! Combien de temps as-tu passé à chercher tout ça?
Ismael Miguel
Haha, pas mal de temps. Je l'avais fait une fois auparavant sur un routeur DD-WRT, puis quand je recommençais pour le BeagleBone, j'ai pensé que j'écrirais cela, donc je n'oublie pas comment le faire. : D
seanlano
1
Vous devriez également lire ceci: unix.stackexchange.com/questions/88693/… (C'est une excellente réponse.) Cela vous aidera, j'en suis sûr.
Ismael Miguel
3
Je viens de réaliser, après avoir configuré mon serveur DNS pour utiliser OpenDNS et avoir parcouru les statistiques, que cette configuration fuit le DNS via la connexion WAN normale . J'examinerai plus avant pour voir si je peux résoudre ce problème. Je vais continuer à fonctionner de toute façon, car la connexion elle-même se fait via le VPN - mais ce n'est pas idéal.
seanlano
1
@seanlano Merci d'avoir porté cela à notre attention. Faites-nous savoir si / quand vous trouvez un correctif.
Winterflags
7

Je viens de faire fonctionner cela avec SystemD, alors j'ai pensé partager. J'ai placé tous mes scripts, configs et certificats dans le même répertoire que j'appellerai/etc/openvpn/myprovider

Configuration OpenVPN

Cela dépend de votre VPN spécifique, mais une différence avec la configuration de @ seanlano est que je n'utilise qu'un route-upscript. Donc, les choses dont vous avez besoin en plus de votre configuration de travail fournie , sont ces lignes:

route-noexec
route-up "/etc/openvpn/myprovider/transmission-route-up.sh"

Où vous placez le transmission-route-up.shscript où vous le souhaitez. Notez l'absence de downscript. (Mon VPN utilisait déjà un script down personnalisé, il aurait donc été en conflit de toute façon).

/etc/openvpn/myprovider/transmission-route-up.sh:

#!/bin/sh

# Print environment variables for transmission's benefit
printenv > /etc/openvpn/myprovider/vpn.env


# Set up VPN routes
ip route add default via $route_vpn_gateway dev $dev table 10

ip rule add from $ifconfig_local/32 table 10
ip rule add to $route_vpn_gateway/32 table 10

ip route flush cache


# Add firewall rules
iptables -A INPUT -i $dev -p udp --dport 24328 -j ACCEPT
iptables -A INPUT -i $dev -p tcp --dport 24328 -j ACCEPT

iptables -A OUTPUT -o $dev -p udp --sport 24328 -j ACCEPT
iptables -A OUTPUT -o $dev -p tcp --sport 24328 -j ACCEPT

La première ligne, la printenv, est importante. Placez-le où vous voulez, il sera utilisé plus tard dans le service SystemD. Je le place dans le même répertoire que ma configuration vpn.

Remplacez 24328 par le port que votre démon de transmission doit écouter. J'utilise iptables (en utilisant Debian), vous pouvez donc probablement remplacer ces lignes par les lignes ufw de la configuration de @ seanlano.

Service VPN SystemD

C'est le service qui démarre automatiquement le VPN pour nous. Vérifiez que le chemin d'accès à openvpn est correct sur votre ordinateur et que le chemin d'accès au fichier de configuration est également correct. Vous devez spécifier les chemins d'accès complets dans les services SystemD.

/etc/systemd/system/my-vpn.service:

[Unit]
Description=VPN connection
After=network.target

[Service]
Type=forking
PIDFile=/var/run/openvpn/vpn.pid
ExecStart=/usr/sbin/openvpn --cd /etc/openvpn/myprovider --config /etc/openvpn/myprovider/myconfig.ovpn --daemon --writepid /var/run/openvpn/vpn.pid

[Install]
WantedBy=multi-user.target

Activez le service VPN avec:

systemctl enable my-vpn.service

Et testez-le avec:

systemctl start my-vpn.service
systemctl status my-vpn.service

Si c'est démarré / en cours d'exécution, vous êtes bon.

SystemD transmission-daemon.service

Ce script nécessite le service vpn, donc si le vpn tombe en panne, le démon de transmission descend également. Ceci est pratique si le vpn est redémarré et que vous obtenez une nouvelle adresse IP, car la transmission devra alors redémarrer et se lier à nouveau, ce qui devrait être géré automatiquement. Notez que nous utilisons les variables d'environnement que nous avons imprimées route-upplus tôt dans le script.

/etc/systemd/system/transmission-daemon.service:

[Unit]
Description=Transmission BitTorrent Daemon Under VPN
After=network.target my-vpn.service
Requires=my-vpn.service

[Service]
User=debian-transmission
Type=notify
EnvironmentFile=/etc/openvpn/vpn.env
ExecStart=/usr/bin/transmission-daemon -f --log-error --bind-address-ipv4 $ifconfig_local --rpc-bind-address 0.0.0.0 --no-portmap
ExecReload=/bin/kill -s HUP $MAINPID

[Install]
WantedBy=multi-user.target

L'activer

systemctl enable transmission-daemon.service

Et commencez

systemctl start transmission-daemon.service

Lorsque vous redémarrez, tout devrait démarrer automatiquement (dans l'ordre!). Notez que l'utilisation Type=simpledans le service vpn provoque certains problèmes pour le timing de l'ordre des scripts, je recommande donc de l'utiliser à la forkingplace.

Vous pouvez spécifier une adresse IP réelle pour le rpc-bind-addresssi vous voulez être plus restrictif (il s'agit de l'adresse d'écoute de l'interface graphique Web, qui ne doit pas être votre IP VPN). Et si vous voulez exécuter la transmission avec nice, changez simplement la ExecStartligne et ajoutez /usr/bin/nice -n15au début.

Gestion des changements d'adresse

Une chose que j'ai notée au fil du temps est que si la connexion VPN pour une raison quelconque obtient une nouvelle adresse IP, la transmission sera toujours liée à l'ancienne adresse et cessera de fonctionner. Et simplement faire systemctl restart transmission-daemon.servicene suffit pas. Il doit s'arrêter complètement, puis recommencer à zéro.

Je ne sais pas pourquoi, mais pour cette raison, j'ai ajouté les lignes suivantes à ma racine crontab ( sudo crontab -e):

# m h  dom mon dow   command
0 6 * * * /bin/systemctl stop my-vpn.service; /bin/systemctl start my-vpn.service
1 6 * * * /bin/systemctl stop transmission-daemon.service; /bin/systemctl start transmission-daemon.service
Jonas Kalderstam
la source
Juste par intérêt, cela fonctionne-t-il également sur un BeagleBone? Si oui, voyez-vous des problèmes de performances avec la transmission? En outre, une excellente rédaction. :)
seanlano
Ah non. Il fonctionne sur ma machine de bureau normale et je n'ai remarqué aucun problème.
Jonas Kalderstam
C'est suffisant. Fonctionne bien pour moi sur une machine Intel, j'espérais pouvoir faire une boîte torrent bon marché avec un processeur ARM - mais apparemment, ce n'est pas le cas.
seanlano
Découvrez rtorrent. Il est très performant
Jonas Kalderstam
Merci, je le ferai. D'autres choses fonctionnent bien sur la boîte ARM, donc peut-être que rtorrent fonctionnera correctement.
seanlano
3

J'ai remarqué que vous avez mentionné que la transmission ne passe pas par le VPN pour UPnP / NAT-PMP. J'ai également remarqué cela et j'ai créé un correctif pour la transmission afin qu'il honore le paramètre bind-address-ipv4 pour UPnP. NAT-PMP est un peu plus difficile à implémenter car vous devez déterminer la passerelle par défaut. L'UPnP est le principal qui est utilisé ces jours-ci, donc il est probablement assez bon. J'ai enregistré cela en tant que bogue sur le site trac.transmissionbt et fourni le correctif. Espérons qu'il sera intégré dans une future version. https://trac.transmissionbt.com/ticket/5990

Une autre option pour le moment si vous ne souhaitez pas recompiler est d'exécuter manuellement upnpc à partir du package miniupnpc. Par exemple

sudo apt-get install miniupnpc
upnpc -m 10.10.10.51 -a 10.10.10.51 51515 51515 TCP
upnpc -m 10.10.10.51 -a 10.10.10.51 51515 51515 UDP

Où 10.10.10.51 est votre IP VPN et 51515 est votre port TCP / UDP demandé.

Je ne sais pas combien de temps le transfert est bon. Vous pouvez également utiliser l'option «-d» pour supprimer votre port lors de la déconnexion. J'ai constaté que si je ne le fais pas, je ne peux plus obtenir le même port si je me reconnecte au VPN.

À votre santé

falk0069
la source
J'ai passé des années à essayer de trouver une solution comme celle-ci, j'aurais aimé trouver miniupnpc! Et j'espère que le patch sera fusionné et ce problème sera résolu pour toujours. En attendant, je vais certainement essayer d'utiliser votre astuce pratique.
seanlano