通过OpenVPN的传输守护进程


20

我最近购买了BeagleBone Black,并使用这种方法在其上安装了Ubuntu 。到目前为止,一切都奏效了。我想将BeagleBone用作洪流盒,但我不想直接通过Internet连接进行操作(我不认为我的ISP会喜欢它)-因此,我已经从欧洲服务器购买了VPN订阅。在此之前,我已经将笔记本电脑手动连接到该VPN并运行“传输”。我知道VPN连接可在Ubuntu中运行,并且主机为OpenVPN提供设置信息。令人讨厌的是,分配的IP地址的动态性质意味着它会经常更改,因此当我将笔记本电脑与VPN一起使用时,我会在“传输”中手动将侦听地址设置为所需的值。

理想情况下,我需要以下设置:

  • 传输仅通过VPN运行,禁止通过普通WAN连接运行种子
  • 仅定向到传输的流量将通过VPN接受或发送,所有其他未经请求的流量将被丢弃
  • 传输基于分配的IP地址使用适当的端口进行侦听
  • OpenVPN在启动时自动启动,然后随后开始传输
  • 传输的Web GUI可以通过LAN访问,也可以通过我的WAN连接通过Internet访问(即不通过VPN返回)

3
自我回答还不错。不要为他们道歉。您也不必解释那是您在做什么…… 这是一种令人鼓舞的行为
RobotHumans 2015年

同意@hbdgaf。不用道歉。各个方面的出色工作。
JakeGould 2015年

Answers:


23

注意: (2016-02-22)我已经意识到此配置将DNS查询通过普通WAN泄漏给torrent跟踪器,而不是通过VPN发送。我正在研究如何解决此问题。我将继续运行配置,因为连接本身确实正确使用了VPN。


更新: 我注意到,当我将Transmission设置为在Beaglebone上下载过夜时,一段时间后CPU使用率将达到100%。在相同的时间之后似乎并没有发生这种情况,有时整夜都很好,而另一些时间在10分钟后仍然很困难。通过暂停所有种子文件并等待CPU负载恢复正常,然后再次启动,它也可以恢复。我还在调查中。解决方法可能是定期暂停和恢复种子,尽管这不是一个很好的解决方法。 请注意,此问题仅适用于Beaglebone以及其他ARM设备。我从未在x86 CPU上遇到过此问题。


介绍

我已经为在BeagleBone Black上运行的Ubuntu 14.04开发并测试了该解决方案。我使用的VPN提供商称为ibVPN。它应该可以与任何受支持的硬件一起使用(例如,在“正常” x86计算机上),并且可以与任何OpenVPN兼容的VPN提供程序一起使用-并且可能应在14.10或更高版本上工作。在某些时候,我相信Ubuntu将使用SystemD进行引导,这意味着此处使用的Upstart脚本需要迁移。更新: Jonas Kalderstam 使用SystemD时有一个答案我还假设ufw被用作防火墙,如果您使用的是其他方式,则这里的ufw命令将需要更改。

我假设所有工作都是通过与系统的SSH连接完成的,尽管如果输入到物理终端中也可以正常工作。

这是一个很长的教程,请先阅读所有内容,并确保对所要执行的操作感到满意。

我还注意到传输未正确绑定到用于发送UPnP / NAT-PMP数据的IP地址-即,洪流数据正确地通过了VPN,但是如果启用了UPnP端口转发,传输将请求从本地路由器转发端口,而不是通过来自VPN服务器的VPN。因此,我使Upstart脚本禁用了端口转发,因为它看起来好像已经起作用了,但没有起作用。应该可以使用iptables和iproute强制来自debian-transmission用户的所有流量通过VPN进行,但是我仍在对此进行研究。如果将默认路由更改为通过VPN发送所有Internet数据,它也应该工作,但是我不想这样做,因为我也将此服务器用于其他用途,这也将导致所有系统更新通过VPN。如果您真的想让UPnP通过VPN工作,此问题将提供更多信息 更新: falk0069下面有一个很棒的技巧,可帮助鼓励通过VPN的UPnP。

安装和配置OpenVPN

我建议您先尝试使用Ubuntu使VPN连接正常工作,然后再尝试使其在此处工作(例如,从台式机开始)。这将确认您具有正确的配置并减少调试时间。

首先,安装所需的软件包

sudo apt-get install openvpn

接下来,创建一个目录来存储配置文件。我正在使用/ opt / ibVPN,因为这是我正在使用的提供程序。将其更改为您喜欢的任何内容。

sudo mkdir /opt/ibVPN

在此新目录中要做的第一件事是创建用于运行VPN客户端的配置文件。ibVPN为Linux用户提供了一个基本的配置文件,我基本上只是复制和粘贴了该文件。

cd /opt/ibVPN
sudo vim config.ovpn

