介绍

介绍

我最近买了一个 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 passOpenVPN 寻找一个名为的文件pass来读取用户和密码。

  • auth-nocache从内存中删除密码,如果您担心密码,这可能会稍微提高安全性。

  • persist-tun如果您的连接断开,将会尝试保留来自服务器的相同 IP 地址,这有望减少 Transmission-daemon 的启动和停止次数。

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

  • lport 1195告诉 OpenVPN 客户端使用端口 1195 而不是 1194 - 就我而言,我也想在同一设备上运行 OpenVPN 服务器,并且服务器将需要使用端口 1194。即使您没有运行 OpenVPN 服务器,进行此更改也不会有害。

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

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

  • route-updown根据需要运行脚本来启动和停止 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

相关内容