我有一个用例,要求一个 qBittorrent 实例通过 VPN 连接,另一个实例则不需要。我想在单个 Raspberry Pi 上运行这两个实例。我正在使用 PrivateInternetAccess VPN。
我尝试了第一个想到的解决方案,结果几乎有效。首先,我使用 WireGuard 协议连接到 VPN 并禁用 Kill Switch。我使用--profile
命令行选项启动具有不同配置文件的两个 qBittorrent 实例。在第一个实例中,我访问高级设置并指定为 VPN 创建的接口。(wgpia0
或类似的东西)。在第二个实例中,我访问相同的设置并指定eth0
。使用端口检查器,我可以看到 VPN 和公共连接都是实时的,并且可以从正确的 IP 地址访问。如果我使用 ipleak.net 的 Torrent 检测功能,我会在 VPN 上正确显示,但它永远不会在公共实例上找到我。如果我查看跟踪器,公共跟踪器会将其显示为“不工作”。如果我关闭 VPN,它会突然开始工作,我可以正常检测到。
我已经尽可能地搜索和调整了设置,但我不明白为什么除了跟踪器连接之外一切都能正常工作。我甚至可以通过 DHT 顺利下载种子。因此,我显然在该接口上建立了连接,但跟踪器却无法正常工作。我检查了执行日志,没有看到任何错误(尽管我可以提供一份删节版,如果这有帮助的话)。
这仍然是我首选的解决方案。我更愿意找出跟踪器连接出了什么问题并修复它,但我没有其他选择,所以我来到这里。有什么方法可以进一步调试此连接吗?
我怀疑我可以通过分别在不同的 docker 容器中运行两个实例来解决这个问题。如果我可以为每个容器指定它应该使用哪个接口,只要接口正常工作,来自容器的所有流量都应该通过它,这有望解决这个问题。如果可以避免,我真的不想要 docker 的管理开销,但如果它能起作用,我愿意接受它。我以前从未在 Pi 上接触过 docker,我可能不得不为 qBittorrent 制作自己的镜像。我的直觉正确吗?这能解决问题吗?如果成功的机会很低,我就不想踏上这段旅程。
我的最后一个想法是,我可以尝试使用如上所述的控制组这里。设置和维护起来看起来很复杂。我宁愿避免这种情况,只有在没有其他办法的情况下才会这样做。这是标准解决方案吗?这是“应该”采用的方法吗?如果是这样,我想我不应该浪费时间在其他方法上,而应该学习如何做到这一点。
还有其他我还没考虑到的解决方案吗?只要我能合理地理解和维护任何有效的东西,我就会对它感到高兴。
答案1
Docker 是最佳选择。它有容器来替代其他容器的网络堆栈。格鲁顿是一个流行的例子。您可以创建一个包含两个 qBittorrent 容器的 docker-compose 文件,并将其中一个容器连接到 Gluetun 网络。这在 Pi 上应该可以正常工作,Gluetun 支持它,许多流行的 qBittorrent 容器也支持它。
如果您打算使用这种方法,您还需要一种方法来使 qBittorrent 监听端口与从 VPN 转发的端口保持同步。我没有看到任何其他合理的解决方案,所以我自己做了一个:qbittorrent-gluetun-端口转发。此图像支持amd64
和arm64
,因此它应该可以在 Raspberry Pi 4 以及传统台式机和笔记本电脑上运行。
docker-compose.yml
实现这一点的(非常简短的)方法可能看起来像这样。
version: "3"
services:
gluetun:
image: qmcgaw/gluetun
ports:
- 13492:8000 # Gluetun Control server
- 13491:13491 # qBittorrent WebUI
environment:
- VPN_PORT_FORWARDING=on
restart: "unless-stopped"
qbittorrent-vpn:
image: lscr.io/linuxserver/qbittorrent:latest
network_mode: service:gluetun
environment:
- WEBUI_PORT=13491
restart: "unless-stopped"
qbittorrent-port-update:
image: technosam/qbittorrent-gluetun-port-update:1.1
network_mode: service:gluetun
environment:
- QBITTORRENT_WEBUI_PORT=13491
restart: "unless-stopped"
qbittorrent-public:
image: lscr.io/linuxserver/qbittorrent:latest
environment:
- WEBUI_PORT=27054
ports:
- 27054:27054 # WebUI
- 6881:6881 # Listen port
restart: "unless-stopped"