Übertragungsdämon über OpenVPN


20

Ich habe kürzlich ein BeagleBone Black erworben, auf dem ich Ubuntu mit dieser Methode installiert habe . Es hat alles soweit geklappt. Ich möchte mein BeagleBone als Torrent-Box verwenden, aber nicht direkt über meine Internetverbindung (ich glaube nicht, dass es meinem ISP gefällt). Deshalb habe ich ein VPN-Abonnement von einem europäischen Server gekauft . Ich habe meinen Laptop zuvor manuell mit diesem VPN verbunden und die Übertragung ausgeführt. Ich weiß, dass die VPN-Verbindung in Ubuntu funktioniert und der Host Setup-Informationen für OpenVPN bereitstellt. Es ist ärgerlich, dass sich die zugewiesene IP-Adresse aufgrund der Dynamik häufig ändert. Wenn ich meinen Laptop mit dem VPN verwende, stelle ich die Empfangsadresse in Transmission manuell auf den erforderlichen Wert ein.

Idealerweise hätte ich gerne das folgende Setup:

  • Die Übertragung erfolgt nur über das VPN und es ist verboten, Torrents über die normale WAN-Verbindung auszuführen
  • Es wird nur Datenverkehr akzeptiert oder über das VPN gesendet, alle anderen nicht angeforderten Daten werden verworfen
  • Die Übertragung verwendet den entsprechenden Port zum Abhören, basierend auf der zugewiesenen IP-Adresse
  • OpenVPN startet automatisch beim Booten und startet anschließend die Übertragung
  • Auf die Web-GUI von Transmission kann über das LAN und möglicherweise über das Internet von meiner WAN-Verbindung aus zugegriffen werden (dh nicht über das VPN).

3
Selbst Antworten sind nicht schlecht. Entschuldige dich nicht für sie. Sie müssen auch nicht erklären, was Sie tun, obwohl ... Es ist ein ermutigtes Verhalten
RobotHumans

Einverstanden mit @hbdgaf. Keine Notwendigkeit, sich zu entschuldigen. Gute Arbeit an allen Fronten.
JakeGould

Antworten:


23

Hinweis: (22.02.2016) Ich habe festgestellt, dass diese Konfiguration DNS-Anfragen über das normale WAN an die Torrent-Tracker weiterleitet, anstatt sie über das VPN zu senden. Ich untersuche, wie ich das beheben kann. Ich werde meine Konfiguration jedoch weiterhin ausführen, da die Verbindung selbst das VPN ordnungsgemäß verwendet.


Update: Mir ist aufgefallen, dass die CPU-Auslastung nach einer Weile auf 100% sinkt, wenn ich Transmission so einstelle, dass sie über Nacht auf den Beaglebone heruntergeladen wird. Es scheint nicht nach der gleichen Zeitspanne zu passieren, manchmal ist es die ganze Nacht über in Ordnung, manchmal tut es sich nach 10 Minuten schwer. Es kann auch wiederhergestellt werden, indem alle Torrents angehalten werden und gewartet wird, bis die CPU-Last wieder normal ist, und dann erneut gestartet wird. Ich recherchiere noch. Eine Problemumgehung könnte darin bestehen, Torrents in regelmäßigen Abständen anzuhalten und fortzusetzen, obwohl dies keine sehr gute Problemumgehung ist. Beachten Sie, dass dieses Problem nur bei Beaglebone und wahrscheinlich auch bei anderen ARM-Geräten auftritt. Ich hatte dieses Problem noch nie bei einer x86-CPU.


Einführung

Ich habe diese Lösung für Ubuntu 14.04 auf einem BeagleBone Black entwickelt und getestet. Der von mir verwendete VPN-Anbieter heißt ibVPN . Es sollte jedoch mit jeder unterstützten Hardware (dh auf einem "normalen" x86-Computer) und mit jedem OpenVPN-kompatiblen VPN-Anbieter funktionieren - und sollte wahrscheinlich für 14.10 oder höher funktionieren. Ich glaube, dass Ubuntu irgendwann SystemD zum Booten verwenden wird, was bedeutet, dass die hier verwendeten Upstart-Skripte migriert werden müssen. Update: Jonas Kalderstam hat unten eine Antwort für die Verwendung von SystemD. Ich gehe auch davon aus, dass ufw als Firewall verwendet wird. Wenn Sie etwas anderes verwenden, müssen die ufw-Befehle hier geändert werden.

