Демон передачи через OpenVPN

Недавно я приобрел BeagleBone Black, на который я установил Ubuntu, используя этот метод. До сих пор все работало. Я хочу использовать свой BeagleBone в качестве торрент-бокса, но я не хочу делать это напрямую через свое интернет-соединение (я не думаю, что моему провайдеру это понравится) - поэтому я купил VPN-подписку на европейском сервере, Я вручную подключил свой ноутбук к этому VPN и запустил Transmission. Я знаю, что VPN-соединение работает в Ubuntu, и хост предоставляет информацию о настройке OpenVPN. Досадно, что динамическая природа назначенного IP-адреса означает, что он будет часто меняться, поэтому, когда я использовал свой ноутбук с VPN, я вручную устанавливал адрес прослушивания в Transmission на требуемое значение.

В идеале я хотел бы следующую настройку:

  • Передача выполняется только через VPN, и запрещается запускать торренты через обычное WAN-соединение.
  • Только трафик, направленный на передачу, будет принят или отправлен через VPN, весь другой незапрошенный трафик будет отброшен
  • Передача использует соответствующий порт для прослушивания на основе назначенного IP-адреса
  • OpenVPN запускается автоматически при загрузке, которая затем запускает передачу
  • Доступ к веб-интерфейсу Transmission можно получить через локальную сеть и, возможно, через Интернет из моего WAN-соединения (т.е. не через VPN).

5 ответов

Решение

Примечание: (2016-02-22) Я понял, что эта конфигурация пропускает DNS-запросы к торрент-трекерам через обычную глобальную сеть, а не отправляет их через VPN. Я расследую, как это исправить. Я собираюсь продолжать работать с моей конфигурацией, так как само соединение использует VPN правильно.


Обновление: я заметил, что когда я устанавливаю Transmission для загрузки на Beaglebone в течение ночи, загрузка ЦП через некоторое время достигает 100%. Похоже, что это не происходит через одно и то же время, иногда все хорошо, а иногда - через 10 минут. Он также может восстановиться, приостановив все торренты и дождавшись, пока загрузка процессора вернется к нормальному состоянию, а затем начнется снова. Я все еще расследую. Обходной путь может состоять в том, чтобы периодически приостанавливать и возобновлять торренты, хотя это не очень хороший обходной путь. Обратите внимание, что эта проблема касается только Beaglebone и, возможно, других устройств ARM. У меня никогда не было этой проблемы на процессоре x86.


Вступление

Я разработал и протестировал это решение для Ubuntu 14.04, работающей на BeagleBone Black. Провайдер VPN, который я использую, называется ibVPN. Он должен работать с любым поддерживаемым оборудованием (например, на "нормальном" компьютере с архитектурой x86), с любым OpenVPN -совместимым провайдером VPN - и, вероятно, должен работать для 14.10 или более поздней версии. В какой-то момент я считаю, что Ubuntu будет использовать SystemD для загрузки, а это означает, что используемые здесь сценарии Upstart необходимо будет перенести. Обновление: Jonas Kalderstam имеет ответ ниже для использования SystemD. Я также предполагаю, что в качестве брандмауэра используется ufw, если вы используете что-то другое, то здесь нужно будет изменить команды ufw.

Я предполагаю, что вся работа выполняется по SSH-соединению с системой, хотя она будет работать так же хорошо, если набрать ее на физическом терминале.

Это довольно длинный урок, пожалуйста, сначала прочитайте все и убедитесь, что вы довольны тем, что будете делать.

Я также заметил, что передача не связывается должным образом с IP-адресом для отправки данных UPnP/NAT-PMP - то есть торрент-данные корректно проходят через VPN, но если включена переадресация порта UPnP, передача будет запрашивать переадресацию порта с локального маршрутизатора., а не через VPN с сервера VPN. Поэтому я заставил скрипт Upstart отключить переадресацию портов, поскольку он может выглядеть так, как будто он работает, но это не так. Должна быть возможность использовать iptables и iproute для принудительной передачи всего трафика от пользователя передачи debian через VPN, но я все еще изучаю это. Он также должен работать, если маршрут по умолчанию был изменен для отправки всех данных из Интернета через VPN, но я не хотел этого делать, потому что я использую этот сервер и для других целей, и это также приведет к тому, что все обновления системы будут проходить через VPN. Эффект этого состоит в том, что Transmission, вероятно, будет загружать торренты медленнее, чем если бы работала переадресация портов - но я обнаружил, что разумные скорости могут быть достигнуты для большинства торрентов без переадресации портов. Этот вопрос содержит дополнительную информацию, если вы действительно хотите, чтобы UPnP работал через VPN. Обновление: falk0069 имеет фантастический совет ниже, чтобы помочь стимулировать UPnP через VPN.