使用VPN提供商的设置,将编辑后的版本复制并粘贴到vim中。(仅供参考,在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地址,这有望减少传输守护程序的启动和停止时间。

  • route-noexec告诉OpenVPN客户端不要自动使用服务器提供的路由-这将拉动VPN上的所有网络流量。我们只想发送洪流流量,因此我们将需要使用不同的路由设置。

  • lport 1195 告诉OpenVPN客户端使用端口1195而不是1194-在我的情况下,我还想在同一设备上运行OpenVPN服务器,并且该服务器将需要使用端口1194。即使您没有运行OpenVPN服务器,它进行此更改不会有任何伤害。

  • 我将行更改dev tapdev tap1,由于运行单独的OpenVPN服务器,再次将虚拟设备强制为tap1而不是由OpenVPN分配。即使您没有运行VPN服务器,此更改也无关紧要。防火墙脚本已编写为使用tap1,因此,如果您想使用其他设备,请记住在适当的地方更改这些脚本。

  • lladdr 00:FF:11:AA:BB:CC 告诉OpenVPN为Tap接口分配此MAC地址,这对于iptables防火墙规则很有用。

  • route-updown根据需要运行脚本以启动和停止Transmission-daemon-这是必需的,因为它们与包含有关连接信息的环境变量一起运行,将变量正确地绑定到正确的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

您将看到警告,提示无法运行向上和向下的外部命令,但不必为此担心。如果可行,您将Initialization Sequence Completed在终端上看到。按Control+C结束连接。如果它不起作用,则必须调查原因,然后修复它,然后再继续。我发现有时需要花费一些时间才能开始工作。确保您的密码文件正确无误。Internet上有很多关于OpenVPN的重要资源,因此请四处看看。

在这一点上,最可能要继续进行传输的设置和运行。一旦确定VPN和传输都可以分别运行,就可以将它们组合在一起。

安装和配置变速箱

安装所需的软件包:

sudo apt-get install transmission-daemon

默认情况下,传输将在启动时自动运行。由于我们最终将使用OpenVPN来启动传输,因此我们想禁用它。为此,请编辑传输守护程序的配置文件

sudo vim /etc/default/transmission-daemon

并将以下行更改为:

ENABLE_DAEMON=0

现在传输将不会在启动时开始。

现在,我们为传输设置创建一个目录,并将其下载到其中。假设您已经设置了某种磁盘,并将其安装在/ media / arm-disk /下。为了安全起见,守护程序将由其自己的用户运行,而不是以root用户或“ ubuntu”身份运行。安装程序会为传输守护程序“ debian-transmission”创建一个新用户。该用户需要拥有我们创建的文件夹,并且具有对要下载的torrent的存储位置的读写权限。

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-transmission用户身份启动Transmission-daemon,告诉它使用/ 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.*",

保存并退出(转义,输入:wq并按Enter)

中间的两个编辑将启用“未完成”目录的使用,将已完成的洪流与未完成的洪流分开。这不是完全必要的,但我个人认为它非常有用。最后的编辑使该Web GUI可以被LAN上的任何计算机访问(假设您的LAN子网为192.168.1.0,如果不同,则进行修改)。

现在,最好再次运行Transmission,以查看它是否可以正常工作并可以下载torrent。我们将使用网络浏览器窗口来访问GUI并添加种子。首先,让我们允许从局域网通过防火墙访问Web GUI,然后再次运行传输守护程序。

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

在Firefox(或您喜欢的任何一种浏览器)中访问以下URL:http : //XXX.XXX.XXX.XXX : 9091,其中XXX被替换为局域网中服务器的地址(即192.168.1.10)。查找要下载的种子,例如1080p60hz中的Big Buck Bunny。这是一部免费的短片,合法可免费下载。在传输GUI中,单击“打开洪流”按钮,然后将此链接(或您喜欢的任何其他种子)粘贴到第一个框中。然后按“上传”。如果传输正常,种子文件将开始下载。如果没有,那么您需要先找出原因,然后再继续。Internet上有很多资源可以使用传输守护程序。也可能是您选择的torrent不起作用,请先尝试其他一些。

下载完成后,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监听“ transmission-vpn-up”信号。然后,“ transmission-up.conf”脚本设置所需的路由规则,以通过VPN接口从本地VPN地址发送流量,并设置防火墙以允许从VPN到侦听端口的流量进行传输。从普通LAN接口定向到传输侦听端口的流量被阻止。然后,“ transmission-daemon.conf”脚本使用所需的设置启动transmission-daemon,以将其绑定到VPN IP地址。请注意,此命令还将确保UPnP / NAT-PMP被禁用-请参阅我的顶部有关端口转发的注释。“ nice -15”将“传输”设置为较低的优先级,我发现在使用较低规格的BeagleBone时很有用-有时“传输”会占用资源,这会降低系统速度。至少在低优先级的情况下,更重要的系统任务仍然可以运行。当VPN停止时,“ transmission-down.conf”脚本将删除防火墙规则。使用了三种不同的脚本,以便可以以非特权用户身份运行传输守护程序,但可以以root用户身份运行防火墙规则。

现在,让我们回到OpenVPN设置,并编辑“ route-up”和“ down”脚本以触发启动和停止我们的传输脚本。

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连接设置。

OK,我们快完成了!让我们测试一下我们的设置是否可以正常运行:

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

再次连接到Transmission Web GUI,然后恢复现有的Torrent或添加一个新的Torrent。等待几分钟后,它应该可以下载了。我发现测试它是否有效的一种好方法是查看iftop。安装iftop,然后运行:

sudo apt-get install iftop
sudo iftop -i tap1

此屏幕将显示通过VPN运行的所有连接。如果您的洪流正在下载并且正确使用了VPN,则此处将有很多IP地址和主机名。还要查看iftop的LAN连接:

sudo iftop -i eth0

在这里,您应该看到到单个IP地址(即VPN服务器)的大量通信,然后到其他LAN设备的通信仅很少(假设您未在BeagleBone上运行其他服务)。

您可以按照以下说明确认VPN是否正常工作。
该站点使您可以下载种子文件,以查看其他对等方用来连接到您的IP地址-如果一切正常,它将是VPN IP地址,而不是您自己的WAN IP地址。

如果遇到问题,请执行以下操作以查看Upstart错误日志:

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

在单独的终端/ SSH窗口中,尝试按上述方式启动VPN连接时运行tail命令,并查找任何错误消息。希望您可以通过查看错误消息来解决问题(如果没有在Internet上闲逛的话)或发表评论。

全部配置为自动启动

如果您对手动发出命令以启动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进行交互,请像设置阶段一样使用Web GUI。通过设置端口转发,还可以通过Internet访问GUI。关于如何执行此操作的教程很多,因此在此不再赘述。

至于从BeagleBone获取完整的下载,我正在使用NFS。从BeagleBone通过LAN复制到台式计算机时,我可以获得大约8 MB / s的速度-对于这样低功耗的设备而言,这非常好。Ubuntu提供了一些方便的信息来进行设置。


哇!您花了多长时间寻找所有这些东西?
伊斯梅尔·米格尔

哈哈,好一阵子。我以前在DD-WRT路由器上做过一次,然后当我再次为BeagleBone做这件事时,我以为我会写下来,这样我就不会忘记如何做。:D
seanlano 2015年

1
您还应该阅读以下内容:unix.stackexchange.com/questions/88693/…(这是一个很好的答案。)我相信这会对您有所帮助。
Ismael Miguel

3
在将DNS服务器设置为使用OpenDNS并查看统计信息后,我刚刚意识到该配置会通过普通的WAN连接泄漏DNS。我将进一步调查,看看是否可以解决此问题。无论如何,我将继续运行,因为连接本身是通过VPN进行的,但这并不理想。
seanlano '16

1
@seanlano感谢您引起我们的注意。让我们知道是否/何时找到修复程序。
Winterflags 2016年

7

刚刚使用SystemD进行了此工作,所以我想分享一下。我已将所有脚本,配置和证书放置在同一目录中,我将其称为/etc/openvpn/myprovider

OpenVPN配置

这取决于您的特定VPN,但与@seanlano的配置不同的是我仅使用一个route-up脚本。因此,除了可以正常工作的config外,您还需要以下几行内容:

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),所以您可以用@seanlano的config中的ufw行替换这些行。