Ich gehe davon aus, dass die gesamte Arbeit über eine SSH-Verbindung mit dem System erledigt wird, obwohl es genauso gut funktionieren würde , wenn es in ein physisches Terminal eingegeben würde.

Dies ist ein ziemlich langes Tutorial. Bitte lesen Sie zuerst alles durch und vergewissern Sie sich, dass Sie mit dem, was Sie tun, vertraut sind.

Ich habe auch bemerkt, dass die Übertragung nicht richtig an eine IP-Adresse gebunden ist, um UPnP / NAT-PMP-Daten zu senden - dh Torrent-Daten werden korrekt über das VPN übertragen, aber wenn die UPnP-Portweiterleitung aktiviert ist, fordert die Übertragung die Portweiterleitung vom lokalen Router an , nicht über das VPN vom VPN-Server. Daher habe ich das Upstart-Skript dazu gebracht, die Portweiterleitung zu deaktivieren, da es so aussieht, als hätte es funktioniert, aber nicht. Es sollte möglich sein, iptables und iproute zu verwenden, um den gesamten Datenverkehr vom Debian-Übertragungsbenutzer über das VPN zu erzwingen, aber ich prüfe dies noch. Es sollte auch funktionieren, wenn die Standardroute geändert wurde, um alle Internetdaten über das VPN zu senden, aber ich wollte das nicht, weil ich diesen Server auch für andere Dinge verwende, und dies würde auch dazu führen, dass alle Systemaktualisierungen über das Internet gesendet werden VPN.Diese Frage enthält weitere Informationen, wenn Sie wirklich möchten, dass UPnP über das VPN funktioniert . Update: falk0069 hat unten einen fantastischen Tipp , um UPnP über das VPN zu fördern.

OpenVPN installieren und konfigurieren

Ich würde empfehlen, dass Sie versuchen, Ihre VPN-Verbindung mit Ubuntu zum Laufen zu bringen, bevor Sie versuchen, sie hier zum Laufen zu bringen - dh von einem Desktop aus. Dadurch wird bestätigt, dass Sie die richtige Konfiguration haben, und der Zeitaufwand für das Debuggen wird verringert.

Installieren Sie zunächst die erforderlichen Pakete

sudo apt-get install openvpn

Erstellen Sie als Nächstes ein Verzeichnis zum Speichern der Konfigurationsdateien. Ich verwende / opt / ibVPN, da dies der Anbieter ist, den ich verwende. Ändern Sie es nach Belieben.

sudo mkdir /opt/ibVPN

In diesem neuen Verzeichnis müssen Sie zunächst die Konfigurationsdatei für den VPN-Client erstellen. ibVPN bietet eine grundlegende Konfigurationsdatei für Linux-Benutzer, die ich meistens nur kopiert und eingefügt habe.

cd /opt/ibVPN
sudo vim config.ovpn

Kopieren Sie die bearbeitete Version und fügen Sie sie mit den Einstellungen Ihres VPN-Anbieters in vim ein. (FYI, Einfügen in das Ubuntu-Terminal ist Ctrl+Shift+V) Sie sollten dies von Ihrem VPN-Anbieter erhalten können.

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"

Wenn Sie mit vim nicht vertraut sind, drücken Sie, Insert um Text einzugeben oder einzufügen, und drücken Sie dann Escape und :wq , um zu speichern und zu beenden. Natürlich müssen Sie nicht vim verwenden - jeder Texteditor wird funktionieren.