Установка и настройка OpenVPN

Я бы порекомендовал вам попробовать заставить ваше VPN -соединение работать с использованием Ubuntu, прежде чем пытаться заставить его работать здесь - то есть с рабочего стола. Это подтвердит правильность конфигурации и сократит время, затрачиваемое на отладку.

Во-первых, установите необходимые пакеты

sudo apt-get install openvpn

Затем создайте каталог для хранения файлов конфигурации. Я использую / opt / ibVPN, так как это провайдер, которого я использую. Измените это на то, что вам нравится.

sudo mkdir /opt/ibVPN

Первое, что нужно сделать в этом новом каталоге, это создать файл конфигурации для запуска VPN -клиента. ibVPN предоставляет основной файл конфигурации для пользователей Linux, который я в основном только что скопировал и вставил.

cd /opt/ibVPN
sudo vim config.ovpn

Скопируйте и вставьте отредактированную версию в vim, используя настройки вашего провайдера VPN. (К вашему сведению, вставьте в терминал Ubuntu Ctrl+Shift+V) Вы должны иметь возможность получить это от вашего провайдера 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"

Для тех, кто не знаком с vim, нажмите Insert введите или вставьте текст, затем нажмите Escape и введите :wq сохранить и выйти. Конечно, вам не нужно использовать vim - любой текстовый редактор будет работать.

Я быстро объясню этот файл конфигурации: первые 18 строк определяют конкретные настройки для использования с сервером, они взяты из ibVPN - ваши, вероятно, будут немного отличаться, если у вас другой поставщик. Следующие строки представляют собой измененные параметры, которые я указал.

  • Если в вашем файле настроек есть строки с auth-user* Прокомментируйте это. Чтобы эта настройка работала автоматически, нам нужен файл с именем пользователя и паролем, поэтому убедитесь, что пароль, выбранный вами для провайдера VPN, является надежным, случайным и уникальным.

  • auth-user-pass pass говорит OpenVPN искать файл с именем pass читать пользователя и пароль от.

  • auth-nocache удаляет пароль из памяти, что может немного повысить безопасность, если вы беспокоитесь об этом.

  • persist-tun будет пытаться сохранить тот же IP-адрес от сервера, если ваше соединение оборвется, что, как мы надеемся, должно означать меньше запуска и остановки Transmission-daemon.

  • route-noexec говорит клиенту OpenVPN не использовать автоматически маршруты, предоставленные сервером, что перетянет весь сетевой трафик через VPN. Мы просто хотим отправлять торрент-трафик, поэтому нам нужно будет использовать разные настройки маршрутизации.

  • lport 1195 говорит клиенту OpenVPN использовать порт 1195 вместо 1194 - в моем случае я также хочу запустить сервер OpenVPN на том же устройстве, и серверу нужно будет использовать порт 1194. Даже если вы не используете сервер OpenVPN, он не помешает сделать это изменение.

  • Я изменил линию dev tap в dev tap1, чтобы заставить виртуальное устройство быть tap1 вместо того, чтобы быть назначенным OpenVPN, снова из-за запуска отдельного сервера OpenVPN. Даже если вы не используете VPN -сервер, это изменение не должно иметь значения. Скрипты брандмауэра были написаны для использования tap1, так что если вы предпочитаете использовать другое устройство, не забудьте изменить эти сценарии, где это необходимо.

  • lladdr 00:FF:11:AA:BB:CC говорит OpenVPN назначить интерфейсу касания этот MAC-адрес, что может быть полезно для правил брандмауэра iptables.

  • route-up а также down при необходимости запустите сценарии для запуска и остановки Transmission-daemon - они необходимы здесь, потому что они работают с переменными среды, содержащими информацию о соединении, которая необходима для правильной привязки Transmission к нужному IP-адресу и порту.

В моем случае у меня был сертификат сервера от провайдера VPN, который также должен находиться в том же каталоге, что и файл конфигурации.

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

