当前位置: 首页>>技术教程>>正文


networking – 通过 OpenVPN 传输守护进程

, , ,

问题描述

我最近购买了 BeagleBone Black,并在其上安装了 Ubuntu using this method 。到目前为止一切都有效。 \n我想使用我的 BeagleBone 作为 torrent 盒子,但我不想直接通过 Internet 连接进行操作(我认为我的 ISP 不会喜欢它) – 所以我从欧洲购买了 VPN 订阅服务器。我之前已经手动将笔记本电脑连接到此 VPN 并运行传输。我知道 VPN 连接在 Ubuntu 中工作,并且主机提供了 OpenVPN 的设置信息。令人烦恼的是,分配的 IP 地址的动态特性意味着它会频繁更改,因此当我将笔记本电脑与 VPN 一起使用时,我会手动将 Transmission 中的侦听地址设置为所需的值。

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

  • 传输仅通过 VPN 运行,禁止通过正常 WAN 连接运行种子

  • 只有定向到传输的流量才会通过 VPN 接受或发送,所有其他未经请求的流量都将被丢弃

  • 根据分配的 IP 地址,传输使用适当的端口进行侦听

  • OpenVPN 在启动时自动启动,然后启动 Transmission

  • Transmission 的 Web GUI 可以通过 LAN 访问,也可以通过我的 WAN 连接通过 Internet 访问(即不通过 VPN 返回)

最佳办法

更新:(2022-04-13)已经有一段时间了,我有了一种新的方法来做到这一点,使用 Linux 网络命名空间。步骤请参见 my new answer。我也绝对不会再使用那个旧的 Beaglebone 板了!这些步骤同样适用于任何 CPU 类型。


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


更新:我注意到,当我将 Transmission 设置为在 Beaglebone 上过夜下载时,CPU 使用率在一段时间后会达到 100%。在相同的时间后似乎不会发生这种情况,有时整个晚上都很好,有时 10 分钟后就很困难。它还可以通过暂停所有 torrent 并等待 CPU 负载恢复正常,然后重新启动来恢复。我还在调查。解决方法可能是定期暂停和恢复 torrent,但这不是一个很好的解决方法。\n请注意,此问题仅适用于 Beaglebone,可能还适用于其他 ARM 设备。我在 x86 CPU 上从未遇到过这个问题。


Introduction

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

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

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

我还注意到 Transmission 没有正确绑定到用于发送 UPnP/NAT-PMP 数据的 IP 地址 – 即 torrent 数据正确通过 VPN,但如果启用 UPnP 端口转发,Transmission 将请求从本地路由器转发端口,而不是从 VPN 服务器通过 VPN。因此,我让 Upstart 脚本禁用端口转发,因为它可能看起来好像已经工作了,但实际上却没有。应该可以使用 iptables 和 iproute 强制来自 debian-transmission 用户的所有流量通过 VPN,但我仍在研究这一点。如果将默认路由更改为通过 VPN 发送所有 Internet 数据,它也应该可以工作,但我不想这样做,因为我也使用此服务器执行其他操作,这也会导致所有系统更新都通过 VPN 进行VPN。这样做的效果是,传输下载种子的速度可能比端口转发工作时慢 – 但我发现大多数种子在没有端口转发的情况下也可以达到合理的速度。 This question has further information if you really want to get UPnP working over the VPN .\n更新:falk0069 has a fantastic tip below 帮助鼓励通过 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 )\n您应该能够从 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 提供商选择的密码强度高、随机且唯一。\n

  • auth-user-pass pass 告诉 OpenVPN 查找名为 pass 的文件以从中读取用户和密码。\n

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

  • 如果您的连接断开,persist-tun 将尝试与服务器保持相同的 IP 地址,这有望减少 Transmission-daemon 的启动和停止。\n

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

  • lport 1195 告诉 OpenVPN 客户端使用端口 1195 而不是 1194 – 就我而言,我还想在同一设备上运行 OpenVPN 服务器,并且该服务器需要使用端口 1194。即使您没有运行 OpenVPN 服务器,进行此更改不会有什么坏处。\n

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

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

  • route-updown 运行脚本来根据需要启动和停止 Transmission-daemon – 此处需要这些脚本,因为它们使用包含有关连接信息的环境变量运行,需要将传输正确绑定到正确的 IP 地址和端口。\n