Ich werde diese Konfigurationsdatei schnell erklären: Die ersten 18 Zeilen geben die spezifischen Einstellungen an, die mit dem Server verwendet werden sollen. Diese stammen von ibVPN - Ihre Einstellungen unterscheiden sich wahrscheinlich geringfügig, wenn Sie einen anderen Anbieter haben. Die nächsten Zeilen sind geänderte Optionen, die ich angegeben habe.

  • Wenn Ihre Einstellungsdatei Zeilen mit hatte auth-user*, kommentieren Sie diese aus. Damit dieses Setup automatisch funktioniert, muss eine Datei mit dem Benutzernamen und dem Kennwort enthalten sein. Stellen Sie daher sicher, dass das Kennwort, das Sie für den VPN-Anbieter ausgewählt haben, sicher, zufällig und eindeutig ist.

  • Das auth-user-pass passweist OpenVPN an, nach einer Datei zu suchen, die aufgerufen wird pass, um den Benutzer und das Kennwort zu lesen.

  • auth-nocache Entfernt das Kennwort aus dem Speicher. Dies kann die Sicherheit geringfügig erhöhen, wenn Sie sich darüber Sorgen machen.

  • persist-tun wird versuchen, die gleiche IP-Adresse vom Server zu behalten, wenn Ihre Verbindung ausfällt, was hoffentlich weniger Starten und Stoppen des Transmission-Daemons bedeuten sollte.

  • route-noexecWeist den OpenVPN-Client an, die vom Server bereitgestellten Routen nicht automatisch zu verwenden. Dadurch wird der gesamte Netzwerkverkehr über das VPN abgerufen. Wir möchten nur Torrent-Verkehr senden, daher müssen wir unterschiedliche Routing-Einstellungen verwenden.

  • lport 1195 Weist den OpenVPN-Client an, Port 1195 anstelle von 1194 zu verwenden. In meinem Fall möchte ich auch einen OpenVPN-Server auf demselben Gerät ausführen, und der Server muss Port 1194 verwenden. Auch wenn Sie keinen OpenVPN-Server ausführen tut nicht weh, diese Änderung vorzunehmen.

  • Ich habe die Leitung dev tapin geändert dev tap1, um zu erzwingen, dass das virtuelle Gerät tap1 ist, anstatt von OpenVPN zugewiesen zu werden, und zwar erneut, weil ein separater OpenVPN-Server ausgeführt wird. Auch wenn Sie keinen VPN-Server betreiben, sollte diese Änderung keine Rolle spielen. Die Firewall-Skripte wurden für die Verwendung tap1entwickelt. Wenn Sie also lieber ein anderes Gerät verwenden möchten, müssen Sie diese Skripte gegebenenfalls ändern.

  • lladdr 00:FF:11:AA:BB:CC Weist OpenVPN an, der Tap-Schnittstelle diese MAC-Adresse zuzuweisen, was für iptables-Firewallregeln hilfreich sein kann.

  • route-upund downführen Sie Skripte aus, um Transmission-Daemon nach Bedarf zu starten und zu stoppen. Diese werden hier benötigt, weil sie mit Umgebungsvariablen ausgeführt werden, die Informationen über die Verbindung enthalten, die erforderlich sind, um Transmission an die richtige IP-Adresse und den richtigen Port zu binden.

In meinem Fall hatte ich ein Serverzertifikat vom VPN-Anbieter - das sich ebenfalls im selben Verzeichnis wie die Konfigurationsdatei befinden muss.

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

Kopieren Sie diese und fügen Sie sie ein oder verschieben Sie sie über SCP oder 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-----

Wenn Sie kein ibVPN-Konto verwenden, ist Ihr Zertifikat natürlich anders.

Machen wir jetzt die Passwortdatei:

sudo vim /opt/ibVPN/pass

Die erste Zeile muss der vollständige Benutzername sein, die zweite Zeile muss das Passwort sein. Dies muss der einzige Inhalt dieser Datei sein.

you@address.com
myBIGstrongpassword1234567890

Wir müssen auch die Berechtigungen für diese Datei sichern, sonst startet OpenVPN nicht.

sudo chmod 400 pass

Dadurch wird die Datei schreibgeschützt und nur für den Eigentümer (dh kein anderer Benutzer kann sie überhaupt lesen).

Diese Befehle erstellen die Dateien, die beim Start ausgeführt werden sollen, und legen fest, dass sie nur von root ausgeführt werden können.

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

An diesem Punkt ist es wahrscheinlich eine gute Idee, zu testen, ob die VPN-Verbindung tatsächlich funktioniert. Starten Sie die Verbindung mit:

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

