在网关上部署透明代理,并在局域网中运行 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以及其问题
使用方案 3,给群晖添加物理网卡(其实是在 pve 中添加了一块网卡),指定 qBittorent 使用该网卡,然后在 openclash 中配置针对该网卡的规则,使 qBittorent 走直连
通过 MAC 地址过滤
在插件设置-黑白名单中设置,只是我没有成功,从数据包中得到的 MAC 地址是旧的,但是 IP 是新的,可能是因为我是通过在 PVE 中添加网卡的形式给群晖添加网卡导致的?不太理解,触及到了我的知识盲区,如果有人知道原因,欢迎在评论中分享
通过 IPv6 后缀过滤
在插件设置-开发者选项中加入下面内容
|
|
在 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
通过 clash 直连的方法及其问题
通过 clash 规则(非通过防火墙设置)的直连方法的问题是 tracker 记录到 IP 会是网关的 IP,我们可以在 OpenWrt 是跑一个 socat 转发,将 tracker 记录到的地址的流量转发到真正的目的地
假设 qBittorent 的 端口是 6881,通过 socat 将网关的 6881 端口转发到群晖的 6881 端口,这样即使 tracker 得到的 IP 是网关的 IPv6 地址,也可以通过网关的 6881 端口访问到 qBittorent,注意要在防火墙中放行网关的 6881 端口
最完美的方法,macvlan
通过 macvlan 创建一块网卡,在通过 RA 配置设备 IPv6 的网络中,该网卡能自动接受处理 RA 消息并得到一个 IP 地址,且因为其是通过 macvlan 创建的,有独立的 MAC 地址,指定 qBittorent 使用该网卡,然后在 openclash 的不走代理的局域网设备 MAC 地址规则中添加该网卡的 MAC 地址,这样 qBittorent 就可以直连了(未测试,理论可行,我是用 docker 跑 qBittorent 的,docker 中的 macvlan 也是这个原理)
Docker 中的 macvlan
|
|
通过上面配置创建的容器其可以自动获得 IPv6 地址,针对这个 MAC 地址做设置即可,注意需要根据自己的网络环境修改配置,如 parent 网卡,subnet 等
以上