就我而言,我有来自 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

您将看到无法运行向上和向下外部命令的警告,但不必担心。如果成功,您将在终端上看到 Initialization Sequence Completed。按 Control+C 结束连接。如果它不起作用,您将必须调查原因并修复它,然后再继续。我发现有时需要几次才能开始工作。确保您的密码文件正确。互联网上有很多有关 OpenVPN 的优质资源,因此请四处查看。

此时,最简单的方法可能是继续启动并运行 Transmission。一旦您确定 VPN 和传输都可以单独运行,就可以将它们组合起来。

安装和配置传输

安装所需的软件包:

sudo apt-get install transmission-daemon

默认情况下,Transmission 将在启动时自动运行。由于我们最终将使用 OpenVPN 来启动 Transmission,因此我们希望禁用它。为此,请编辑 Transmission-daemon 的配置文件

sudo vim /etc/default/transmission-daemon

并将以下行更改为:

ENABLE_DAEMON=0

现在传输不会在启动时启动。

现在让我们创建一个目录,用于存放传输设置以及下载的种子。这假设您已经设置了某种磁盘,并将其安装在 /media/arm-disk/处。出于安全目的,守护进程将由其自己的用户运行,而不是作为 root 或 “ubuntu” 运行。安装程序为 transmission-daemon、”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.*",

保存并退出(Escape,输入 :wq 并按 Enter)

中间的两个编辑将允许使用 “incomplete” 目录,将已完成的种子与未完成的种子分开。这并不是完全必要的,但我个人认为它非常有用。最后一次编辑使 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)。\n查找要下载的 torrent,例如 1080p60hz 的 Big Buck Bunny。这是一部免费短片,可合法免费下载。在 Transmission GUI 中,单击 “Open Torrent” 按钮,然后将 paste this link(或您喜欢的任何其他 torrent)放入第一个框中。然后按”Upload”。如果传输工作正常,将开始下载 torrent。如果没有,那么您需要在继续之前找出原因。 Internet 上有大量可用于使用 transmission-daemon 的资源。也可能是您选择的 tor 不起作用,请先尝试其他几个。

下载完成后,在终端窗口中按 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 到侦听端口的流量进行传输。从正常 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” 脚本以触发启动和停止传输脚本。

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

该脚本更加简单 – 它发出信号让 transmission-daemon 停止。

此时,确保整个 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 地址和主机名。另请查看 iftop 的 LAN 连接:

sudo iftop -i eth0

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

您可以通过 following these instructions 确认 VPN 正在运行。\n此站点允许您下载 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 将删除防火墙规则并关闭 transmission-daemon。简单的!重新启动后这也将继续工作,所以现在一切都准备好了。

要与 Transmission 交互,请使用 Web GUI,就像我们在设置阶段所做的那样。通过设置端口转发,还可以通过 Internet 访问 GUI。关于如何执行此操作的教程有很多,这里不再重复。

至于从 BeagleBone 获取完整的下载,我使用 NFS。我可以通过 LAN 从 BeagleBone 复制到我的台式计算机,速度约为 8 MB/s – 这对于这样的 low-powered 设备来说相当不错。 Ubuntu provides some handy information 用于设置。

次佳办法

刚刚使用 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 替换为 transmission-daemon 应侦听的任何端口。我使用 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 transmission-daemon.service

此脚本需要 vpn-service,因此如果 vpn 出现故障,transmission-daemon 也会出现故障。如果 VPN 重新启动,并且您获得新的 IP地址,这会很方便,因为传输需要重新启动,然后需要重新启动 re-bind,这应该会自动处理。请注意,我们使用了之前在 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

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

处理地址变更