Es werden Warnungen angezeigt, dass die externen Befehle up und down nicht ausgeführt werden konnten, aber machen Sie sich darüber keine Sorgen. Wenn es funktioniert, werden Sie Initialization Sequence Completedauf dem Terminal sehen. Drücken Sie Control+C, um die Verbindung zu beenden. Wenn es nicht funktioniert, müssen Sie nachforschen, warum dies nicht der Fall ist, und es beheben, bevor Sie fortfahren. Ich stellte fest, dass es manchmal ein paar Mal dauerte, bis ich anfing zu arbeiten. Stellen Sie sicher, dass Ihre Kennwortdatei korrekt ist. Im Internet gibt es viele großartige Ressourcen zu OpenVPN. Schauen Sie sich also um.

Zu diesem Zeitpunkt ist es wahrscheinlich am einfachsten, Transmission zum Laufen zu bringen. Sobald Sie sicher sind, dass VPN und Übertragung getrennt ausgeführt werden können, können sie kombiniert werden.

Übertragung installieren und konfigurieren

Installieren Sie die erforderlichen Pakete:

sudo apt-get install transmission-daemon

Standardmäßig wird die Übertragung beim Booten automatisch ausgeführt. Da wir irgendwann OpenVPN verwenden werden, um die Übertragung zu starten, möchten wir dies deaktivieren. Bearbeiten Sie dazu die Konfigurationsdatei für Transmission-Daemon

sudo vim /etc/default/transmission-daemon

Und ändern Sie die folgende Zeile zu lesen:

ENABLE_DAEMON=0

Jetzt wird die Übertragung beim Booten nicht gestartet.

Erstellen wir nun ein Verzeichnis für die Übertragungseinstellungen und für die heruntergeladenen Torrents. Dies setzt voraus, dass Sie bereits eine Festplatte eingerichtet haben und diese unter / media / arm-disk / eingehängt ist. Aus Sicherheitsgründen wird der Daemon von seinem eigenen Benutzer anstatt als root oder als "Ubuntu" ausgeführt. Ein neuer Benutzer wird vom Installationsprogramm für den Übertragungsdämon "debian-transmission" erstellt. Dieser Benutzer muss den von uns erstellten Ordner besitzen und Lese- und Schreibzugriff auf den Speicherort für die heruntergeladenen Torrents haben.

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

Jetzt müssen wir nur kurz mit der Übertragung beginnen, damit die von uns benötigte Einstellungsdatei erstellt wird:

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

Dieser Befehl startet den Transmission-Daemon als Debian-Transmission-Benutzer, weist ihn an, das Verzeichnis / opt / transmission für die Einstellungsdateien zu verwenden und weiterhin im Vordergrund zu laufen. Nach einigen Sekunden drücken, um den Vorgang Control+Czu beenden. Wir können jetzt die Einstellungsdatei bearbeiten.

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

Wir müssen jetzt die folgenden Zeilen aus ihren Standardeinstellungen ändern, um zu lesen:

"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.*",

Speichern und beenden (Escape, tippe: wq und drücke Enter)

Die beiden mittleren Änderungen ermöglichen die Verwendung des Verzeichnisses "Incomplete", wodurch die fertigen Torrents von den unfertigen getrennt werden. Das ist nicht unbedingt notwendig, aber ich persönlich finde es äußerst nützlich. Mit der letzten Änderung kann von jedem Computer im LAN auf die Web-GUI zugegriffen werden (vorausgesetzt, Ihr LAN-Subnetz ist 192.168.1.0, ändern Sie dies, falls es anders ist).

Es ist jetzt eine gute Idee, Transmission erneut auszuführen, um zu prüfen, ob es funktioniert und tatsächlich einen Torrent herunterladen kann. Wir werden ein Webbrowser-Fenster verwenden, um auf die GUI zuzugreifen und einen Torrent hinzuzufügen. Lassen Sie uns zunächst den Zugriff auf die Web-GUI über die Firewall vom LAN aus zulassen und dann den Übertragungsdämon erneut ausführen.

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