Скопируйте и вставьте это или переместите через SCP или 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-----

Очевидно, что если вы не используете учетную запись ibVPN, ваш сертификат будет другим.

Давайте теперь создадим файл паролей:

sudo vim /opt/ibVPN/pass

Первая строка должна быть полным именем пользователя, затем вторая строка должна быть паролем. Это должно быть единственным содержимым этого файла.

you@address.com
myBIGstrongpassword1234567890

Мы также должны защитить разрешения для этого файла, иначе OpenVPN не запустится.

sudo chmod 400 pass

Это сделает файл доступным только для чтения и только для владельца (т.е. никакой другой пользователь не сможет его прочитать)

Эти команды создадут файлы для запуска при запуске и сделают их исполняемыми только пользователем root.

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

На этом этапе, вероятно, стоит проверить, действительно ли работает VPN -соединение. Начать соединение с:

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

Вы увидите предупреждения о том, что внешние команды up и down не могут быть запущены, но не беспокойтесь об этом. Если это работает, вы увидите Initialization Sequence Completed на терминале. Нажмите Control+C завершить соединение. Если это не сработает, вам придется выяснить, почему нет и исправить это, прежде чем продолжить. Я обнаружил, что иногда требуется несколько ходов, чтобы начать работать. Убедитесь, что ваш файл паролей правильный. В Интернете есть много отличных ресурсов об OpenVPN, так что взгляните вокруг.

На данный момент, вероятно, проще всего перейти к настройке и запуску Transmission. Если вы уверены, что VPN и Transmission могут работать раздельно, их можно объединить.

Установка и настройка трансмиссии

Установите необходимые пакеты:

sudo apt-get install transmission-daemon

По умолчанию Transmission будет запускаться автоматически при загрузке. Поскольку в конечном итоге мы будем использовать OpenVPN для запуска передачи, мы хотим отключить это. Для этого отредактируйте файл конфигурации для Transmission-daemon

sudo vim /etc/default/transmission-daemon

И измените следующую строку, чтобы читать:

ENABLE_DAEMON=0

Теперь передача не начнется при загрузке.

Теперь давайте создадим каталог для настроек передачи, в которых будут находиться загруженные торренты. Это предполагает, что вы уже настроили какой-то диск, и он смонтирован в /media/arm-disk/. В целях безопасности демон будет запускаться своим собственным пользователем, а не как пользователь root или как "ubuntu". Новый пользователь создается установщиком для демона передачи "debian-transmission". Этот пользователь должен владеть папкой, которую мы создаем, и иметь права на чтение и запись в хранилище для загружаемых торрентов.

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

Теперь нам нужно кратко начать передачу, чтобы он создал нужный файл настроек:

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

Эта команда запускает демона передачи в качестве пользователя debian-translation, говорит ему использовать каталог /opt/transmission для файлов настроек и говорит, что он должен работать на переднем плане. Как только он запустится в течение нескольких секунд, нажмите Control+C чтобы закончить это. Теперь мы можем отредактировать файл настроек.

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

Теперь нам нужно перейти к следующим строкам по умолчанию:

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

Сохранить и выйти (Escape, введите:wq и нажмите Enter)

Средние два редактирования позволят использовать "неполный" каталог, отделяя ваши законченные торренты от незаконченных. Это не совсем необходимо, но я лично нахожу это чрезвычайно полезным. Последнее редактирование позволяет получить доступ к веб-интерфейсу с любого компьютера в локальной сети (при условии, что ваша подсеть локальной сети - 192.168.1.0, измените ее, если она отличается).

Теперь хорошей идеей будет снова запустить 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

Посетите этот URL в Firefox (или любом другом браузере): http://XXX.XXX.XXX.XXX:9091, где XXX заменяется адресом вашего сервера в локальной сети (т. Е. 192.168.1.10). Найдите торрент для загрузки, например Big Buck Bunny в разрешении 1080p60hz. Это бесплатный короткометражный фильм, легально доступный для бесплатного скачивания. В графическом интерфейсе передачи нажмите кнопку "Открыть торрент" и вставьте эту ссылку (или любой другой понравившийся торрент) в первое поле. Затем нажмите "Загрузить". Если передача работает правильно, торрент начнет загружаться. Если этого не произойдет, то вам нужно выяснить, почему, прежде чем продолжить. В Интернете доступно множество ресурсов для использования демона передачи. Это также может быть тот поток, который вы выбрали, не работает, попробуйте сначала несколько других.

