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

20

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

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

  • Передача выполняется только через VPN, и запрещается запускать торренты через обычное WAN-соединение.
  • Только трафик, направленный на передачу, будет принят или отправлен через VPN, весь другой незапрошенный трафик будет отброшен
  • Передача использует соответствующий порт для прослушивания на основе назначенного IP-адреса
  • OpenVPN запускается автоматически при загрузке, которая затем запускает передачу
  • Доступ к веб-интерфейсу Transmission можно получить через локальную сеть и, возможно, через Интернет из моего WAN-соединения (т.е. не через VPN).
seanlano
источник
3
Самостоятельные ответы не плохие. Не извиняйся за них. Вы также не должны объяснять, что это то, что вы делаете, хотя ... Это обнадеживающее поведение
RobotHumans
Договорились с @hbdgaf. Не нужно извиняться. Отличная работа на всех фронтах.
JakeGould

Ответы:

23

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

seanlano
источник
Вот это да! Сколько времени вы потратили на поиски всего этого?
Исмаэль Мигель
Хаха, довольно долго. Я делал это однажды на маршрутизаторе DD-WRT, затем, когда я снова делал это для BeagleBone, я решил написать это, чтобы не забыть, как это сделать. : D
seanlano
1
Вы также должны прочитать это: unix.stackexchange.com/questions/88693/… (это отличный ответ.) Это поможет вам, я в этом уверен.
Исмаэль Мигель
3
Я только что понял, после настройки моего DNS-сервера для использования OpenDNS и просмотра статистики, что эта конфигурация пропускает DNS через обычное WAN-соединение . Я буду расследовать дальше, чтобы посмотреть, смогу ли я это исправить. Я все равно продолжу работать, так как само соединение осуществляется через VPN - но это не идеально.
seanlano
1
@seanlano Спасибо, что обратили на это наше внимание. Дайте нам знать, если / когда вы найдете решение.
зимние флаги
7

Просто заставил это работать, используя 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
Йонас Кальдерстам
источник
Просто из интереса, это также работает на BeagleBone? Если да, вы видите проблемы с производительностью при передаче? Также отличная рецензия. :)
seanlano
Ах нет Он работает на моем обычном настольном компьютере, и я не заметил никаких проблем.
Йонас Кальдерстам
Справедливо. У меня хорошо работает на машине с Intel, я надеялся, что смогу сделать дешевую торрент-коробку с процессором ARM - но, видимо, это не так.
seanlano
Проверьте рторрент. Это очень
продуктивно
Спасибо, я буду. Другие вещи работают нормально на ARM, так что, возможно, rtorrent будет работать правильно.
seanlano
3

Я заметил, что вы упомянули, что передача не проходит через 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.

ура

falk0069
источник
Я потратил целую вечность, пытаясь найти решение, подобное этому, я бы хотел найти miniupnpc! И, надеюсь, патч слился, и эта проблема будет исправлена ​​навсегда. А пока я определенно попытаюсь использовать ваш удобный совет.
seanlano