Besuchen Sie diese URL in Firefox (oder in einem von Ihnen bevorzugten Browser): http://XXX.XXX.XXX.XXX:9091 , wobei XXX durch die Adresse Ihres Servers im LAN ersetzt wird (z. B. 192.168.1.10). Finden Sie einen Torrent zum Herunterladen, zum Beispiel Big Buck Bunny in 1080p60hz. Dies ist ein kostenloser Kurzfilm, der legal zum kostenlosen Download zur Verfügung steht. Klicken Sie in der Übertragungs-GUI auf die Schaltfläche "Open Torrent" (Torrent öffnen) und fügen Sie diesen Link (oder einen beliebigen anderen Torrent) in das erste Feld ein. Dann drücke "Upload". Wenn die Übertragung korrekt funktioniert, beginnt der Download des Torrents. Wenn dies nicht der Fall ist, müssen Sie herausfinden, warum dies so ist, bevor Sie fortfahren. Im Internet stehen viele Ressourcen zur Verfügung, um den Übertragungsdämon zu verwenden. Es könnte auch sein, dass der von Ihnen gewählte Strom nicht funktioniert. Probieren Sie zuerst einige andere aus.

Sobald der Download abgeschlossen ist, drücken Sie Control+Cim Terminalfenster, um den Übertragungsdämon zu stoppen.

Konfigurieren Sie die Bindungsübertragung an die VPN-Schnittstelle

Jetzt erstellen wir ein Upstart-Skript, mit dem die Übertragung gestartet wird, wenn das VPN bereit ist.

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

Machen Sie sich keine Sorgen, wenn dies beanstandet wird, sondern nur, um eine Sicherungskopie der Upstart-Datei zu erstellen, falls eine vorhanden ist - möglicherweise nicht. Lassen Sie uns vim öffnen, um das neue zu bearbeiten:

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

Fügen Sie dies in den Editor ein:

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

Speichern und schließen Sie vim. ( Escape, dann tippe :wq). Wieder offene vim:

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

Und fügen Sie dies ein:

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

Speichern und schließen Sie vim erneut. ( Escape, dann tippe :wq). Endlich:

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

Fügen Sie dies ein:

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

Diese Skripte weisen Upstart an, auf das Signal "transmission-vpn-up" zu warten. Das Skript "transmission-up.conf" richtet dann die erforderlichen Routing-Regeln ein, um Datenverkehr von der lokalen VPN-Adresse über die VPN-Schnittstelle zu senden, und legt fest, dass die Firewall Datenverkehr vom VPN zum Empfangsport für die Übertragung zulässt. Der Datenverkehr, der von der normalen LAN-Schnittstelle zum Abhörport von Transmission geleitet wird, ist blockiert. Das Skript "transmission-daemon.conf" startet dann transmission-daemon mit den erforderlichen Einstellungen, um es an die VPN-IP-Adresse zu binden. Beachten Sie, dass mit diesem Befehl auch sichergestellt wird, dass UPnP / NAT-PMP deaktiviert ist - siehe meinen Hinweis zur Portweiterleitung oben. Das "nice -15" setzt Transmission auf eine niedrigere Priorität, was ich nützlich fand, wenn ich das BeagleBone mit niedrigerer Spezifikation verwendete - manchmal kann Transmission Ressourcen verschlingen, was das System verlangsamt. Zumindest mit einer niedrigen Priorität können noch wichtigere Systemtasks ausgeführt werden. Das Skript "transmission-down.conf" entfernt die Firewall-Regeln, wenn das VPN gestoppt wird. Es werden drei verschiedene Skripte verwendet, damit der Übertragungsdämon als nichtprivilegierter Benutzer ausgeführt werden kann, die Firewall-Regeln können jedoch als Root ausgeführt werden.

Kehren wir nun zu den OpenVPN-Einstellungen zurück und bearbeiten Sie die Skripte "route-up" und "down", um das Starten und Stoppen unseres Übertragungsskripts auszulösen.

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

Fügen Sie dies in vim ein:

#! /bin/bash

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

Dieses Skript sagt Upstart lediglich, dass der Übertragungsdämon gestartet werden soll, und gibt ihm die Informationen, die er zum Anhängen an die VPN-Verbindung benötigt.