После завершения загрузки нажмите Control+C в окне терминала остановить передачу-демон.

Настроить привязку передачи на интерфейс VPN

Теперь давайте создадим сценарий Upstart, который будет использоваться для запуска передачи, когда VPN будет готова.

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

Не беспокойтесь, если это будет жаловаться, просто сделайте резервную копию файла Upstart, если он существует - его может и не быть. Давайте откроем vim для редактирования нового:

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

Вставьте это в редактор:

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

Сохраните и закройте vim. (Escape затем введите :wq). Снова откройте vim:

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

И вставьте это:

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

Снова сохраните и закройте vim. (Escape затем введите :wq). В заключение:

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

Вставьте это:

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

Эти сценарии сообщают Upstart прислушиваться к сигналу "translation-vpn-up". Затем сценарий "translation-up.conf" устанавливает необходимые правила маршрутизации для отправки трафика с локального адреса VPN через интерфейс VPN и настраивает межсетевой экран на пропуск трафика из VPN в порт прослушивания для передачи. Трафик, направляемый на порт прослушивания Transmission из обычного интерфейса LAN, блокируется. Затем сценарий "translation-daemon.conf" запускает демона передачи с необходимыми настройками, чтобы привязать его к IP-адресу VPN. Обратите внимание, что эта команда также обеспечит отключение UPnP/NAT-PMP - см. Мою заметку вверху о переадресации портов. "Nice -15" устанавливает Transmission на более низкий приоритет, что я считаю полезным при использовании BeagleBone с более низкой спецификацией - иногда Transmission может захватывать ресурсы, что замедляет работу системы. По крайней мере, с низким приоритетом, более важные системные задачи могут выполняться. Сценарий "translation-down.conf" удалит правила брандмауэра при остановке VPN. Три различных сценария используются для того, чтобы демон передачи можно было запускать как непривилегированный пользователь, но правила брандмауэра можно запускать как root.

Теперь давайте вернемся к настройкам OpenVPN и отредактируем сценарии "route-up" и "down", чтобы запускать и останавливать наш скрипт Transmission.

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

Вставьте это в vim:

#! /bin/bash

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

Все, что делает этот скрипт, говорит Upstart, что демон передачи должен запуститься, и дает ему информацию, необходимую для подключения к VPN -соединению.

sudo vim /opt/ibVPN/down.sh

Опять же приклеиваем:

#! /bin/bash

/sbin/initctl emit transmission-vpn-down

Этот скрипт еще более прост - он сигнализирует об остановке демона передачи.

На этом этапе, вероятно, будет хорошей идеей убедиться, что владельцем всей папки конфигурации VPN является пользователь root - поскольку эти сценарии запускаются с правами root, любой, кто может их изменить, может запускать все, что хочет в качестве пользователя root.

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

Теперь это означает, что только пользователь root может изменять или просматривать настройки VPN -подключения.

ОК, мы почти закончили! Давайте проверим, работает ли наша установка до сих пор:

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

Снова подключитесь к веб-интерфейсу Transmission и возобновите существующий торрент или добавьте новый. Это должно быть в состоянии загрузить, возможно после нескольких минут ожидания для пиров. Изысканный способ тестирования того, работает ли он, - это посмотреть на iftop. Установите iftop и запустите:

sudo apt-get install iftop
sudo iftop -i tap1

На этом экране будут показаны все соединения, проходящие через VPN. Если ваш торрент загружается и правильно использует VPN, здесь будет много IP-адресов и имен хостов. Также посмотрите на iftop для подключения к локальной сети:

sudo iftop -i eth0

Здесь вы должны увидеть большой объем трафика на один IP-адрес, являющийся сервером VPN, а затем только минимальный трафик на другие устройства локальной сети - при условии, что вы не используете другие сервисы на своей BeagleBone.

Вы можете подтвердить, что VPN работает, следуя этим инструкциям.
Этот сайт позволяет вам скачать торрент, чтобы увидеть IP-адрес, который другие узлы используют для подключения к вам - если все работает, то это будет IP-адрес VPN, а не ваш собственный IP-адрес в глобальной сети.

Если у вас возникли проблемы, вы можете просмотреть журнал ошибок Upstart, выполнив:

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

