我最近买了一个 BeagleBone Black,并在上面安装了 Ubuntu使用这种方法到目前为止一切正常。我想将我的 BeagleBone 用作 torrent 盒,但我不想直接通过我的互联网连接来做这件事(我不认为我的 ISP 会喜欢它)——所以我从欧洲服务器购买了 VPN 订阅。我之前手动将我的笔记本电脑连接到此 VPN,然后运行 Transmission。我知道 VPN 连接在 Ubuntu 中有效,并且主机提供了 OpenVPN 的设置信息。令人讨厌的是,分配的 IP 地址的动态特性意味着它会经常更改,因此当我将笔记本电脑与 VPN 一起使用时,我会手动将 Transmission 中的监听地址设置为所需的值。
理想情况下,我希望进行以下设置:
- 传输仅通过 VPN 进行,禁止通过普通 WAN 连接运行种子
- 只有指向 Transmission 的流量才会被接受或通过 VPN 发送,所有其他未经请求的流量将被丢弃
- Transmission 根据分配的 IP 地址使用适当的端口进行监听
- OpenVPN 在启动时自动启动,然后启动 Transmission
- Transmission 的 Web GUI 可以通过 LAN 访问,也可以通过我的 WAN 连接通过 Internet 访问(即不通过 VPN)
答案1
更新: (2022-04-13) 好久不见了,我找到了一种新方法,使用 Linux 网络命名空间。请参阅我的新答案了解步骤。我肯定不会再使用那块旧的 Beaglebone 板了!这些步骤同样适用于任何 CPU 类型。
笔记: (2016-02-22) 我意识到此配置会通过普通 WAN 向 torrent 跟踪器泄露 DNS 查询,而不是通过 VPN 发送。我正在研究如何修复此问题。不过我将继续运行我的配置,因为连接本身确实正确使用了 VPN。
更新: 我注意到,当我在 Beaglebone 上将 Transmission 设置为整夜下载时,一段时间后 CPU 使用率会达到 100%。这种情况似乎不会在相同的时间后发生,有时整晚都很好,有时 10 分钟后就会出现问题。它也可以通过暂停所有种子并等待 CPU 负载恢复正常然后重新启动来恢复。我仍在调查。一种解决方法可能是定期暂停和恢复种子,尽管这不是一个很好的解决方法。 笔记此问题仅适用于 Beaglebone,也可能适用于其他 ARM 设备。我在 x86 CPU 上从未遇到过此问题。
介绍
我已经为 Ubuntu 14.04 开发并测试了此解决方案,在 BeagleBone Black 上运行。我使用的 VPN 提供商名为ibVPN。它应该适用于任何受支持的硬件(即在“普通” x86 计算机上),适用于任何兼容 OpenVPN 的 VPN 提供商 - 并且应该适用于 14.10 或更高版本。我相信 Ubuntu 在某些时候会使用 SystemD 进行启动,这意味着这里使用的 Upstart 脚本需要迁移。更新:乔纳斯·卡尔德斯坦下面有答案使用 SystemD。我还假设 ufw 被用作防火墙,如果您使用其他东西,那么这里的 ufw 命令将需要更改。
我假设所有工作都是通过 SSH 连接系统完成的,尽管如果输入到物理终端上,效果也一样好。
这是一个相当长的教程,请先阅读全部内容并确保您对将要做的事情感到满意。
我还注意到 Transmission 没有正确绑定到用于发送 UPnP/NAT-PMP 数据的 IP 地址 - 即 torrent 数据正确地通过 VPN,但如果启用了 UPnP 端口转发,Transmission 将从本地路由器请求端口转发,而不是通过 VPN 从 VPN 服务器请求。因此,我让 Upstart 脚本禁用端口转发,因为它可能看起来已经起作用了,但实际上并没有。应该可以使用 iptables 和 iproute 强制所有来自 debian-transmission 用户的流量通过 VPN,但我仍在研究这一点。如果将默认路由更改为通过 VPN 发送所有 Internet 数据,它也应该可以工作,但我不想这样做,因为我也将此服务器用于其他用途,这也会导致所有系统更新都通过 VPN。这样做的结果是 Transmission 下载 torrent 的速度可能比端口转发起作用时慢 - 但我发现大多数 torrent 在没有端口转发的情况下也可以达到合理的速度。如果你真的想让 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 地址,这有望减少 Transmission-daemon 的启动和停止次数。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
根据需要运行脚本来启动和停止 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
第一行必须是完整的用户名,第二行必须是密码。这必须是此文件的唯一内容。
[email protected]
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 都可以单独运行,就可以将它们组合起来。
安装和配置 Transmission
安装所需的软件包:
sudo apt-get install transmission-daemon
默认情况下,Transmission 会在启动时自动运行。由于我们最终将使用 OpenVPN 来启动 Transmission,因此我们希望禁用此功能。为此,请编辑 Transmission-daemon 的配置文件
sudo vim /etc/default/transmission-daemon
并将以下行更改为:
ENABLE_DAEMON=0
现在 Transmission 不会在启动时启动。
现在让我们创建一个目录,用于存放 Transmission 设置,以及下载的种子文件。假设您已经设置了某种磁盘,并且它安装在 /media/arm-disk/ 上。出于安全考虑,守护进程将由其自己的用户运行,而不是以 root 或“ubuntu”的身份运行。安装程序会为 transmission-daemon 创建一个新的用户“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-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.*",
保存并退出(Escape,输入:wq 并按 Enter)
中间两个编辑将启用“未完成”目录,将完成的种子与未完成的种子分开。这不是完全必要的,但我个人认为它非常有用。最后一个编辑使 LAN 上的任何计算机都可以访问 Web GUI(假设您的 LAN 子网是 192.168.1.0,如果不同,请修改它)。
现在最好再次运行 Transmission,看看它是否能正常工作并能真正下载 torrent。我们将使用 Web 浏览器窗口访问 GUI 并添加 torrent。首先,让我们允许从 LAN 通过防火墙访问 Web GUI,然后再次运行 transmission-daemon。
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 中,单击“打开种子”按钮,然后粘贴此链接(或您喜欢的任何其他种子)放入第一个框中。然后按“上传”。如果 Transmission 正常工作,种子将开始下载。如果没有,那么您需要找出原因才能继续。互联网上有很多关于使用 transmission-daemon 的资源。也可能是您选择的种子不起作用,请先尝试其他一些。
下载完成后,按下Control+C
终端窗口中的 来停止 transmission-daemon。
配置绑定传输到VPN接口
现在让我们制作一个 Upstart 脚本,它将用于在 VPN 准备就绪时启动 Transmission。
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 到 Transmission 的监听端口的流量。从正常 LAN 接口定向到 Transmission 监听端口的流量将被阻止。然后,“transmission-daemon.conf”脚本启动 transmission-daemon,并使用所需的设置将其绑定到 VPN IP 地址。请注意,此命令还将确保 UPnP/NAT-PMP 被禁用 - 请参阅我在顶部关于端口转发的注释。“nice -15”将 Transmission 设置为具有较低的优先级,我发现在使用较低规格的 BeagleBone 时这很有用 - 有时 Transmission 会占用资源,从而降低系统速度。至少在优先级较低的情况下,更重要的系统任务仍可运行。当 VPN 停止时,“transmission-down.conf”脚本将删除防火墙规则。使用了三个不同的脚本,以便 transmission-daemon 可以作为非特权用户运行,但防火墙规则可以作为 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 应该启动 transmission-daemon,并向其提供连接到 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,恢复现有种子或添加新种子。它应该能够下载,可能要等待几分钟才能下载到。我发现测试它是否正常工作的一个好方法是查看 iftop。安装 iftop,然后运行:
sudo apt-get install iftop
sudo iftop -i tap1
此屏幕将显示通过 VPN 运行的所有连接。如果您的 torrent 正在下载并且正确使用 VPN,则此处将有大量 IP 地址和主机名。还请查看 iftop 以了解 LAN 连接:
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 隧道 - 进而启动 Transmission。当系统关闭时,或者由于某种原因网络关闭时,Upstart 将删除防火墙规则并关闭 transmission-daemon。很简单!这在重启后也会继续工作,所以现在您已经一切就绪。
要与 Transmission 交互,请使用 Web GUI,就像我们在设置阶段所做的那样。还可以通过设置端口转发使 GUI 可通过 Internet 访问。有很多关于如何执行此操作的教程,因此我在此不再赘述。
至于从 BeagleBone 上获取已完成的下载,我使用的是 NFS。通过 LAN 从 BeagleBone 复制到我的台式计算机的速度约为 8 MB/s - 对于这种低功耗设备来说,这已经相当不错了。Ubuntu 提供了一些有用的信息用于设置此项。
答案2
刚刚使用系统D所以我想分享一下。我把所有的脚本、配置和证书都放在同一个目录中,我将称之为/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/传输路由.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 的服务。验证您的计算机上 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 传输守护进程.服务
此脚本需要 vpn-service,因此如果 vpn 发生故障,transmission-daemon 也会发生故障。如果重新启动 vpn 并获得新的 IP 地址,这将非常方便,因为 transmission 需要重新启动并重新绑定,这应该会自动处理。请注意,我们使用了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
(这是 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
答案3
我注意到您提到 Transmission 不会通过 UPnP/NAT-PMP 的 VPN。我也注意到了这一点,并为 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 时,我将无法再次获得相同的端口。
干杯
答案4
2022 年的新方法:网络命名空间
自从我第一次尝试以来,已经有一些进展,使设置 Transmission 以通过 VPN 运行变得更加容易和可靠——使用“网络命名空间”。这不仅适用于 Transmission,也可以适用于任何 systemd 服务。它不再依赖于应用程序正确绑定到适当的网络接口,而是 systemd 将强制所有网络流量使用配置的命名空间——在我们的例子中,这意味着通过 VPN 发送它。
1.配置网络
网络配置方式有很多种,就我而言,我已经使用 Netplan 创建了网桥。如果您没有出于其他原因使用它(而是使用 NAT 选项),则可能不需要创建网桥,但作为参考,这里是我在此示例中使用的 Netplan 配置。您需要根据需要进行调整,或使用您选择的其他工具配置网络接口。
Netplan 配置示例:
network:
version: 2
renderer: networkd
ethernets:
enp1s0:
dhcp4: no
dhcp6: no
bridges:
br0:
interfaces: [enp1s0]
dhcp4: no
dhcp6: yes
dhcp6-overrides:
use-dns: yes
use-ntp: yes
send-hostname: yes
use-hostname: no
addresses:
- 192.168.64.200/24
- "aaaa:bbbb:cccc::200:1/64"
ipv6-privacy: yes
gateway4: 192.168.64.1
2. 安装并配置 systemd-named-netns 脚本
尽管 systemd 支持网络命名空间,但它并没有太多的配置方式。幸运的是,一个叫 James Swineson 的乐于助人的人制作了一套脚本为各种网络命名空间配置创建 systemd 服务。
下载存储库:
git clone https://github.com/Jamesits/systemd-named-netns.git
安装脚本:
cd systemd-named-netns/
sudo make install
3. 配置 systemd-named-netns
您需要的确切配置取决于您的网络设置。我使用的是桥接,但也可以采用 NAT 选项。请参阅维基页面了解更多信息。
本指南的其余部分假设您正在使用网桥。我使用名称torrentvpn
作为命名空间,它将出现在几个地方。如果您决定使用其他名称,请确保它仅包含字母数字字符且长度不超过 12 个字符。
resolv.conf
为网络命名空间内使用的 DNS 设置创建一个文件:
sudo mkdir -p /etc/netns/torrentvpn/
sudo touch /etc/netns/torrentvpn/resolv.conf
然后将文件编辑/etc/netns/torrentvpn/resolv.conf
如下:
nameserver 8.8.8.8
这将使用 Google 的 DNS 服务来运行网络命名空间内的所有内容,如果您愿意,可以随意使用其他服务 -下一个DNS是一个很好的选择。
现在让我们配置命名空间桥,将文件编辑/etc/default/netns-torrentvpn
如下:
# Bridge name
BRIDGE=br0
# If you need DHCP
DHCPV4=1
# Set a static MAC, helpful with DHCP
MACADDR=02:00:00:aa:bb:01
# Device name outside netns
DEVNAME_OUTSIDE=veth0
# Device name inside netns
DEVNAME_INSIDE=veth1
此时我们可以测试我们的网络命名空间设置,使用以下命令启动命名空间:
sudo systemctl start [email protected]
sudo systemctl enable [email protected]
然后尝试从命名空间内部 ping 某些东西,并确保它能正常工作:
sudo chnetns torrentvpn ping google.com
4. 设置 OpenVPN
市面上有数量惊人的 VPN 服务提供商,因此步骤可能略有不同。理想情况下,您应该确认可以使用提供商提供的配置文件设置 OpenVPN 隧道,如果更方便的话,可以先使用图形界面。理论上,它甚至不必是 OpenVPN,它可以是任何可以通过 systemd 运行的 VPN。
我有一个 ProtonVPN 帐户,他们提供 OpenVPN 配置文件,其中包含必要的证书和密钥。配置文件保存在/etc/openvpn/client/protonvpn.conf
,我已对其进行修改,以便从文件中读取用户名和密码/etc/openvpn/client/protonvpn.pass
(使用auth-user-pass
配置选项)。您需要对其进行调整以适合您的提供商。
OpenVPN 软件包提供了用于管理客户端连接的 systemd 脚本,但我们想添加几行代码,以便我们的连接使用网络命名空间。运行以下命令:
sudo systemctl edit [email protected]
并添加以下几行:
[Unit]
[email protected] [email protected]
[email protected] [email protected]
[email protected]
[Service]
PrivateNetwork=yes
ExecStartPre=/sbin/sysctl net.ipv6.conf.all.disable_ipv6=1
这会在 处创建一个“插入式”覆盖文件,这样我们就无需编辑软件包维护者的配置即可添加额外设置。它还会在命名空间内禁用 IPv6,因为我的 VPN 提供商不支持它,而且我不想意外地使用非 VPN 互联网连接。/etc/systemd/system/[email protected]/override.conf
重新启动 systemctl 守护程序,然后尝试启动 VPN:
sudo systemctl daemon-reload
sudo systemctl start [email protected]
sudo systemctl enable [email protected]
通过命名空间再次进行 ping 测试,这一次响应时间应该比以前慢,因为数据包现在必须经过额外的距离才能到达 VPN 端点:
sudo chnetns torrentvpn ping google.com
5. 设置 Transmission Daemon
关于配置 Transmission 有很多信息,你可能有不同的需求,因此请阅读文档。我将在这里快速展示主要步骤。
安装传动装置:
sudo apt install transmission-daemon
停止守护进程(systemd 似乎在安装后启动它)
sudo systemctl stop transmission-daemon.service
编辑配置文件/var/lib/transmission-daemon/.config/transmission-daemon/settings.json
。具体来说,您可能希望更改download-dir
为具有足够存储空间的地方,并允许从 LAN 进行访问rpc-whitelist
(对我来说,这意味着添加192.168.64.*
)。您还需要设置密码才能rpc-password
登录 Web UI。
不要忘记为您的下载目录设置正确的权限:
sudo chown debian-transmission:debian-transmission /home/torrents/
6. 设置 Transmission 使用 VPN
与我们使用覆盖编辑 OpenVPN 的 systemd 配置的方式类似,我们将对 Transmission 执行相同的操作:
sudo systemctl edit transmission-daemon.service
添加以下行,然后保存:
[Unit]
[email protected] [email protected]
[email protected] [email protected] [email protected]
[email protected]
[email protected]
[Service]
PrivateNetwork=yes
重新加载 systemd,然后启动服务:
sudo systemctl daemon-reload
sudo systemctl start transmission-daemon.service
sudo systemctl reenable transmission-daemon.service
由于命名空间的原因,Transmission 的 Web UI 无法从主机的 IP 访问,而是从连接到我们设置的网桥的命名空间内的虚拟设备的 IP 访问。要查找该 IP 地址,请运行:
sudo chnetns torrentvpn ip ad
并找到设备的地址veth
——对我来说是192.168.64.46
。然后可以通过以下方式访问 Transmission UI:http://192.168.64.46:9091,使用您在配置文件中设置的用户名和密码。
7. 测试
现在一切都应该正常运行了。我发现确认种子确实使用 VPN 下载的最佳方法是使用Torguard 提供的便捷检查器(谢谢@lemonek感谢您向我介绍这个!)——它会为您提供一个特殊的种子供您下载,并显示哪些 IP 地址试图共享它。将显示的 IP 与您的 Internet IP 进行比较,并确保它们不同。您还可以通过运行以下命令检查使用 VPN 的服务器看到的 IP:
sudo chnetns torrentvpn curl http://ip.42.pl/raw
这将显示服务器在 ip.42.pl 看到的 IP 地址,该地址应该与 Torguard 工具显示的 IP 相同。
Ubuntu 18.04 中的奇怪行为
令人沮丧的是,我发现在重启时,网络命名空间设置在 Ubuntu 18.04 上似乎出现了轻微问题(但在 20.04 上没有),导致我无法使用该chnetns
命令在命名空间内测试 shell 命令。奇怪的是,尽管命名空间对于 systemd 作业内的服务运行良好,但 Transmission 仍然运行良好。
我尝试了很多方法但都没能解决,但我至少意识到通过停止并重新启动一切可以使一切正常工作:
sudo systemctl stop [email protected]
sudo systemctl start transmission-daemon.service