sudo vim /opt/ibVPN/down.sh

Wieder mehr Einfügen:

#! /bin/bash

/sbin/initctl emit transmission-vpn-down

Dieses Skript ist noch einfacher - es signalisiert, dass der Übertragungsdämon anhält.

Zu diesem Zeitpunkt ist es wahrscheinlich eine gute Idee, sicherzustellen, dass der Besitzer des gesamten VPN-Konfigurationsordners der Root-Benutzer ist. Da diese Skripts als Root ausgeführt werden, kann jeder, der sie ändern kann, alles ausführen, was er als Root-Benutzer möchte.

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

Dies bedeutet jetzt, dass nur der Root-Benutzer die VPN-Verbindungseinstellungen ändern oder anzeigen kann.

OK, wir sind fast fertig! Lassen Sie uns testen, ob unser Setup bisher funktioniert:

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

Stellen Sie erneut eine Verbindung zur Web-GUI von Transmission her und setzen Sie den vorhandenen Torrent fort oder fügen Sie einen neuen hinzu. Es sollte heruntergeladen werden können, möglicherweise nach ein paar Minuten Warten auf Gleichaltrige. Ein geschickter Weg, um zu testen, ob es funktioniert oder nicht, ist es, auf iftop zu schauen. Installieren Sie iftop und führen Sie Folgendes aus:

sudo apt-get install iftop
sudo iftop -i tap1

Dieser Bildschirm zeigt alle Verbindungen an, die über das VPN laufen. Wenn Ihr Torrent heruntergeladen wird und das VPN korrekt verwendet, werden hier viele IP-Adressen und Hostnamen angezeigt. Schauen Sie sich auch das iftop für die LAN-Verbindung an:

sudo iftop -i eth0

Hier sollten Sie eine große Menge an Datenverkehr zu einer einzelnen IP-Adresse sehen, da es sich um den VPN-Server handelt, und dann nur minimalen Datenverkehr zu anderen LAN-Geräten - vorausgesetzt, Sie führen keine anderen Dienste auf Ihrem BeagleBone aus.

Sie können bestätigen, dass das VPN funktioniert, indem Sie diese Anweisungen befolgen .
Auf dieser Site können Sie einen Torrent herunterladen, um die IP-Adresse anzuzeigen, die andere Peers für die Verbindung zu Ihnen verwenden. Wenn alles funktioniert, ist dies die VPN-IP-Adresse und nicht Ihre eigene WAN-IP-Adresse.

Wenn Probleme auftreten, können Sie das Upstart-Fehlerprotokoll folgendermaßen anzeigen:

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

Führen Sie in einem separaten Terminal- / SSH-Fenster den Befehl tail aus, während Sie die VPN-Verbindung wie oben beschrieben starten, und suchen Sie nach Fehlermeldungen. Hoffentlich können Sie das Problem beheben, indem Sie die Fehlermeldungen anzeigen, nicht im Internet stöbern oder einen Kommentar veröffentlichen.

Konfigurieren Sie alles so, dass es automatisch startet

Wenn Sie mit der manuellen Ausgabe des Befehls zum Starten des OpenVPN-Tunnels zufrieden sind oder mit Ihrem eigenen Skript arbeiten möchten, sind Sie fertig. Aber ich wollte, dass es beim Booten startet, also habe ich ein weiteres Upstart-Skript erstellt, um OpenVPN zu starten.

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

Dies ist das Letzte, was wir einfügen müssen!

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

Warten Sie nur, bis das System signalisiert, dass das Netzwerk bereit ist, und starten Sie dann den OpenVPN-Tunnel, der wiederum die Übertragung startet. Wenn das System ausgeschaltet ist oder das Netzwerk aus irgendeinem Grund heruntergefahren wird, entfernt Upstart die Firewall-Regeln und schließt den Übertragungsdämon. Einfach! Dies funktioniert auch nach einem Neustart weiter. Jetzt sind Sie bereit.

Verwenden Sie für die Interaktion mit Transmission die Web-GUI wie in der Setup-Phase. Sie können die GUI auch über das Internet zugänglich machen, indem Sie die Portweiterleitung einrichten. Es gibt viele Tutorials, wie man das macht, deshalb werde ich es hier nicht wiederholen.