随着时间的推移,我注意到的一件事是,如果 vpn-connection 由于某种原因获得了新的 ip-address,传输仍将绑定到旧地址并停止工作。仅仅执行 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

第三种办法

我注意到您提到传输不通过 UPnP/NAT-PMP 的 VPN。我也注意到了这一点,并为 Transmission 创建了一个补丁,以便它遵循 UPnP 的 bind-address-ipv4 设置。 NAT-PMP 实现起来有点困难,因为您需要确定默认网关。不过,UPnP 是目前使用的主要方式,因此它可能已经足够好了。我将此作为错误记录在 trac.transmissionbt 网站上并提供了补丁。希望它将被纳入未来的版本中。\n 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 时,我将无法再次获得相同的端口。

干杯

第四种办法

2022 年的新方法:网络命名空间

自从我第一次尝试这样做以来,已经有了一些进展,使得使用 “Network Namespace” 设置 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 has made a set of scripts 的乐于助人的人为各种网络命名空间配置创建了 systemd 服务。

下载存储库:

git clone https://github.com/Jamesits/systemd-named-netns.git

安装脚本:

cd systemd-named-netns/
sudo make install

3. 配置systemd-named-netns

您需要的具体配置取决于您的网络设置。我使用的是网桥,但也可以使用 NAT 选项。有关详细信息,请参阅 wiki page

本指南的其余部分假设您使用的是网桥。我使用名称 torrentvpn 作为命名空间,它会出现在几个地方。如果您决定使用其他名称,请确保它仅包含字母数字字符且长度不超过 12 个字符。

为要在网络命名空间内使用的 DNS 设置创建 resolv.conf 文件:

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 服务来处理网络命名空间内运行的任何内容,如果您愿意,请随意使用另一个服务 \u2013 NextDNS 是一个不错的选择。

现在让我们配置命名空间桥,将文件 /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

这会在 /etc/systemd/system/[email\xa0protected]/override.conf 处创建一个 “drop-in” 覆盖文件,它允许我们添加额外的设置,而无需从包维护者编辑配置。它还会在命名空间内禁用 IPv6,因为我的 VPN 提供商不支持它,而且我不想意外地最终使用我的非 VPN Internet 连接。

重新启动 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 的信息,您可能有不同的需求,因此请阅读 the documentation 。我将在这里快速展示主要步骤。

安装变速箱:

sudo apt install transmission-daemon

停止守护进程(systemd 似乎在安装后启动它)

sudo systemctl stop transmission-daemon.service

编辑位于 /var/lib/transmission-daemon/.config/transmission-daemon/settings.json 的配置文件。特别是,您可能希望将 download-dir 更改为具有足够存储空间的位置,并且还允许从 rpc-whitelist 中的 LAN 进行访问(对我来说,这意味着添加 192.168.64.* )。您还需要通过 rpc-password 设置密码才能登录 Web UI。

不要忘记为您的下载目录设置正确的权限:

sudo chown debian-transmission:debian-transmission /home/torrents/

6.设置传输使用VPN

与我们通过覆盖编辑 OpenVPN 的 systemd 配置的方式类似,我们将对 Transmission 执行相同的操作:

sudo systemctl edit transmission-daemon.service

添加以下行并保存:

[Unit]
[email protected] [email protected]
[email protected] [email protected] [email protected]
[email protected]
JoinsNam[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 。然后可以使用您在配置文件中设置的用户名和密码在 http://192.168.64.46:9091 访问 Transmission UI。

7. 测试一下

现在一切都应该启动并运行了。我发现确认 torrent 确实使用 VPN 下载的最佳方法是使用 handy checker that Torguard provide(感谢 @lemonek 向我介绍了这一点!)\u2013 它为您提供了一个特殊的 torrent 供下载,并显示了哪个 IP地址尝试共享它。将显示的 IP 与您的 Internet IP 进行比较,并确保它不同。您还可以通过运行以下命令来检查服务器看到的 IP 是否有任何使用 VPN 的内容:

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/14039.html,未经允许,请勿转载。