sea*_*ano 21 networking openvpn transmission beagleboard
我最近购买了一个 BeagleBone Black,我使用这种方法在上面安装了 Ubuntu 。到目前为止,一切都奏效了。我想将我的 BeagleBone 用作 torrent 盒,但我不想直接通过我的 Internet 连接执行此操作(我认为我的 ISP 不会喜欢它)-因此我从欧洲服务器购买了 VPN 订阅. 我之前手动将我的笔记本电脑连接到这个 VPN 并运行传输。我知道 VPN 连接在 Ubuntu 中有效,并且主机提供 OpenVPN 的设置信息。令人讨厌的是,分配的 IP 地址的动态特性意味着它会经常更改,因此当我将笔记本电脑与 VPN 一起使用时,我会手动将传输中的侦听地址设置为所需的值。
理想情况下,我想要以下设置:
sea*_*ano 24
注意: (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 连接完成的,尽管如果在物理终端中输入它也能正常工作。
这是一个很长的教程,请先阅读所有内容,并确保您对自己将要做的事情感到满意。
我还注意到传输没有正确绑定到用于发送 UPnP/NAT-PMP 数据的 IP 地址 - 即 torrent 数据正确通过 VPN,但如果启用了 UPnP 端口转发,传输将从本地路由器请求端口转发,而不是从 VPN 服务器通过 VPN。因此,我让 Upstart 脚本禁用了端口转发,因为它看起来好像有效,但实际上并没有。应该可以使用 iptables 和 iproute 来强制所有来自 debian-transmission 用户的流量通过 VPN,但我仍在研究这个。如果更改默认路由以通过 VPN 发送所有 Internet 数据,它也应该有效,但我不想这样做,因为我也将此服务器用于其他用途,这也会导致所有系统更新通过虚拟专用网。如果您真的想让 UPnP 通过 VPN 工作,这个问题有更多信息。 更新: falk0069 在下面有一个很棒的提示,可以帮助鼓励通过 VPN 使用 UPnP。
我建议您先尝试使用 Ubuntu 使您的 VPN 连接工作,然后再尝试让它在此处工作 - 即从桌面。这将确认您有正确的配置并减少调试时间。
首先,安装所需的包
sudo apt-get install openvpn
Run Code Online (Sandbox Code Playgroud)
接下来,创建一个目录来存储配置文件。我正在使用 /opt/ibVPN,因为这是我正在使用的提供程序。将其更改为您喜欢的任何内容。
sudo mkdir /opt/ibVPN
Run Code Online (Sandbox Code Playgroud)
在这个新目录中要做的第一件事是创建用于运行 VPN 客户端的配置文件。ibVPN 为 Linux 用户提供了一个基本的配置文件,我大多只是复制和粘贴了它。
cd /opt/ibVPN
sudo vim config.ovpn
Run Code Online (Sandbox Code Playgroud)
使用 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"
Run Code Online (Sandbox Code Playgroud)
对于那些不熟悉 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 拉取所有网络流量。我们只想发送 torrent 流量,因此我们需要使用不同的路由设置。
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-up
并down
根据需要运行脚本以启动和停止传输守护程序 - 此处需要这些脚本,因为它们与包含有关连接的信息的环境变量一起运行,这是将传输正确绑定到正确的 IP 地址和端口所必需的。
就我而言,我有一个来自 VPN 提供商的服务器证书——它也必须与配置文件位于同一目录中。
sudo vim /opt/ibVPN/ibvpn.com.crt
Run Code Online (Sandbox Code Playgroud)
复制并粘贴它,或通过 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-----
Run Code Online (Sandbox Code Playgroud)
显然,如果您没有使用 ibVPN 帐户,您的证书将会有所不同。
现在让我们制作密码文件:
sudo vim /opt/ibVPN/pass
Run Code Online (Sandbox Code Playgroud)
第一行必须是完整的用户名,然后第二行必须是密码。这必须是该文件的唯一内容。
you@address.com
myBIGstrongpassword1234567890
Run Code Online (Sandbox Code Playgroud)
我们还必须保护此文件的权限,否则 OpenVPN 将无法启动。
sudo chmod 400 pass
Run Code Online (Sandbox Code Playgroud)
这将使文件只读,并且仅供所有者使用(即根本没有其他用户可以读取它)
这些命令将创建在启动时运行的文件,并将它们设置为只能由 root 执行。
sudo touch route-up.sh
sudo touch down.sh
sudo chmod 700 route-up.sh
sudo chmod 700 down.sh
Run Code Online (Sandbox Code Playgroud)
此时,最好测试一下 VPN 连接是否真的有效。开始连接:
sudo openvpn --cd /opt/ibVPN --config config.ovpn
Run Code Online (Sandbox Code Playgroud)
您将看到无法运行 up 和 down 外部命令的警告,但不要担心。如果有效,您将Initialization Sequence Completed
在终端上看到。按Control+C
结束连接。如果它不起作用,您将不得不调查原因并在继续之前修复它。我发现有时需要几次才能开始工作。确保您的密码文件正确。互联网上有很多关于 OpenVPN 的优秀资源,所以请四处看看。
在这一点上,继续启动并运行传输可能是最容易的。一旦您确定 VPN 和传输都可以单独运行,就可以将它们组合起来。
安装所需的软件包:
sudo apt-get install transmission-daemon
Run Code Online (Sandbox Code Playgroud)
默认情况下,传输将在启动时自动运行。由于我们最终将使用 OpenVPN 来启动传输,因此我们希望禁用它。为此,请编辑传输守护程序的配置文件
sudo vim /etc/default/transmission-daemon
Run Code Online (Sandbox Code Playgroud)
并将以下行更改为:
ENABLE_DAEMON=0
Run Code Online (Sandbox Code Playgroud)
现在传输不会在启动时启动。
现在让我们创建一个目录,让传输设置驻留在其中,并为下载的种子文件进入。这假设您已经设置了某种磁盘,并且它安装在 /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
Run Code Online (Sandbox Code Playgroud)
现在我们需要简单地开始传输,以便它创建我们需要的设置文件:
sudo -u debian-transmission -g debian-transmission /usr/bin/transmission-daemon --config-dir /opt/transmission --foreground
Run Code Online (Sandbox Code Playgroud)
此命令以 debian-transmission 用户身份启动传输守护进程,告诉它使用 /opt/transmission 目录来保存设置文件,并告诉它继续在前台运行。运行几秒钟后,按Control+C
结束它。我们现在可以编辑设置文件。
sudo -u debian-transmission vim /opt/transmission/settings.json
Run Code Online (Sandbox Code Playgroud)
我们现在需要将其默认值更改为以下行以读取:
"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.*",
Run Code Online (Sandbox Code Playgroud)
保存并退出(转义,输入 :wq 并按 Enter)
中间的两个编辑将启用“不完整”目录的使用,将完成的种子与未完成的种子分开。这不是完全必要的,但我个人认为它非常有用。最后一次编辑使 LAN 上的任何计算机都可以访问 Web GUI(假设您的 LAN 子网是 192.168.1.0,如果它不同,请修改它)。
现在再次运行传输是个好主意,看看它是否有效并且是否可以实际下载种子。我们将使用 Web 浏览器窗口访问 GUI 并添加 torrent。首先,让我们允许从 LAN 通过防火墙访问 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
Run Code Online (Sandbox Code Playgroud)
在 Firefox(或您喜欢的任何浏览器)中访问此 URL:http://XXX.XXX.XXX.XXX:9091,其中 XXX 替换为您在 LAN 上的服务器地址(即 192.168.1.10)。找一个 torrent 下载,例如 1080p60hz 的 Big Buck Bunny。这是一部免费的短片,合法可免费下载。在传输 GUI 中,单击“打开 Torrent”按钮,然后将此链接(或您喜欢的任何其他种子)粘贴到第一个框中。然后按“上传”。如果传输工作正常,torrent 将开始下载。如果没有,那么您需要在继续之前找出原因。Internet 上有很多资源可用于使用传输守护程序。也可能是您选择的 torrent 不起作用,请先尝试其他一些。
下载完成后,Control+C
在终端窗口按 停止传输守护程序。
现在让我们制作一个 Upstart 脚本,当 VPN 准备好时,它将用于启动传输。
sudo mv /etc/init/transmission-daemon.conf /etc/init/transmission-daemon.conf.bak
Run Code Online (Sandbox Code Playgroud)
如果出现这种情况,请不要担心,这只是备份 Upstart 文件(如果存在的话)——它可能没有。让我们打开 vim 来编辑新的:
sudo vim /etc/init/transmission-daemon.conf
Run Code Online (Sandbox Code Playgroud)
将其粘贴到编辑器中:
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
Run Code Online (Sandbox Code Playgroud)
保存并关闭 vim。( Escape
,然后键入:wq
)。再次打开vim:
sudo vim /etc/init/transmission-up.conf
Run Code Online (Sandbox Code Playgroud)
并粘贴这个:
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
Run Code Online (Sandbox Code Playgroud)
再次,保存并关闭 vim。( Escape
,然后键入:wq
)。最后:
sudo vim /etc/init/transmission-down.conf
Run Code Online (Sandbox Code Playgroud)
粘贴这个:
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
Run Code Online (Sandbox Code Playgroud)
这些脚本告诉 Upstart 监听“transmission-vpn-up”信号。然后,“transmission-up.conf”脚本设置所需的路由规则以通过 VPN 接口从本地 VPN 地址发送流量,并设置防火墙以允许从 VPN 到侦听端口的流量进行传输。从普通 LAN 接口定向到传输侦听端口的流量被阻止。“transmission-daemon.conf”脚本然后使用所需的设置启动传输守护程序以将其绑定到 VPN IP 地址。请注意,此命令还将确保禁用 UPnP/NAT-PMP - 请参阅顶部关于端口转发的注释。“nice -15”将传输设置为具有较低的优先级,我发现这在使用较低规格的 BeagleBone 时很有用 - 有时传输会占用资源,这会减慢系统速度。至少在低优先级的情况下,更重要的系统任务仍然可以运行。当 VPN 停止时,“transmission-down.conf”脚本将删除防火墙规则。使用了三个不同的脚本,以便传输守护程序可以以非特权用户身份运行,但防火墙规则可以以 root 身份运行。
现在让我们回到 OpenVPN 设置,并编辑“route-up”和“down”脚本以触发启动和停止我们的传输脚本。
sudo vim /opt/ibVPN/route-up.sh
Run Code Online (Sandbox Code Playgroud)
将其粘贴到 vim 中:
#! /bin/bash
/sbin/initctl emit transmission-vpn-up VPN_GATEWAY=$route_vpn_gateway LOCAL_IP=$ifconfig_local
Run Code Online (Sandbox Code Playgroud)
这个脚本所做的就是告诉 Upstart 传输守护程序应该启动,并为其提供附加到 VPN 连接所需的信息。
sudo vim /opt/ibVPN/down.sh
Run Code Online (Sandbox Code Playgroud)
再次,更多粘贴:
#! /bin/bash
/sbin/initctl emit transmission-vpn-down
Run Code Online (Sandbox Code Playgroud)
这个脚本更简单——它发出信号让传输守护进程停止。
在这一点上,确保整个 VPN 配置文件夹的所有者是 root 用户可能是一个好主意 - 因为这些脚本以 root 身份运行,任何可以更改它们的人都可以以 root 用户身份运行他们想要的任何内容。
sudo chown root:root -R /opt/ibVPN
sudo chmod 700 -R /opt/ibVPN
sudo chmod 400 /opt/ibVPN/pass
Run Code Online (Sandbox Code Playgroud)
这意味着现在只有 root 用户可以修改或查看 VPN 连接设置。
好的,我们快完成了!让我们测试一下我们的设置到目前为止是否有效:
sudo openvpn --cd /opt/ibVPN --config config.ovpn
Run Code Online (Sandbox Code Playgroud)
再次连接到传输 Web GUI,并恢复现有的 Torrent 或添加一个新的 Torrent。它应该可以下载,也许在等待同行几分钟后。我发现一种测试它是否工作的好方法是查看 iftop。安装 iftop,然后运行:
sudo apt-get install iftop
sudo iftop -i tap1
Run Code Online (Sandbox Code Playgroud)
此屏幕将显示通过 VPN 运行的所有连接。如果您的 torrent 正在下载并且正确使用了 VPN,那么这里会有很多 IP 地址和主机名。还要查看 LAN 连接的 iftop:
sudo iftop -i eth0
Run Code Online (Sandbox Code Playgroud)
在这里,您应该看到大量流量到单个 IP 地址,即 VPN 服务器,然后只有少量流量到其他 LAN 设备 - 假设您没有在 BeagleBone 上运行其他服务。
您可以按照这些说明确认 VPN 是否正常工作。
该站点允许您下载 torrent 以查看其他对等方用来连接到您的 IP 地址 - 如果一切正常,这将是 VPN IP 地址,而不是您自己的 WAN IP 地址。
如果您遇到问题,您可以通过执行以下操作来查看 Upstart 错误日志:
sudo tail -f /var/log/upstart/transmission-daemon.log
Run Code Online (Sandbox Code Playgroud)
在单独的终端/SSH 窗口中,尝试在启动 VPN 连接时运行 tail 命令,并查找任何错误消息。希望您可以通过查看错误消息来解决问题,如果没有在 Internet 上进行挖掘或发表评论。
如果您对手动发出启动 OpenVPN 隧道的命令感到满意,或者您想使用自己的脚本来完成,那么您就完成了。但我希望它在启动时启动,所以我制作了另一个 Upstart 脚本来启动 OpenVPN。
sudo vim /etc/init/openvpn-transmission.conf
Run Code Online (Sandbox Code Playgroud)
这是我们必须粘贴的最后一件事!
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
Run Code Online (Sandbox Code Playgroud)
所有这一切都是等待系统发出网络准备就绪的信号,然后它将启动 OpenVPN 隧道 - 这将依次启动传输。当系统关闭,或者由于某种原因网络关闭时,Upstart 将删除防火墙规则并关闭传输守护程序。简单的!这也将在重新启动后继续工作,所以现在你已经准备好了。
要与传输交互,请像我们在设置阶段所做的那样使用 Web GUI。通过设置端口转发,还可以通过 Internet 访问 GUI。关于如何做到这一点有很多教程,所以我不会在这里重复。
至于从 BeagleBone 获取完整的下载,我使用的是 NFS。我可以通过 LAN 从 BeagleBone 复制到我的台式计算机的速度大约为 8 MB/s - 这对于这样一个低功耗设备来说已经相当不错了。Ubuntu 提供了一些方便的信息来设置它。
刚刚使用SystemD 完成了这项工作,所以我想我会分享。我已将所有脚本、配置和证书放在同一目录中,我将其称为/etc/openvpn/myprovider
这取决于您的特定 VPN,但与 @seanlano 的配置的一个不同之处在于我只使用route-up
脚本。因此,除了工作提供的 config之外,您还需要以下几行:
route-noexec
route-up "/etc/openvpn/myprovider/transmission-route-up.sh"
Run Code Online (Sandbox Code Playgroud)
您可以将transmission-route-up.sh
脚本放置在您喜欢的任何位置。注意没有down
脚本。(我的 VPN 已经在使用自定义向下脚本,因此无论如何它都会发生冲突)。
/etc/openvpn/myprovider/transmission-route-up.sh:
route-noexec
route-up "/etc/openvpn/myprovider/transmission-route-up.sh"
Run Code Online (Sandbox Code Playgroud)
第一行printenv
, 很重要。随便放哪里,后面会用到SystemD服务中。我将它放在与我的 vpn 配置相同的目录中。
将 24328 替换为您的传输守护程序应侦听的任何端口。我使用 iptables(使用 Debian),因此您可以将这些行替换为 @seanlano 配置中的 ufw 行。
这是为我们自动启动 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
Run Code Online (Sandbox Code Playgroud)
启用 VPN 服务:
systemctl enable my-vpn.service
Run Code Online (Sandbox Code Playgroud)
并测试它:
systemctl start my-vpn.service
systemctl status my-vpn.service
Run Code Online (Sandbox Code Playgroud)
如果它已启动/正在运行,那就很好了。
这个脚本需要 vpn-service,所以如果 vpn 宕机,transmission-daemon 也会宕机。如果重新启动 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
Run Code Online (Sandbox Code Playgroud)
启用它
systemctl enable transmission-daemon.service
Run Code Online (Sandbox Code Playgroud)
并启动它
systemctl start transmission-daemon.service
Run Code Online (Sandbox Code Playgroud)
当您重新启动时,它应该都会自动启动(按顺序!)。请注意,Type=simple
在 vpn 服务中使用会导致脚本排序时间出现一些问题,因此我建议forking
改用。
rpc-bind-address
如果您想要更严格的限制,您可以指定一个实际的 ip 地址(这是 Web GUI 侦听地址,不应是您的 VPN-ip)。如果您想以 nice 运行传输,只需更改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
Run Code Online (Sandbox Code Playgroud)
自从我第一次尝试这一点以来,已经有了一些进展,使得使用“网络命名空间”设置传输在 VPN 上运行更容易、更可靠 \xe2\x80\x93。这不仅适用于 Transmission,也适用于任何 systemd 服务。它不再依赖于应用程序正确绑定到适当的网络接口,而是 systemd 将强制所有网络流量使用配置的命名空间 \xe2\x80\x93,在我们的例子中这意味着通过 VPN 发送它。
\n配置网络的方法有很多种,在我的例子中,我已经使用 Netplan 来创建网桥。如果您出于其他原因不使用它(而是使用 NAT 选项),则可能没有必要创建一个,但作为参考,这里是我在本示例中使用的 Netplan 配置。您需要进行适当的调整,或者使用您选择的其他工具配置网络接口。
\nNetplan 配置示例:
\nnetwork:\n version: 2\n renderer: networkd\n ethernets:\n enp1s0:\n dhcp4: no\n dhcp6: no\n bridges:\n br0:\n interfaces: [enp1s0]\n dhcp4: no\n dhcp6: yes\n dhcp6-overrides:\n use-dns: yes\n use-ntp: yes\n send-hostname: yes\n use-hostname: no\n addresses:\n - 192.168.64.200/24\n - "aaaa:bbbb:cccc::200:1/64"\n ipv6-privacy: yes\n gateway4: 192.168.64.1\n\n
Run Code Online (Sandbox Code Playgroud)\n尽管 systemd 支持网络命名空间,但它并没有太多的配置方式。幸运的是,一位名叫 James Swineson 的乐于助人的人制作了一组脚本,可以为各种网络命名空间配置创建 systemd 服务。
\n下载存储库:
\ngit clone https://github.com/Jamesits/systemd-named-netns.git\n
Run Code Online (Sandbox Code Playgroud)\n安装脚本:
\ncd systemd-named-netns/\nsudo make install\n
Run Code Online (Sandbox Code Playgroud)\n您需要的具体配置取决于您的网络设置。我正在使用网桥,但也可以使用 NAT 选项。请参阅wiki 页面以获取更多信息。
\n本指南的其余部分假设您正在使用网桥。我正在使用torrentvpn
命名空间的名称,它会出现在几个地方。如果您决定使用其他名称,请确保它仅包含字母数字字符且长度不超过 12 个字符。
创建一个resolv.conf
用于 DNS 设置的文件以在网络命名空间内使用:
sudo mkdir -p /etc/netns/torrentvpn/\nsudo touch /etc/netns/torrentvpn/resolv.conf\n
Run Code Online (Sandbox Code Playgroud)\n然后将文件编辑/etc/netns/torrentvpn/resolv.conf
为:
nameserver 8.8.8.8\n
Run Code Online (Sandbox Code Playgroud)\n这将使用 Google 的 DNS 服务来处理网络命名空间内运行的任何内容,如果您愿意,请随意使用另一个 \xe2\x80\x93 NextDNS是一个不错的选择。
\n现在让我们配置命名空间桥,将文件编辑/etc/default/netns-torrentvpn
为:
# Bridge name\nBRIDGE=br0\n\n# If you need DHCP\nDHCPV4=1\n\n# Set a static MAC, helpful with DHCP\nMACADDR=02:00:00:aa:bb:01\n\n# Device name outside netns\nDEVNAME_OUTSIDE=veth0\n# Device name inside netns\nDEVNAME_INSIDE=veth1\n\n
Run Code Online (Sandbox Code Playgroud)\n此时我们可以测试我们的网络命名空间设置,使用以下命令启动命名空间:
\nsudo systemctl start netns-bridge@torrentvpn.service\nsudo systemctl enable netns-bridge@torrentvpn.service\n
Run Code Online (Sandbox Code Playgroud)\n然后尝试从命名空间内部 ping 某些内容,并确保它有效:
\nsudo chnetns torrentvpn ping google.com\n
Run Code Online (Sandbox Code Playgroud)\nVPN 服务提供商数量惊人,因此步骤可能与您略有不同。理想情况下,您应该确认您可以使用提供商提供的配置文件设置 OpenVPN 隧道,如果更容易的话,可能首先使用图形界面。理论上它甚至不必是 OpenVPN,它可以是任何可以通过 systemd 运行的 VPN。
\n我有一个 ProtonVPN 帐户,他们提供 OpenVPN 配置文件,其中内嵌了必要的证书和密钥。配置文件保存在/etc/openvpn/client/protonvpn.conf
,我已将其修改为从文件中读取用户名和密码/etc/openvpn/client/protonvpn.pass
(使用auth-user-pass
配置选项)。您需要对此进行调整以适合您的提供商。
OpenVPN 包提供了用于管理客户端连接的 systemd 脚本,尽管我们想要添加几行以便我们的连接使用网络命名空间。运行这个命令:
\nsudo systemctl edit openvpn-client@protonvpn.service\n
Run Code Online (Sandbox Code Playgroud)\n并添加以下行:
\n[Unit]\nBindsTo=netns@torrentvpn.service netns-bridge@torrentvpn.service\nAfter=netns@torrentvpn.service netns-bridge@torrentvpn.service\nJoinsNamespaceOf=netns@torrentvpn.service\n\n[Service]\nPrivateNetwork=yes\nExecStartPre=/sbin/sysctl net.ipv6.conf.all.disable_ipv6=1\n\n
Run Code Online (Sandbox Code Playgroud)\n这会在 处创建一个“直接”覆盖文件/etc/systemd/system/openvpn-client@protonvpn.service.d/override.conf
,它允许我们添加额外的设置,而无需从包维护者编辑配置。它还会在命名空间内禁用 IPv6,因为我的 VPN 提供商不支持它,而且我不想意外地最终使用我的非 VPN Internet 连接。
重新启动 systemctl 守护进程,然后尝试启动 VPN:
\nsudo systemctl daemon-reload\nsudo systemctl start openvpn-client@protonvpn.service\nsudo systemctl enable openvpn-client@protonvpn.service\n
Run Code Online (Sandbox Code Playgroud)\n通过命名空间再次进行 ping 测试,这次响应时间应该比以前慢,因为数据包现在必须经过额外的距离才能到达 VPN 端点:
\nsudo chnetns torrentvpn ping google.com\n
Run Code Online (Sandbox Code Playgroud)\n有很多有关配置 Transmission 的信息,您可能有不同的需求,因此请阅读文档。我将在这里快速展示主要步骤。
\n安装变速箱:
\nsudo apt install transmission-daemon\n
Run Code Online (Sandbox Code Playgroud)\n停止守护进程(systemd 似乎在安装后启动它)
\nsudo systemctl stop transmission-daemon.service\n
Run Code Online (Sandbox Code Playgroud)\n编辑位于 的配置文件/var/lib/transmission-daemon/.config/transmission-daemon/settings.json
。特别是,您可能想要更改download-dir
为具有足够存储空间的位置,并且还允许从 LAN 进行访问rpc-whitelist
(对我来说这意味着添加192.168.64.*
)。您还需要设置密码rpc-password
才能登录 Web UI。
不要忘记为您的下载目录设置正确的权限:
\nsudo chown debian-transmission:debian-transmission /home/torrents/\n
Run Code Online (Sandbox Code Playgroud)\n与我们通过覆盖编辑 OpenVPN 的 systemd 配置的方式类似,我们将对 Transmission 执行相同的操作:
\nsudo systemctl edit transmission-daemon.service\n
Run Code Online (Sandbox Code Playgroud)\n添加以下行并保存:
\n[Unit]\nBindsTo=netns@torrentvpn.service netns-bridge@torrentvpn.service\nAfter=netns@torrentvpn.service netns-bridge@torrentvpn.service openvpn-client@protonvpn.service\nRequires=openvpn-client@protonvpn.service\nJoinsNamespaceOf=netns@torrentvpn.service\n\n[Service]\nPrivateNetwork=yes\n
Run Code Online (Sandbox Code Playgroud)\n重新加载systemd,然后启动服务:
\nsudo systemctl daemon-reload\nsudo systemctl start transmission-daemon.service\nsudo systemctl reenable transmission-daemon.service\n
Run Code Online (Sandbox Code Playgroud)\n由于命名空间的原因,Transmission 的 Web UI 无法从主机的 IP 访问,而是可以从连接到我们设置的网桥的命名空间内的虚拟设备的 IP 访问。要查找该 IP 地址,请运行:
\nsudo chnetns torrentvpn ip ad\n
Run Code Online (Sandbox Code Playgroud)\nveth
并找到设备 \xe2\x80\x93 对我来说是的地址192.168.64.46
。然后可以使用您在配置文件中设置的用户名和密码通过http://192.168.64.46:9091访问 Transmission UI 。
现在一切都应该启动并运行了。我发现确认 torrent 确实使用 VPN 下载的最佳方法是使用Torguard 提供的便捷检查器(感谢@lemonek向我介绍了这一点!)\xe2\x80\x93 它为你提供了一个可供下载的特殊 torrent,并显示哪些 IP 地址尝试共享它。将显示的 IP 与您的 Internet IP 进行比较,并确保它不同。您还可以通过运行以下命令来检查服务器看到的 IP 是否有任何使用 VPN 的内容:
\nsudo chnetns torrentvpn curl http://ip.42.pl/raw\n
Run Code Online (Sandbox Code Playgroud)\n这将显示服务器在 ip.42.pl 处看到的 IP 地址,该地址应该与 Torguard 工具显示的 IP 地址相同。
\n令人沮丧的是,我发现重新启动后,网络命名空间设置似乎在 Ubuntu 18.04 上略有发挥(但在 20.04 上则不然),使我无法使用该命令测试命名空间内的 shell 命令chnetns
。奇怪的是,尽管命名空间对于 systemd 作业中的服务运行良好,但 Transmission 仍然运行得很好。
我尝试了很多事情,但无法弄清楚,但我至少意识到,通过停止并重新启动一切,一切都可以正常工作:
\nsudo systemctl stop netns@torrentvpn.service\nsudo systemctl start transmission-daemon.service\n
Run Code Online (Sandbox Code Playgroud)\n