Um die fertigen Downloads vom BeagleBone zu bekommen, verwende ich NFS. Ich kann Geschwindigkeiten von ca. 8 MB / s erreichen, wenn ich vom BeagleBone über das LAN auf meinen Desktop-Computer kopiere - was für ein so leistungsschwaches Gerät ziemlich gut ist. Ubuntu bietet einige nützliche Informationen zum Einrichten.


Wow! Wie lange haben Sie nach all dem gesucht?
Ismael Miguel

Haha, eine ganze Weile. Ich hatte es schon einmal auf einem DD-WRT-Router gemacht. Als ich es dann wieder für den BeagleBone tat, dachte ich, ich würde es aufschreiben, damit ich nicht vergesse, wie es geht. : D
Seanlano

1
Sie sollten dies auch lesen: unix.stackexchange.com/questions/88693/… (Es ist eine großartige Antwort.) Dies wird Ihnen helfen, da bin ich mir sicher.
Ismael Miguel

3
Ich habe gerade festgestellt, dass diese Konfiguration DNS über die normale WAN-Verbindung verliert, nachdem ich meinen DNS-Server auf OpenDNS eingestellt und die Statistiken durchgesehen habe . Ich werde weiter nachforschen, um zu sehen, ob ich das beheben kann. Ich werde sowieso weitermachen, da die Verbindung selbst über das VPN erfolgt - aber es ist nicht ideal.
Seanlano

1
@seanlano Danke, dass Sie uns darauf aufmerksam gemacht haben. Lassen Sie uns wissen, ob / wann Sie eine Lösung finden.
Winterflags

7

Ich habe gerade mit SystemD gearbeitet, also dachte ich, ich würde teilen. Ich habe alle meine Skripte, Konfigurationen und Zertifikate in demselben Verzeichnis abgelegt, auf das ich mich beziehen werde/etc/openvpn/myprovider

OpenVPN-Konfiguration

Dies hängt von Ihrem spezifischen VPN ab, aber ein Unterschied zu @ seanlanos Konfiguration besteht darin, dass ich nur ein route-upSkript verwende. Die Dinge, die Sie zusätzlich zu Ihrer funktionierenden bereitgestellten Konfiguration benötigen , sind diese Zeilen:

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

Wo Sie das transmission-route-up.shSkript platzieren, wo immer Sie möchten. Beachten Sie das Fehlen eines downSkripts. (Mein VPN verwendete bereits ein benutzerdefiniertes Down-Skript, sodass ein Konflikt aufgetreten wäre.)

/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

Die erste Zeile printenvist wichtig. Platzieren Sie es an einem beliebigen Ort. Es wird später im SystemD-Dienst verwendet. Ich lege es in das gleiche Verzeichnis wie meine VPN-Konfiguration.

24328 ersetzen durch den Port, den Ihr Übertragungs-Daemon abhören soll. Ich benutze iptables (mit Debian), so dass Sie diese Zeilen wahrscheinlich durch die UFW-Zeilen aus @ seanlanos Konfiguration ersetzen können.

SystemD VPN-Dienst

Dies ist der Dienst, der das VPN für uns automatisch startet. Stellen Sie sicher, dass der Pfad zu openvpn auf Ihrem Computer korrekt ist und dass der Pfad zur Konfigurationsdatei ebenfalls korrekt ist. Sie müssen full angeben Pfade in SystemD-Diensten .

/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

Aktivieren Sie den VPN-Dienst mit:

systemctl enable my-vpn.service

Und teste es mit:

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

Wenn es gestartet ist / läuft, bist du gut.

SystemD transmission-daemon.service

Dieses Skript benötigt den VPN-Dienst. Wenn der VPN-Dienst ausfällt, fällt auch der Übertragungs-Daemon aus. Dies ist praktisch, wenn der VPN neu gestartet wird und Sie eine neue IP-Adresse erhalten, da die Übertragung dann neu gestartet und gebunden werden muss, was automatisch erfolgen sollte. Beachten Sie, dass wir die Umgebungsvariablen verwenden, die wir in der Tabelle gedruckt habenroute-up zuvor Skript haben.

