OpenVPN 传输守护进程

sea*_*ano 21 networking openvpn transmission beagleboard

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

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

  • 传输仅通过 VPN 运行,禁止通过正常的 WAN 连接运行种子
  • 只有定向到传输的流量将被接受或通过 VPN 发送,所有其他未经请求的流量将被丢弃
  • 传输根据分配的 IP 地址使用适当的端口进行侦听
  • OpenVPN 在启动时自动启动,然后启动传输
  • 可以通过 LAN 访问传输的 Web GUI,也可以从我的 WAN 连接通过 Internet 访问(即不通过 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。

安装和配置 OpenVPN

我建议您先尝试使用 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 tapdev 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
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在终端窗口按 停止传输守护程序。

配置绑定传输到VPN接口

现在让我们制作一个 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 提供了一些方便的信息来设置它。

  • 我刚刚意识到,在将我的 DNS 服务器设置为使用 OpenDNS 并查看统计信息后,**此配置通过正常的 WAN 连接泄漏了 DNS**。我会进一步调查,看看我是否可以解决这个问题。无论如何,我将继续运行,因为连接本身是通过 VPN 进行的——但这并不理想。 (3认同)

Jon*_*tam 7

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

OpenVPN 配置

这取决于您的特定 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 行。

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
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)

如果它已启动/正在运行,那就很好了。

SystemD传输-daemon.service

这个脚本需要 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)


sea*_*ano 0

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

\n

自从我第一次尝试这一点以来,已经有了一些进展,使得使用“网络命名空间”设置传输在 VPN 上运行更容易、更可靠 \xe2\x80\x93。这不仅适用于 Transmission,也适用于任何 systemd 服务。它不再依赖于应用程序正确绑定到适当的网络接口,而是 systemd 将强制所有网络流量使用配置的命名空间 \xe2\x80\x93,在我们的例子中这意味着通过 VPN 发送它。

\n
\n

1. 配置网络

\n

配置网络的方法有很多种,在我的例子中,我已经使用 Netplan 来创建网桥。如果您出于其他原因不使用它(而是使用 NAT 选项),则可能没有必要创建一个,但作为参考,这里是我在本示例中使用的 Netplan 配置。您需要进行适当的调整,或者使用您选择的其他工具配置网络接口。

\n

Netplan 配置示例

\n
network:\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

2.安装并配置systemd-named-netns脚本

\n

尽管 systemd 支持网络命名空间,但它并没有太多的配置方式。幸运的是,一位名叫 James Swineson 的乐于助人的人制作了一组脚本,可以为各种网络命名空间配置创建 systemd 服务。

\n

下载存储库:

\n
git clone https://github.com/Jamesits/systemd-named-netns.git\n
Run Code Online (Sandbox Code Playgroud)\n

安装脚本:

\n
cd systemd-named-netns/\nsudo make install\n
Run Code Online (Sandbox Code Playgroud)\n

3.配置systemd-named-netns

\n

您需要的具体配置取决于您的网络设置。我正在使用网桥,但也可以使用 NAT 选项。请参阅wiki 页面以获取更多信息。

\n

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

\n

创建一个resolv.conf用于 DNS 设置的文件以在网络命名空间内使用:

\n
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为:

\n
nameserver 8.8.8.8\n
Run Code Online (Sandbox Code Playgroud)\n

这将使用 Google 的 DNS 服务来处理网络命名空间内运行的任何内容,如果您愿意,请随意使用另一个 \xe2\x80\x93 NextDNS是一个不错的选择。

\n

现在让我们配置命名空间桥,将文件编辑/etc/default/netns-torrentvpn为:

\n
# 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

此时我们可以测试我们的网络命名空间设置,使用以下命令启动命名空间:

\n
sudo systemctl start netns-bridge@torrentvpn.service\nsudo systemctl enable netns-bridge@torrentvpn.service\n
Run Code Online (Sandbox Code Playgroud)\n

然后尝试从命名空间内部 ping 某些内容,并确保它有效:

\n
sudo chnetns torrentvpn ping google.com\n
Run Code Online (Sandbox Code Playgroud)\n

4. 设置 OpenVPN

\n

VPN 服务提供商数量惊人,因此步骤可能与您略有不同。理想情况下,您应该确认您可以使用提供商提供的配置文件设置 OpenVPN 隧道,如果更容易的话,可能首先使用图形界面。理论上它甚至不必是 OpenVPN,它可以是任何可以通过 systemd 运行的 VPN。

\n

我有一个 ProtonVPN 帐户,他们提供 OpenVPN 配置文件,其中内嵌了必要的证书和密钥。配置文件保存在/etc/openvpn/client/protonvpn.conf,我已将其修改为从文件中读取用户名和密码/etc/openvpn/client/protonvpn.pass(使用auth-user-pass配置选项)。您需要对此进行调整以适合您的提供商。

\n

OpenVPN 包提供了用于管理客户端连接的 systemd 脚本,尽管我们想要添加几行以便我们的连接使用网络命名空间。运行这个命令:

\n
sudo 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 连接。

\n

重新启动 systemctl 守护进程,然后尝试启动 VPN:

\n
sudo 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 端点:

\n
sudo chnetns torrentvpn ping google.com\n
Run Code Online (Sandbox Code Playgroud)\n

5. 设置传输守护进程

\n

有很多有关配置 Transmission 的信息,您可能有不同的需求,因此请阅读文档。我将在这里快速展示主要步骤。

\n

安装变速箱:

\n
sudo apt install transmission-daemon\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
sudo 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。

\n

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

\n
sudo chown debian-transmission:debian-transmission /home/torrents/\n
Run Code Online (Sandbox Code Playgroud)\n

6.设置传输使用VPN

\n

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

\n
sudo 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,然后启动服务:

\n
sudo 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 地址,请运行:

\n
sudo chnetns torrentvpn ip ad\n
Run Code Online (Sandbox Code Playgroud)\n

veth并找到设备 \xe2\x80\x93 对我来说是的地址192.168.64.46。然后可以使用您在配置文件中设置的用户名和密码通过http://192.168.64.46:9091访问 Transmission UI 。

\n

7. 测试一下

\n

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

\n
sudo 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 中的奇怪行为

\n

令人沮丧的是,我发现重新启动后,网络命名空间设置似乎在 Ubuntu 18.04 上略有发挥(但在 20.04 上则不然),使我无法使用该命令测试命名空间内的 shell 命令chnetns。奇怪的是,尽管命名空间对于 systemd 作业中的服务运行良好,但 Transmission 仍然运行得很好。

\n

我尝试了很多事情,但无法弄清楚,但我至少意识到,通过停止并重新启动一切,一切都可以正常工作:

\n
sudo systemctl stop netns@torrentvpn.service\nsudo systemctl start transmission-daemon.service\n
Run Code Online (Sandbox Code Playgroud)\n