Featured image of post qBittorent 直连配置方法

qBittorent 直连配置方法

在网关上部署透明代理,并在局域网中运行 qBittorent 时,需要处理一下使 qBittorent 直连,一是如果 qBittorent 如果通过代理下载,会消耗代理的流量,二是如果 tracker 被代理,会导致上报的 IP 是代理的 IP,这样会导致 tracker 得到的 IP 是代理的 IP,而不是下载客户端的 IP,其他节点就无法正确找到我们

我目前的网络环境是,OpenWrt 作为网关,并在其上运行 OpenClash, qBittorent 运行在局域网中的一台群晖 NAS 上,群晖 NAS 通过 OpenWrt 的 DHCP 服务获得 IP

基于当前网络环境,目前想到使 qBittorent 直连的方法有

  1. 在 clash 中添加 SRC-IP-CIDR 规则,使 qBittorent 的 IP 走直连
  2. 在 openclash 中配置只代理常用端口,使 qBittorent 下载时走直连,但是 tracker 很多是 443 端口,仍然有可能走代理,需要在 clash 中添加域名规则,收集 tracker 的域名,配置为直连
  3. 给群晖添加物理网上,指定 qBittorent 使用某网卡,在 openclash 中配置针对 MAC 地址的规则,使 qBittorent 走直连
  4. 使用 macvlan,针对 macvlan 的网卡配置 openclash 规则,使 qBittorent 走直连

之前一直在用的是方案 2,直到发现在 PT 网站后台查看到当前的 IP 是网关的 IPv6,而不是访问 PT 网站的 IP,而该网站在 clash 规则中是直连的

经过求证,在代理软件中直连时,clash 是重新建立一个连接和服务器通信,所以其客户端 IP 就是 clash 所在环境的 IP,而不是源连接的 IP https://github.com/MetaCubeX/Clash.Meta/issues/430

这在 IPv4 网络中没有问题,因为局域网中的设备的出口 IP 是唯一的,但是在 IPv6 网络中,出口 IP 是不唯一的,所以会导致上报的 IP 是网关的 IPv6 地址,而不是访问 tracker 的客户端所在设备的 IP

按正常配置直连的三个要求,下载流量直连,IPv4 tracker 上报正常,IPv6 tracker 上报正常,可以得到以下表格

下载流量直连 IPv4 tracker 上报正常 IPv6 tracker 上报正常
方案1
方案2
方案3
方案4

解决方案

  1. 使用方案 3,给群晖添加物理网卡(其实是在 pve 中添加了一块网卡),指定 qBittorent 使用该网卡,然后在 openclash 中配置针对该网卡的规则,使 qBittorent 走直连

具体是在插件设置-开发者选项中加入下面内容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/sh
. /usr/share/openclash/log.sh
. /lib/functions.sh

# This script is called by /etc/init.d/openclash
# Add your custom firewall rules here, they will be added after the end of the OpenClash iptables rules

LOG_OUT "Tip: Start Add Custom Firewall Rules..."

nft 'insert rule inet fw4 openclash_mangle_v6 position 0 ip6 saddr & ::ffff:ffff:ffff:ffff == ::20e1:fbff:fe6d:5fba counter return'
nft 'insert rule inet fw4 openclash_mangle_v6 position 0 ip6 saddr & ::ffff:ffff:ffff:ffff == ::c2b counter return'
exit 0

在 OpenClash 设置好防火墙后,在 openclash_mangle_v6 链中过滤掉两个 IPv6 后缀

简单的办法是在插件设置-黑白名单中添加 IP 后缀就可以了,但是 nft 的 IP set 不支持 IPv6 后缀,所以只能通过脚本的方式添加。

这 OpenWrt 论坛中发了贴子,没有人回复,如果有人知道怎么在 OpenWrt 中添加 IPv6 后缀的 IP set,欢迎在评论中分享

贴子地址 https://forum.openwrt.org/t/how-to-add-a-ipv6-suffix-mask-to-a-nftables-set/153796

另外如果添加网卡的话应该可以通过 MAC 地址过滤流量,这个也是在黑白名单中设置的,只是我没有成功,从数据包中得到的 MAC 地址是旧的,但是 IP 是新的,不太理解,触及到了我的知识盲区,如果有人知道原因,欢迎在评论中分享

  1. 还可以在 OpenWrt 是跑一个 socat 转发,假设 qBittorent 的 端口是 6881,通过 socat 将网关的 6881 端口转发到群晖的 6881 端口,这样即使 tracker 得到的 IP 是网关的 IPv6 地址,也可以通过网关的 6881 端口访问到 qBittorent,注意要在防火墙中放行网关的 6881 端口

  2. 另外应该可以通过 macvlan 方案实现,OpenClash 相关的配置类似解决方案1,但是我没有尝试过,如果有人尝试过,欢迎在评论中分享

没有尝试 macvlan 的原因是,似乎 macvlan 不能从 dhcp 服务中获得 IP,需要手动指定 IP,而 IPv6 的地址是不固定的,所以不太适合使用 macvlan

以上

Built with Hugo
主题 StackJimmy 设计