在网关上部署透明代理,并在局域网中运行 qBittorent 时,需要处理一下使 qBittorent 直连,一是如果 qBittorent 如果通过代理下载,会消耗代理的流量,二是如果 tracker 被代理,会导致上报的 IP 是代理的 IP,这样会导致 tracker 得到的 IP 是代理的 IP,而不是下载客户端的 IP,其他节点就无法正确找到我们
我目前的网络环境是,OpenWrt 作为网关,并在其上运行 OpenClash, qBittorent 运行在局域网中的一台群晖 NAS 上,群晖 NAS 通过 OpenWrt 的 DHCP 服务获得 IP
基于当前网络环境,目前想到使 qBittorent 直连的方法有
- 在 clash 中添加 SRC-IP-CIDR 规则,使 qBittorent 的 IP 走直连
- 在 openclash 中配置只代理常用端口,使 qBittorent 下载时走直连,但是 tracker 很多是 443 端口,仍然有可能走代理,需要在 clash 中添加域名规则,收集 tracker 的域名,配置为直连
- 给群晖添加物理网上,指定 qBittorent 使用某网卡,在 openclash 中配置针对 MAC 地址的规则,使 qBittorent 走直连
- 使用 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 | ✅ | ✅ | ✅ |
解决方案
- 使用方案 3,给群晖添加物理网卡(其实是在 pve 中添加了一块网卡),指定 qBittorent 使用该网卡,然后在 openclash 中配置针对该网卡的规则,使 qBittorent 走直连
具体是在插件设置-开发者选项中加入下面内容
|
|
在 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 是新的,不太理解,触及到了我的知识盲区,如果有人知道原因,欢迎在评论中分享
-
还可以在 OpenWrt 是跑一个 socat 转发,假设 qBittorent 的 端口是 6881,通过 socat 将网关的 6881 端口转发到群晖的 6881 端口,这样即使 tracker 得到的 IP 是网关的 IPv6 地址,也可以通过网关的 6881 端口访问到 qBittorent,注意要在防火墙中放行网关的 6881 端口
-
另外应该可以通过 macvlan 方案实现,OpenClash 相关的配置类似解决方案1,但是我没有尝试过,如果有人尝试过,欢迎在评论中分享
没有尝试 macvlan 的原因是,似乎 macvlan 不能从 dhcp 服务中获得 IP,需要手动指定 IP,而 IPv6 的地址是不固定的,所以不太适合使用 macvlan
以上