通过OpenVPN传输守护进程

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

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

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


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


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


介绍

我为Ubuntu 14.04开发并测试了这个解决方案,运行在BeagleBone Black上。 我正在使用的VPN提供商称为ibVPN 。 它应该适用于任何支持的硬件(即在“普通”x86计算机上),与任何OpenVPN兼容的VPN提供商 – 并且可能适用于14.10或更高版本。 在某些时候,我相信Ubuntu将使用SystemD进行启动,这意味着需要迁移此处使用的Upstart脚本。 更新: Jonas Kalderstam 在使用SystemD时有以下答案 。 我还假设ufw被用作防火墙,如果你使用不同的东西,那么这里的ufw命令将需要更改。

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

这是一个相当长的教程,请先阅读所有内容,确保您对自己将要做的事情感到满意。

我还注意到Transmission没有正确绑定到用于发送UPnP / NAT-PMP数据的IP地址 – 即torrent数据正确地通过VPN,但是如果启用了UPnP端口转发,则传输将从本地路由器请求端口转发,而不是通过VPN服务器的VPN。 因此,我已经使Upstart脚本禁用端口转发,因为它可能看起来好像已经工作,但它没有。 应该可以使用iptables和iproute强制来自debian-transmission用户的所有流量通过VPN,但我仍然在研究这个问题。 如果更改默认路由以通过VPN发送所有Internet数据,它也应该工作,但我不想这样做因为我也将此服务器用于其他事情,这也会导致所有系统更新都通过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 

使用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 ,以强制虚拟设备为tap1而不是由OpenVPN分配,再次因为运行单独的OpenVPN服务器。 即使您没有运行VPN服务器,此更改也无关紧要。 防火墙脚本已编写为使用tap1 ,因此如果您更愿意使用其他设备,请记住在适当的位置更改这些脚本。

  • lladdr 00:FF:11:AA:BB:CC告诉OpenVPN指定tap接口有这个MAC地址,这对iptables防火墙规则很有用。

  • route-updown运行脚本以根据需要启动和停止传输守护进程 – 这里需要这些脚本,因为它们运行的​​环境变量包含有关连接的信息,这是将传输正确绑定到正确的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结束连接。 如果它不起作用,您将不得不调查原因并在继续之前修复它。 我发现有时需要花一些时间才能开始工作。 确保您的密码文件正确无误。 有关OpenVPN的互联网上有很多很好的资源,所以请浏览一下。

在这一点上,最简单的方法是继续启动和运行传输。 一旦确定VPN和传输可以单独运行,就可以将它们组合在一起。

安装和配置传输

安装所需的包:

 sudo apt-get install transmission-daemon 

默认情况下,传输将在引导时自动运行。 由于我们最终将使用OpenVPN来启动传输,因此我们要禁用此function。 为此,请编辑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 

此命令启动transmission-daemon作为debian-transmission用户,告诉它使用/ 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键)

中间两个编辑将允许使用“不完整”目录,将已完成的种子与未完成的种子分开。 这不是完全必要的,但我个人觉得它非常有用。 最后一次编辑使网络GUI可以被LAN上的任何计算机访问(假设您的LAN子网是192.168.1.0,如果不同则修改它)。

现在再次运行传输是一个好主意,看看它是否有效并且可以实际下载一个torrent。 我们将使用Web浏览器窗口访问GUI并添加torrent。 首先,让我们允许从局域网通过防火墙访问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将替换为LAN上服务器的地址(即192.168.1.10)。 查找要下载的种子,例如1080p60hz的Big Buck Bunny。 这是一部免费的短片,可以免费下载。 在Transmission GUI中,单击“Open Torrent”按钮,然后将此链接 (或您喜欢的任何其他torrent) 粘贴到第一个框中。 然后按“上传”。 如果传输工作正常,则torrent将开始下载。 如果没有,那么你需要在继续之前弄清楚原因。 Internet上有许多资源可用于使用传输守护进程。 它也可能是你选择的洪流不起作用,先尝试其他几个。

下载完成后,在终端窗口中按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”设置Transmission具有较低的优先级,我发现使用较低规格的BeagleBone时有用 – 有时传输可能会占用资源,从而减慢系统速度。 至少具有低优先级,更重要的系统任务仍然可以运行。 “transfer-down.conf”脚本将在VPN停止时删除防火墙规则。 使用三个不同的脚本,以便传输守护程序可以作为非特权用户运行,但防火墙规则可以作为root运行。

现在让我们回到OpenVPN设置,编辑“路由”和“向下”脚本以触发启动和停止我们的传输脚本。

 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 Web GUI,并恢复现有的torrent或添加新的torrent。 它应该能够下载,也许是在等待几分钟之后。 我发现测试它是否正常工作的一种很好的方式是看看iftop。 安装iftop,然后运行:

 sudo apt-get install iftop sudo iftop -i tap1 

此屏幕将显示通过VPN运行的所有连接。 如果你的torrent正在下载并正确使用VPN,那么这里会有很多IP地址和主机名。 另请参阅LAN连接的iftop:

 sudo iftop -i eth0 

在这里,您应该看到单个IP地址的大量流量,即VPN服务器,然后只有最小流量到其他LAN设备 – 假设您没有在BeagleBone上运行其他服务。

您可以按照这些说明确认VPN正在运行。
此站点允许您下载torrent以查看其他对等方用于连接到您的IP地址 – 如果一切正常,这将是VPN IP地址而不是您自己的WAN IP地址。

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

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

在单独的终端/ SSH窗口中,尝试在启动VPN连接时运行tail命令,并查找任何错误消息。 希望您可以通过查看错误消息解决问题,如果没有在互联网上搜索,或发表评论。

将其全部配置为自动启动

如果您对手动发出启动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将删除防火墙规则并关闭传输守护程序。 简单! 这也将在重新启动后继续工作,所以现在你已经完成了设置。

要与传输进行交互,请像在设置阶段一样使用Web GUI。 通过设置端口转发,还可以通过Internet访问GUI。 有很多关于如何做到这一点的教程,所以我在此不再重复。

至于从BeagleBone获得完成的下载,我正在使用NFS。 从BeagleBone到我的台式电脑,我可以通过局域网复制大约8 MB / s的速度 – 这对于这种低功耗设备非常有用。 Ubuntu提供了一些方便的信息来设置它。

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

OpenVPN配置

这取决于您的特定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),所以你可以用@seanlano配置中的ufw行代替那些行。

SystemD VPN服务

这是为我们自动启动VPN的服务。 validation您的计算机上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-service,因此如果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 

当你重新启动时,它应该全部自动启动(按顺序!)。 请注意,在vpn服务中使用Type=simple会导致脚本排序的时间出现问题,因此我建议使用forking

如果您想要更具限制性(这是Web GUI侦听地址,不应该是您的VPN-ip),您可以为rpc-bind-address指定实际的ip地址。 如果你想用nice运行传输,只需更改ExecStart行并将/usr/bin/nice -n15到开头即可。

处理地址变更

我随着时间的推移注意到的一件事是,如果由于某种原因vpn连接获得一个新的IP地址,传输仍将绑定到旧地址并停止工作。 只需执行systemctl restart transmission-daemon.service就不会削减它。 它需要完全停止,然后重新开始。

不知道为什么,但由于这个原因,我已经sudo crontab -e添加到我的root crontab( sudo crontab -e ):

 # mh 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创建了一个补丁,因此它尊重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,我就无法再次获得相同的端口。

干杯