В отдельном окне терминала /SSH попробуйте выполнить команду tail при запуске VPN -подключения, как описано выше, и найдите все сообщения об ошибках. Надеюсь, вы сможете решить проблему, увидев сообщения об ошибках, если не покопайтесь в Интернете, или оставьте комментарий.

Настройте все это для автоматического запуска

Если вы довольны ручным вводом команды для запуска туннеля OpenVPN или хотите сделать это с помощью собственного сценария, то все готово. Но я хотел, чтобы он запускался при загрузке, поэтому я сделал еще один скрипт Upstart для запуска OpenVPN.

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

Это последнее, что мы должны вставить!

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

Все, что нужно сделать, это дождаться, пока система подаст сигнал о готовности сети, а затем запустит туннель OpenVPN, который, в свою очередь, начнет передачу. Когда система выключена или если по какой-то причине сеть отключена, Upstart удалит правила брандмауэра и закроет демон передачи. Просто! Это продолжит работать и после перезагрузки, так что теперь все готово.

Чтобы взаимодействовать с Transmission, используйте веб-интерфейс, как мы делали на этапе установки. Также возможно сделать графический интерфейс доступным через Интернет, настроив переадресацию портов. Есть много учебников о том, как это сделать, поэтому я не буду повторять это здесь.

Что касается получения завершенных загрузок с BeagleBone, я использую NFS. Я могу получить скорость копирования около 8 МБ / с по локальной сети с BeagleBone на мой настольный компьютер - что очень хорошо для такого маломощного устройства. Ubuntu предоставляет некоторую полезную информацию для настройки этого.

Просто заставил это работать, используя SystemD, поэтому я решил поделиться. Я поместил все свои скрипты, конфиги и сертификаты в один каталог, который я буду называть /etc/openvpn/myprovider

OpenVPN config

Это зависит от вашего конкретного VPN, но одно отличие от конфигурации @seanlano заключается в том, что я использую только route-up скрипт. Таким образом, в дополнение к вашему рабочему конфигу вам понадобятся следующие строки:

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

Где вы размещаете transmission-route-up.sh Сценарий, где вы хотите. Обратите внимание на отсутствие down скрипт. (В моем VPN уже использовался нестандартный сценарий отключения, поэтому в любом случае он конфликтовал бы).

/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

Первая строка printenv, это важно. Разместите его там, где вам нравится, он будет использован в сервисе SystemD позже. Я помещаю его в тот же каталог, что и мой конфиг vpn.

Замените 24328 на любой порт, который должен прослушивать ваш трансмиссионный демон. Я использую iptables (используя Debian), так что вы, вероятно, можете заменить эти строки на строки ufw из конфигурации @seanlano.

VPN-сервис SystemD

Это сервис, который автоматически запускает VPN для нас. Убедитесь, что на вашем компьютере указан правильный путь к openvpn и правильный путь к файлу конфигурации. Вы должны указать полные пути в службах 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

Включить службу VPN с помощью:

systemctl enable my-vpn.service

И проверить это с:

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

Если он запущен / работает, ты в порядке.

Передача SystemD-daemon.service

Для этого сценария требуется vpn-сервис, поэтому, если vpn выходит из строя, демо-передача также отключается. Это удобно, если vpn перезапускается, и вы получаете новый IP-адрес, потому что тогда необходимо будет перезапустить и повторно связать передачу, что должно быть обработано автоматически. Обратите внимание, что мы используем переменные среды, которые мы напечатали в route-up Сценарий ранее.

/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

Включить это

systemctl enable transmission-daemon.service

И начни это

systemctl start transmission-daemon.service

При перезагрузке все должно запуститься автоматически (по порядку!). Обратите внимание, что с помощью Type=simple в сервисе vpn возникают некоторые проблемы для синхронизации порядка скриптов, поэтому я рекомендую использовать forking вместо.

Вы можете указать фактический IP-адрес для rpc-bind-address если вы хотите быть более строгим (это адрес прослушивания веб-интерфейса, который не должен быть вашим VPN-ip). И если вы хотите запустить передачу с хорошим, просто измените ExecStart линия и добавить /usr/bin/nice -n15 к началу.

Обработка изменений адреса

Со временем я заметил одну вещь: если vpn-соединение по какой-то причине получает новый ip-адрес, передача все равно будет привязана к старому адресу и перестанет работать. И просто занимаюсь systemctl restart transmission-daemon.serviceне режет это. Это должно полностью остановиться, а затем начать все заново.