SystemD VPN服务

这是为我们自动启动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 transmission-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改为使用。

rpc-bind-address如果要限制更严格,可以为指定一个实际的ip地址(这是Web GUI监听地址,不应该是您的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处理器制造一个便宜的Torrent盒-但显然并非如此。
seanlano 2015年

查看rtorrent。它的表现非常出色
乔纳斯·卡尔德斯坦

谢谢我会的。其他事情在ARM机器上运行良好,因此rtorrent可以正常工作。
seanlano

3

我注意到您提到传输不通过UPnP / NAT-PMP的VPN。我也注意到了这一点,并为“传输”创建了一个补丁,因此它遵循UPnP的bind-address-ipv4设置。由于您需要确定默认网关,因此NAT-PMP实施起来会有些困难。但是,UPnP是最近使用的主要工具,因此它可能已经足够好了。我将此日志记录为trac.transmissionbt网站上的错误并提供了补丁。希望它将在将来的版本中合并。 https://trac.transmissionbt.com/ticket/5990

现在,如果您不想重新编译,则另一个选择是从miniupnpc软件包中手动运行upnpc。例如

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,就无法再获得相同的端口。

干杯


我花了很长时间试图找到这样的解决方案,但愿我能找到miniupnpc!希望补丁确实合并了,并且这个问题将永远得到解决。同时,我一定会尝试使用您的方便提示。
seanlano
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.