或许可以为比特彗星增加NAT1用户专属的TCP-STUN打洞功能

我家的网络是NAT1,意味着:只要本地打通了本地到NAT设备的映射,任何外部设备都可以直接通过NAT的端口访问本地。

同时,我也靠 站内 和站外的几篇教程,利用 “Lucky”软件 成功地给自己电脑上的webdav服务器进行TCP打洞。我也试了一下,排除IPv6干扰项后,把端口给到比特彗星,结果比特彗星黄灯秒变绿灯。


但是,这也有两个弊端。

  • 一个是端口可能会变化,每次都需要到Lucky软件里获取最新的端口,并确保NAT后的外网端口、Lucky软件内置端口转发的目标端口、比特彗星的监听端口三者保持一致。

  • 另一个是所有的IPv4-TCP连接都变成了“127.0.0.1”,那么基于IP地址的反吸血保护就失效了,因为比特彗星和PeerBanHelper只能看到Lucky软件的IP。



可以看到,这几个IP均为本地的127.0.0.1,但是使用的客户端不一样。

所以,我的想法是:让比特彗星自己实现NAT1环境下的STUN-TCP打洞,打洞完成之后对Tracker服务器通报自己的NAT后的端口,实现“伪公网IPv4”

这和比特彗星已有的UDP打孔是不一样的,这种方法可以让有NAT1的用户接收远程传入的TCP请求,体验与公网别无二致。

理论上,工作流程是这样子的:

  • 检测端口是否开放。如果否,那么继续下一步。
  • 检测用户是否开启STUN打洞功能。如果是,那么继续下一步。
  • 检测NAT类型。如果是NAT1,那么继续下一步。如果不是NAT1(例如NAT3、NAT4、检测失败),那么再检测两次(总共检测3次),确认无误后放弃打洞。
  • 已确认网络为NAT1。比特彗星以原来的监听端口向外打洞。
  • 如果打洞成功,右下角显示:(绿灯)NAT1打洞:监听端口(外部端口)
  • 向Tracker服务器通报自己打洞后获得的外部端口,不再通报自己的监听端口。
  • 其他用户通过NAT端口连接到比特彗星,实现数据传输。由于NAT1打洞发生在比特彗星内部,所以比特彗星有能力得知对方的IP地址,而不是像借助Lucky软件一样只看得到“127.0.0.1”。
  • 循环检测打洞结果是否有效。如果失败,重新打洞。

如果这个功能被做进比特彗星里,那么拥有NAT1的比特彗星用户将获得与公网用户完全一致的体验,这无疑是巨大的飞跃。

@wxhere15

附:
Lucky软件作者维护的公共STUN服务器列表:always-online-stun/valid_hosts_tcp.txt at master · pradt2/always-online-stun · GitHub

2個讚

没必要那么麻烦,stun拿了tcp端口后(对比udp的不同点是,需要一直和stun服务器保持稳定的连接,一旦stun卡顿或者故障发生重连那么外部端口会发生变化)
和现有的utp打洞方式一样,pex dht汇报出去自己的远程端口就行了,这种方式可以标记为蓝灯,代表外部网络通信但是多了一层nat会有不稳定因素

1個讚

我这边实测,重启映射之后,外部端口没有变化。(当然,以每家情况为准)

  • 其实,也可以在变化之后,立即触发一次tracker通报,把最新的端口号告诉tracker。

这些问题都已经解决了 源ip可以保留并且自动更换监听端口

LUCKY STUN穿透在Windows上使用UPnP工具为BT客户端自动添加内外端口号不同的映射规则

「LUCKY STUN穿透」使用脚本自动修改比特彗星的监听端口

2個讚

好办法,感谢教程。

毕竟需要外部软件辅助,比较麻烦,如果能集成在比特彗星内部,效果会更好的吧

1個讚

其实早就提过 也许用用外置软件会更灵活

1個讚

灵活不假,不过集成在软件里更方便用吧

补充一点:

一定要在高级设置里打开允许同一ip地址的不同peer连入,否则使用外部内网穿透自带的端口转发时,在彗星的眼里都是同一个内网地址,就会导致一次只能连一个用户,从而造成下载速度变慢。

最好不要用这种方法 无论从性能上还是安全上考虑

性能上指的是CPU占用 lucky的内置转发效率一般 不适合bt下载这样大流量常场景
这个是lucky作者明确说过的

安全上指的的是反吸血 主要针对的是单IP上的多开吸血 也就是同时开多个客户端一起下载
不过由于使用lucky的内置转发 损失了原始IP和端口 导致IP过滤器在事实上是无法工作的
此外人工检测也不可用 因为列表上都是本地环回地址和本地端口 无法看出任何特征

最佳選擇仍然取得自己的公網IP, 內網貫通效率太差… :innocent:
而且好多用戶經已無NAT1,都是NAT2/3/4… 這些類型無法打通內網.

1個讚

列表上都是本地环回地址和本地端口 无法看出任何特征

所以才建议开发者内置这个功能啊,不认可。比特彗星的反吸血保护貌似还是正常工作的,我在屏蔽列表和连接列表里都看到了127.0.0.1 的地址。

安全上指的的是反吸血 主要针对的是单IP上的多开吸血 也就是同时开多个客户端一起下载
不过由于使用lucky的内置转发 损失了原始IP和端口 导致IP过滤器在事实上是无法工作的

不认可。比特彗星的反吸血保护貌似还是正常工作的,我在屏蔽列表和连接列表里都看到了127.0.0.1 的地址。

建议看一下封禁原因
若是对方已经下载完成了也会采用互相封禁的方法来断开连接
BC的反吸血依据的下载流量 也就是说在做种状态下是不起作用的


这就是我所说的人工检测也不可用原因
因为损失了源IP地址 看到都是本地环回地址和本地端口

对方用户的特征基本都被抹除了 让一切看起来都很正常
若对方是多开或多播刷流 则在列表中完全无法看出

此外 关闭允许同一ip地址的不同peer连入 是使用 PeerBanHelper的前置条件

1個讚