Не знаю почему, но по этой причине я добавил следующие строки в мой корневой 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

Я заметил, что вы упомянули, что передача не проходит через VPN для UPnP/NAT-PMP. Я также заметил это и создал патч для Transmission, чтобы он учитывал настройку bind-address-ipv4 для UPnP. NAT-PMP немного сложнее реализовать, так как вам нужно определить шлюз по умолчанию. UPnP является основным, который используется в наши дни, поэтому, вероятно, он достаточно хорош. Я зарегистрировал это как ошибку на сайте trac.transmissionbt и предоставил патч. Надеюсь, он будет включен в будущий выпуск. https://trac.transmissionbt.com/ticket/5990

Если вы не хотите перекомпилировать сейчас, вы можете вручную запустить upnpc из пакета miniupnpc. Например

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

Где 10.10.10.51 - ваш VPN-IP, а 51515 - запрашиваемый порт TCP/UDP.

Я не уверен, как долго будет полезна пересылка. Также вы можете захотеть использовать опцию -d для удаления вашего порта при отключении. Я обнаружил, что если я этого не сделаю, я не смогу снова получить тот же порт, если перейду в VPN.

ура

Новый подход в 2022 году: сетевые пространства имен

За годы, прошедшие с тех пор, как я впервые попытался это сделать, произошли некоторые изменения, которые сделали настройку Transmission для работы через VPN проще и надежнее — с использованием «сетевого пространства имен». Это относится не только к Transmission, но и к любой службе systemd. Он больше не зависит от правильной привязки приложения к соответствующему сетевому интерфейсу, вместо этого systemd заставит весь сетевой трафик использовать настроенное пространство имен, что в нашем случае будет означать его отправку через VPN.


1. Настройте сеть

Существует множество способов настройки сети, в моем случае я уже использовал Netplan для создания моста. Вероятно, нет необходимости создавать его, если вы не используете его по другим причинам (вместо этого используйте опцию NAT), но для справки вот моя конфигурация Netplan, которую я использую в этом примере. Вам нужно будет соответствующим образом настроить или настроить сетевые интерфейсы с помощью другого инструмента по вашему выбору.

Пример конфигурации нетплана :

      network:
  version: 2
  renderer: networkd
  ethernets:
    enp1s0:
      dhcp4: no
      dhcp6: no
  bridges:
    br0:
      interfaces: [enp1s0]
      dhcp4: no
      dhcp6: yes
      dhcp6-overrides:
       use-dns: yes
       use-ntp: yes
       send-hostname: yes
       use-hostname: no
      addresses:
        - 192.168.64.200/24
        - "aaaa:bbbb:cccc::200:1/64"
      ipv6-privacy: yes
      gateway4: 192.168.64.1

2. Установите и настройте сценарии systemd-named-netns

Хотя systemd поддерживает сетевые пространства имен, у него не так много возможностей для их настройки. К счастью, услужливый парень по имени Джеймс Свинесон (James Swineson ) создал набор сценариев , которые создают службы systemd для различных конфигураций сетевых пространств имен.

Загрузите репозиторий:

      git clone https://github.com/Jamesits/systemd-named-netns.git

Установите скрипты:

      cd systemd-named-netns/
sudo make install

3. Настройте systemd-named-netns

Точная конфигурация, которая вам нужна, будет зависеть от настройки вашей сети. Я использую мост, но также доступна опция NAT. См. вики-страницу для получения дополнительной информации.

В остальной части этого руководства предполагается, что вы используете мост. я использую имя torrentvpnдля пространства имен оно появится в нескольких местах. Если вы решите использовать другое имя, убедитесь, что оно содержит только буквенно-цифровые символы и не длиннее 12 символов.

Создать resolv.confфайл для настроек DNS для использования внутри сетевого пространства имен:

      sudo mkdir -p /etc/netns/torrentvpn/
sudo touch /etc/netns/torrentvpn/resolv.conf

Затем отредактируйте файл /etc/netns/torrentvpn/resolv.confк этому:

      nameserver 8.8.8.8

Это будет использовать службу DNS Google для всего, что работает внутри сетевого пространства имен, не стесняйтесь использовать другой, если хотите — NextDNS — хорошая альтернатива.