/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

Aktivieren Sie es

systemctl enable transmission-daemon.service

Und fang an

systemctl start transmission-daemon.service

Nach dem Neustart sollte alles automatisch starten (in der richtigen Reihenfolge!). Beachten Sie, dass die Verwendung Type=simpleim VPN-Dienst einige Probleme beim Timing der Skriptreihenfolge verursacht. Daher empfehle ich die Verwendungforking .

Sie können eine tatsächliche IP-Adresse für angeben, rpc-bind-addresswenn Sie restriktiver sein möchten (dies ist die Web-GUI-Abhöradresse, die nicht Ihre VPN-IP sein sollte). Und wenn Sie die Übertragung mit nice ausführen möchten, ändern Sie einfach die ExecStartZeile und ergänzen Sie /usr/bin/nice -n15den Anfang.

Adressänderungen behandeln

Eine Sache, die ich im Laufe der Zeit bemerkt habe, ist, dass, wenn die VPN-Verbindung aus irgendeinem Grund eine neue IP-Adresse erhält, die Übertragung immer noch an die alte Adresse gebunden ist und nicht mehr funktioniert. Und schlicht macht systemctl restart transmission-daemon.servicees nicht. Es muss ganz aufhören und dann von vorne beginnen.

Keine Ahnung warum, aber aus diesem Grund habe ich meiner root crontab ( sudo crontab -e) die folgenden Zeilen hinzugefügt :

# 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

Läuft das auch aus Interesse auf einem BeagleBone? Wenn ja, sehen Sie Leistungsprobleme bei der Übertragung? Auch tolles Schreiben. :)
Seanlano

Ah nein. Es läuft auf meinem normalen Desktop-Computer und ich habe dort keine Probleme bemerkt.
Jonas Kalderstam

Meinetwegen. Funktioniert für mich auf einem Intel-Rechner einwandfrei, ich hatte gehofft, ich könnte eine billige Torrent-Box mit einem ARM-Prozessor bauen - aber anscheinend soll es nicht sein.
Seanlano

Schau dir rtorrent an. Es ist sehr performant
Jonas Kalderstam

Danke, werde ich. Andere Dinge laufen gut auf der ARM-Box, also funktioniert rtorrent möglicherweise einwandfrei.
Seanlano

3

Ich habe bemerkt, dass Sie erwähnt haben, dass die Übertragung für UPnP / NAT-PMP nicht über das VPN erfolgt. Ich habe dies auch bemerkt und einen Patch für die Übertragung erstellt, der die Einstellung bind-address-ipv4 für UPnP berücksichtigt. NAT-PMP ist etwas schwieriger zu implementieren, da Sie das Standard-Gateway festlegen müssen. UPnP wird derzeit hauptsächlich verwendet, es ist also wahrscheinlich gut genug. Ich habe dies als Fehler auf der trac.transmissionbt-Site protokolliert und den Patch bereitgestellt. Hoffentlich wird es in einer zukünftigen Version enthalten sein. https://trac.transmissionbt.com/ticket/5990

Eine weitere Option für den Moment, in dem Sie nicht neu kompilieren möchten, ist das manuelle Ausführen von upnpc aus dem miniupnpc-Paket. Z.B

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

Dabei ist 10.10.10.51 Ihre VPN-IP und 51515 Ihr angeforderter TCP / UDP-Port.

Ich bin nicht sicher, wie lange die Weiterleitung gültig ist. Sie können auch die Option '-d' verwenden, um Ihren Port beim Trennen der Verbindung zu entfernen. Wenn ich das nicht tue, kann ich denselben Port nicht mehr bekommen, wenn ich mich erneut im VPN anmelde.

Prost


Ich habe ewig versucht, eine Lösung wie diese zu finden, ich wünschte, ich hätte sie gefunden miniupnpc! Und hoffentlich wird der Patch zusammengeführt und dieses Problem wird für immer behoben. In der Zwischenzeit werde ich auf jeden Fall versuchen, Ihren praktischen Tipp zu verwenden.
Seanlano
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.