注意: (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 tap
为dev tap1
,由于运行单独的OpenVPN服务器,再次将虚拟设备强制为tap1而不是由OpenVPN分配。即使您没有运行VPN服务器,此更改也无关紧要。防火墙脚本已编写为使用tap1
,因此,如果您想使用其他设备,请记住在适当的地方更改这些脚本。
lladdr 00:FF:11:AA:BB:CC
告诉OpenVPN为Tap接口分配此MAC地址,这对于iptables防火墙规则很有用。
route-up
并down
根据需要运行脚本以启动和停止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提供了一些方便的信息来进行设置。