Теперь настроим мост пространства имен, отредактируем файл /etc/default/netns-torrentvpnк этому:

      # Bridge name
BRIDGE=br0

# If you need DHCP
DHCPV4=1

# Set a static MAC, helpful with DHCP
MACADDR=02:00:00:aa:bb:01

# Device name outside netns
DEVNAME_OUTSIDE=veth0
# Device name inside netns
DEVNAME_INSIDE=veth1

На этом этапе мы можем протестировать настройку нашего сетевого пространства имен, запустив пространство имен с помощью этой команды:

      sudo systemctl start netns-bridge@torrentvpn.service
sudo systemctl enable netns-bridge@torrentvpn.service

Затем попробуйте пропинговать что-нибудь из пространства имен и убедитесь, что это работает:


4. Настройте OpenVPN

Существует огромное количество провайдеров VPN-услуг, поэтому шаги могут немного отличаться для вас. В идеале вы должны подтвердить, что можете настроить туннель OpenVPN, используя файлы конфигурации от вашего провайдера, возможно, сначала используя графический интерфейс, если это проще. Теоретически это даже не обязательно должен быть OpenVPN, это может быть любой VPN, который вы можете запустить через systemd.

У меня есть учетная запись в ProtonVPN, которая предоставляет файлы конфигурации OpenVPN, в которые встроены необходимые сертификаты и ключи. Файл конфигурации сохраняется в /etc/openvpn/client/protonvpn.confи я изменил его, чтобы имя пользователя и пароль считывались из файла по адресу /etc/openvpn/client/protonvpn.passauth-user-passвариант конфигурации). Вам нужно будет адаптировать это в соответствии с вашим провайдером.

Пакет OpenVPN предоставляет сценарии systemd для управления клиентским соединением, хотя мы хотим добавить пару дополнительных строк, чтобы наше соединение использовало сетевое пространство имен. Запустите эту команду:

      sudo systemctl edit openvpn-client@protonvpn.service

и добавьте следующие строки:

      [Unit]
BindsTo=netns@torrentvpn.service netns-bridge@torrentvpn.service
After=netns@torrentvpn.service netns-bridge@torrentvpn.service
JoinsNamespaceOf=netns@torrentvpn.service

[Service]
PrivateNetwork=yes
ExecStartPre=/sbin/sysctl net.ipv6.conf.all.disable_ipv6=1

Это создает «вставляемый» файл переопределения в /etc/systemd/system/openvpn-client@protonvpn.service.d/override.conf, что позволяет нам добавлять наши дополнительные настройки без необходимости редактировать конфигурацию от сопровождающего пакета. Он также отключает IPv6 внутри пространства имен, так как мой провайдер VPN не поддерживает его, и я не хочу случайно использовать мое подключение к Интернету без VPN.

Перезапустите демон systemctl, затем попробуйте запустить VPN:

      sudo systemctl daemon-reload
sudo systemctl start openvpn-client@protonvpn.service
sudo systemctl enable openvpn-client@protonvpn.service

Снова протестируйте с помощью ping через пространство имен, на этот раз время отклика должно быть медленнее, чем раньше, из-за дополнительного расстояния, которое теперь должны пройти пакеты, чтобы достичь конечной точки VPN:

      sudo chnetns torrentvpn ping google.com

5. Настройте демон передачи

Информации о настройке Transmission много, и у вас могут быть разные желания, так что читайте документацию . Я быстро покажу основные шаги здесь.

Установить передачу:

      sudo apt install transmission-daemon

Остановите демон (системный, похоже, запускает его после установки)

      sudo systemctl stop transmission-daemon.service

Отредактируйте файл конфигурации на /var/lib/transmission-daemon/.config/transmission-daemon/settings.json. В частности, вы, вероятно, захотите изменить download-dirкуда-нибудь с достаточным объемом памяти, а также разрешить доступ из вашей локальной сети в rpc-whitelist(для меня это означало добавление 192.168.64.*). Вам также потребуется установить пароль через rpc-passwordдля входа в веб-интерфейс.

Не забудьте установить правильные разрешения для вашего каталога загрузок:

      sudo chown debian-transmission:debian-transmission /home/torrents/

6. Установите передачу для использования VPN

Аналогично тому, как мы редактировали конфигурацию systemd для OpenVPN с переопределением, мы сделаем то же самое с Transmission:

      sudo systemctl edit transmission-daemon.service

Добавьте следующие строки и сохраните:

      [Unit]
BindsTo=netns@torrentvpn.service netns-bridge@torrentvpn.service
After=netns@torrentvpn.service netns-bridge@torrentvpn.service openvpn-client@protonvpn.service
Requires=openvpn-client@protonvpn.service
JoinsNamespaceOf=netns@torrentvpn.service

[Service]
PrivateNetwork=yes

Перезагрузите systemd, затем запустите службу:

      sudo systemctl daemon-reload
sudo systemctl start transmission-daemon.service
sudo systemctl reenable transmission-daemon.service

Из-за пространства имен веб-интерфейс Transmission будет доступен не с IP-адреса хост-компьютера, а с IP-адреса виртуального устройства внутри пространства имен, которое подключено к установленному нами мосту. Чтобы найти этот IP-адрес, запустите:

      sudo chnetns torrentvpn ip ad

и узнать адрес vethустройство – для меня это было 192.168.64.46. После этого пользовательский интерфейс Transmission доступен по адресу http://192.168.64.46:9091 с использованием имени пользователя и пароля, которые вы установили в файле конфигурации.

7. Проверка

Теперь все должно быть запущено. Лучший способ, который я нашел, чтобы подтвердить, что торренты действительно используют VPN для загрузки, — это использовать удобную проверку, которую предоставляет Torguard (спасибо @lemonek за то, что познакомил меня с этим!) — он дает вам специальный торрент для загрузки, и показывает, какие IP-адреса пытались поделиться им. Сравните отображаемый IP-адрес с вашим IP-адресом в Интернете и убедитесь, что он не совпадает. Вы также можете проверить IP-адрес, видимый серверами, для чего-либо с помощью VPN, выполнив:

      sudo chnetns torrentvpn curl http://ip.42.pl/raw

Это покажет IP-адрес, видимый сервером в ip.42.pl, который должен быть тем же IP-адресом, который показывает инструмент Torguard.

Странное поведение в Ubuntu 18.04

К сожалению, я обнаружил, что при перезагрузке настройка пространства имен сети, казалось, немного подыгрывала в Ubuntu 18.04 (но не в 20.04), из-за чего я не мог протестировать команды оболочки внутри пространства имен с помощью chnetnsкоманда. Как ни странно, хотя пространство имен отлично работало для служб внутри заданий systemd, Transmission по-прежнему работал нормально.

Я пробовал кучу вещей, но не мог понять, но я, по крайней мере, понял, что, остановив и перезапустив все, все это можно заставить работать:

      sudo systemctl stop netns@torrentvpn.service
sudo systemctl start transmission-daemon.service

Вдобавок к тому, что уже написано о службе SystemD... было бы разумнее связать службу VPN с услугой передачи - поэтому, когда вы перезапустите VPN, передача также должна быть перезапущена... для этого вам необходимо отредактировать файл службы VPN

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

и добавьте эти строки:

PartOf=transmission-daemon
ExecStartPost=/bin/sleep 30

В раздел [Сервис].

PartOf сделает зависимость в одном направлении - если VPN будет перезапущен, перезапустите и эту службу. (документация)

В моем случае - VPN потребовалось еще несколько секунд для настройки и немедленного запуска передачи, из-за чего демон передачи использовал "старый" файл env - поэтому я добавил дополнительное время ожидания 30 секунд (ExecStartPost=/bin/sleep 30) после того, как VPN начал просто на всякий случай.

Я сейчас нахожусь на стадии тестирования - так что это еще не "домашний производственный сервер", да - так что я часто еще переводил свой компьютер в спящий режим. после этого мое VPN-соединение не работает. Так что я еще не сделал этого, но было бы неплохо иметь какую-то функцию сторожевого пса, чтобы проверить, все ли соединение VPN живо - но это еще в моем списке ДОЛЖНО ДЕЛАТЬ...

Кроме того, чтобы проверить, действительно ли ваша установка работает, вы можете использовать этот сервис torguard.net, где вы можете "скачать" торрент-файл и открыть его в своей удаленной передаче и проверить, какая ошибка / комментарий возвращается из Tracker - он должен вернуть ваш VPN/ замаскированный IP-адрес и на той же странице. Вы можете отслеживать текущие соединения, чтобы проверить, работает ли это вообще.

Другие вопросы по тегам