V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mmr
V2EX  ›  宽带症候群

PT、BT 下载如何利用 P2P 打洞获得上传速度。

  •  
  •   mmr · 2022-12-13 08:40:59 +08:00 · 8392 次点击
    这是一个创建于 713 天前的主题,其中的信息可能已经有所发展或是发生改变。
    已经实现的:
    1. 宽带改桥接。
    2. 拨号路由器 DMZ 主机设为下载服务器。
    现阶段情况:
    1. 大部分时间没有上传。
    2. 对一部分国内 ip 有上传(可能是对面把我的端口蒙对了,或者 NAT 出去的就是原端口)。
    想实现的:
    1. 希望实现用一个公网服务器自动的进行 P2P 打洞。
    2. 可不可以提供一些清晰的关于 NAT 和 P2P 打洞的资料。
    39 条回复    2023-08-29 21:19:07 +08:00
    villivateur
        1
    villivateur  
       2022-12-13 08:46:56 +08:00
    DMZ 没必要,把 BT 通讯端口转发开放一下就行。
    没有上传可能是因为你的网络环境不行,没有 IPv6 的话,上传会少非常多。
    别折腾 NAT 打洞了,IPv6 更重要。
    mmr
        2
    mmr  
    OP
       2022-12-13 08:49:37 +08:00
    我现在测试阶段,后期为了内网安全肯定会上防火墙的。
    我有 IPV6 ,测试已过。

    @villivateur
    redbeanzzZ
        3
    redbeanzzZ  
       2022-12-13 09:21:12 +08:00
    我以前用移动网,该有速度的还是有速度。
    现在用的联通,有公网 IP ,该没速度的还是没速度。
    现在已经佛系挂机了。
    挑热门大包做种吧,有时候感觉是真抢不过别人,据说用 qbitorrent 抢上传会好点
    mmr
        4
    mmr  
    OP
       2022-12-13 09:28:26 +08:00
    我用的 Transmission
    @redbeanzzZ
    ScepterZ
        5
    ScepterZ  
       2022-12-13 09:39:25 +08:00
    我没有进行任何操作,该上传的时候自然就上传了,大部分时候没上传就是真的没人下载,到 pt 网站看看有没有人下载就知道了
    RheatiN
        6
    RheatiN  
       2022-12-13 10:10:06 +08:00
    别人都是盒子刷流,怎么可能抢得过他们- -
    @redbeanzzZ
    hahasong
        7
    hahasong  
       2022-12-13 10:18:04 +08:00
    开 UPNP 就行了,桥不桥接区别不大
    leaves615
        8
    leaves615  
       2022-12-13 10:30:25 +08:00
    想刷上传,关注哪些热门的种子,多下几个。总有一个会上传, 玩 PT ,24 小时在线的设备要好一些。
    ysc3839
        9
    ysc3839  
       2022-12-13 10:48:03 +08:00
    BT 在 fullcone NAT 下本来就有打洞的效果,客户端会定时向别的 Peer 发送数据,就能刷新 NAT 回收端口的超时。印象中客户端也会获取公网 IP 和端口再上报给 Tracker 。
    理论上 BT 在两端都是 port-restricted cone NAT 的情况下也能工作,但需要两端都定期向所有 Peer 发包,这样的话双方就会打通。
    neptuno
        10
    neptuno  
       2022-12-13 11:28:50 +08:00
    刷成人包、抢热点种子
    cwbsw
        11
    cwbsw  
       2022-12-13 11:48:28 +08:00
    @ysc3839
    没用的。你只能向 tracker 报告你内网端口,和 CGNAT 后的公网端口必然不一样。
    要打洞,需要至少一方是 FullCone ,还需要有专用的服务器协助,现在的 BT 协议并不支持。
    cwbsw
        12
    cwbsw  
       2022-12-13 11:50:31 +08:00
    说下我的方案。

    通过一台双栈服务器用 socat 把 v4 端口转发到本地 BT 客户端的 v6 端口,本地 BT 客户端走代理与 tracker 通信。
    ysc3839
        13
    ysc3839  
       2022-12-13 11:56:50 +08:00
    @cwbsw 报告内网还是公网是看客户端实现的,个人印象中 qBittorrent 是可以报告公网的。客户端能获取公网 IP ,获取 IP 的这个服务器就是“专用的服务器协助”了。只有 port-restricted cone NAT 的情况下,理论上两端都向对方发包,那就能互相打开 NAT 映射,就能互相通信了。不过大多数 BT 客户端在连不上某个 Peer 后就不会再尝试连接,所以实际还是 fullcone NAT 才可用。
    mikewang
        14
    mikewang  
       2022-12-13 12:26:07 +08:00 via iPhone   ❤️ 1
    @heiher
    在此艾特 natmap 小伙伴,我觉得你应该明白我想说的。

    Natter 也研究过将 NAT1 中的 DHT TCP 端口开放至公网的方案。
    从本机到公网的端口映射,有一种流程是:
    本机:A —> 路由器:B —> 公网:C

    其中 A, B 端口号是可控的,C 端口号不可控。
    然而,虽然端口映射到了公网,BT 软件一般对外报告 A 端口号,而非 C ,导致外部主机连不上。

    现在有一种思路,就是先建立〔路由器:B —> 公网:C 〕的映射,得到端口 C 后,反过来去通知 BT 软件去监听 C 端口,映射关系变为:
    本机:C —> 路由器:B —> 公网:C

    这样内外端口即保持一致。我做过实验,这样可以获得非常可观的上传。

    这个缺陷在于,BT 软件需要提供 API 去改变实时监听端口(已知 transmission 是可以的)不过现在工作太忙了,不太有时间更新 Natter 。heiher 兄有没有什么想法?
    cwbsw
        15
    cwbsw  
       2022-12-13 12:29:06 +08:00
    @ysc3839 公网 IP 不需要 qBittorrent 报告,tracker 本来就能获取到,问题是端口。
    ysc3839
        16
    ysc3839  
       2022-12-13 13:02:31 +08:00 via Android
    @cwbsw 说的是公网 IP 和端口
    cwbsw
        17
    cwbsw  
       2022-12-13 13:07:36 +08:00
    @ysc3839 qBittorent 没这功能。
    heiher
        18
    heiher  
       2022-12-13 13:36:21 +08:00   ❤️ 1
    @mikewang

    平常并不使用 BT 协议,也不了解 BT 协议,但 mike 兄讲的很清晰,我看懂了,哈哈。

    我之前从直觉上的认知与 @ysc3839 一样,认为 BT 客户端可以将自己正在侦听的公网 IP 、端口交换给 peer ,那么在本机:A —> 路由器:B —> 公网:C 三层结构下,BT 客户端通过 UPNP 或 NATPMP 打通路由器:B —> 本机:A 的入站,再利用公网侧 CGNAT 的 NAT1 特点,同时打通公网:C —> 路由器:B 。就能完全实现用户免配置。

    现在综合看事实可能不是这样的,那么向开源的 BT 客户端提交补丁可能是一劳永逸的方法?增加获得并报告公网侧 IP 、端口的支持。

    对于不修改 BT 客户端的情况,mike 兄的方法已经实测可行了,只要在 Natter 的 Hook 脚本中调用 BT 客户端 API 更改侦听端口即可。而对于没有 API 的 BT 客户端,不知道是不是可以实现一个代理程序来篡改客户端上报的端口 :P
    ysc3839
        19
    ysc3839  
       2022-12-13 13:39:05 +08:00 via Android
    @cwbsw 我目前没有测试环境,但印象中以前用校园网连接 PT 站时,PT 站后台看到的 IPv4 端口是和本地不同的,本地一直是固定的 8000 多的端口,但是后台看到的是上万的端口。也有可能是我记错了,但我目前也没条件测试。
    isad
        20
    isad  
       2022-12-13 14:04:19 +08:00
    对 BT 来说,没什么必要做特殊处理。你在内网里本身就可以通过 DHT 进行 μtp 上传,就算你自行映射端口并报告给 tracker ,中国三大运营商的国际互连质量也本来就很拉跨,tcp 上传并不会快多少。
    mmr
        21
    mmr  
    OP
       2022-12-13 14:10:36 +08:00
    @mikewang 我逝逝,现在的 PT 站不是很热门,下载人数不多,可能是这个原因才没上传的吧
    dc3365
        22
    dc3365  
       2022-12-13 14:23:57 +08:00
    我的解决方案是直接在网站上购买上传量。10 块钱可以买到很多。足够单独下载很久。
    redbeanzzZ
        23
    redbeanzzZ  
       2022-12-13 17:34:34 +08:00
    @RheatiN 热门成人包回个本一般还是可以的,反正 24 小时挂着
    mikewang
        24
    mikewang  
       2022-12-13 23:26:32 +08:00
    确实,如果 BT 软件直接支持获取外部的 DHT 端口的话,也不用采取这样的迂回战术。

    采取迂回的方法有点麻烦:1. 不能采用 DMZ ,端口 A 需要和端口 C 一致; 2. Hook 脚本不仅要改 BT 监听端口,还要改路由器的端口映射。

    不修改 BT 客户端的情况下可行,有点折腾。综上,无 v4 公网情况下 BT 还是走 v6 省事 。 @mmr @heiher
    cwbsw
        25
    cwbsw  
       2022-12-14 14:32:19 +08:00   ❤️ 1
    @mikewang 看了下 @heiher 写的 natmap ,用起来应该还挺简单的啊,需要动态更改的只有 BT 的监听端口而已,transmission-remote 一个参数就能解决,其它的都是固定的。
    cwbsw
        26
    cwbsw  
       2022-12-14 14:34:39 +08:00
    好想是想太简单了,应该还需要动态配置 IPv6 的防火墙,不过问题也不大,很多方法可以解决。
    Wenpo
        27
    Wenpo  
       2022-12-15 00:02:58 +08:00   ❤️ 1
    @mikewang 蹲,哈哈事实上 natter 刚出来的时候,我第一个应用就是给 bt/pt 打洞,然后把打洞后的端口手动设置到 tr 上,我每次都还用 itdog 全国 ping 一下,每过一阵子我还要检查一下端口改了没。
    qbqbqbqb
        28
    qbqbqbqb  
       2022-12-18 17:51:42 +08:00
    BT 打洞是看软件实现的。

    首先 BT 有两个协议,基于 TCP 的 BT 协议和基于 UDP 的 uTP 协议,只有 UDP 的 uTP 能打洞。所以你的 BT 软件必须要支持 UDP 传输。

    其次看你用的是哪款客户端软件,开源 BT 软件一般都是基于 libutp 这个库的,这个库里的 uTP 的实现上支持一个 ut_holepunch 打洞扩展。
    已知 qBittorrent 可以自动打洞。Transmission 虽然也是基于 libutp 的,但它似乎没有实现打洞功能。
    其它软件的话,很多人喜欢用的“比特彗星”这个软件,老版本是完全不能打洞的,新版本据说可以。
    qbqbqbqb
        29
    qbqbqbqb  
       2022-12-18 17:53:24 +08:00
    BT 内置打洞协议资料:
    https://www.bittorrent.org/beps/bep_0055.html

    就看你用的 BT 软件支不支持这个了。
    jyeric
        30
    jyeric  
       2022-12-26 20:57:24 +08:00
    bitcomet 好像据说支持打洞,但没实际测试过
    MeteorVIP
        31
    MeteorVIP  
       2023-02-03 11:54:33 +08:00 via iPhone
    @heiher #18 大佬的插件非常爽,享受了公网 IP !感谢!
    @Wenpo #27 我也是用来给 bt ,pt 打洞,哈哈哈
    @mikewang #14 我使用的方法和你说的一模一样。
    natmap 插件提供了公网 IP 端口变动通知的功能,我自己写了脚本:公网 IP 端口变动就通知 vx 。同理,把脚本改为变动了就修改 Transmission 的端口,tr 的端口是写在配置文件里面的。流程:停止 tr ,修改端口,运行 tr 。
    我是千兆,上传一般是 5m/s ,偶尔能上 7 到 9 ,再次感谢 @heiher
    mikewang
        32
    mikewang  
       2023-02-04 01:41:52 +08:00 via iPhone   ❤️ 2
    @MeteorVIP 👍实践出真知
    这种 NAT1“真”穿透打洞的方式是我半年前一时兴起想到的方法,得到了广大 v 友的验证,还有 @heiher 这样优秀的开发者以全开源的形式贡献代码。毕竟很多类似的工具不是中转就是闭源。还是非常感动的。欢迎来 https://t.me/hellonatter 大家一起探讨。
    MeteorVIP
        33
    MeteorVIP  
       2023-02-04 20:56:28 +08:00
    @cwbsw 大佬,要怎么用命令改 peer-port?
    cwbsw
        34
    cwbsw  
       2023-02-04 21:34:37 +08:00   ❤️ 1
    @MeteorVIP transmission-remote 192.168.1.10:9091 -p 12345
    MeteorVIP
        35
    MeteorVIP  
       2023-02-06 00:25:26 +08:00 via iPhone
    @heiher 大佬,怎么通过命令去修改转发的端口?新建会了,修改还不会。大佬有空的时候教教:)
    heiher
        36
    heiher  
       2023-02-06 12:34:52 +08:00   ❤️ 1
    @MeteorVIP #35 应用程序的端口转发在程序启动后目前无法修改,将来可以增加方法;结合性能考虑,建议使用防火墙的端口转发,在映射建立获得公网端口,调整 BT 客户端侦听端口后,脚本里再更新防火墙的端口转发规则。
    MeteorVIP
        37
    MeteorVIP  
       2023-02-06 22:08:11 +08:00
    @heiher #36 可能是表达的不够清楚,我想修改的是"转发目标端口".
    通过界面是可以修改的.openwrt 界面显示的代码是 uci set natmap.cfg053b66.forward_port='54321'
    比如新建端口 23456 代码为 natmap -4 -d -i pppoe-wan -s stun.stunprotocol.org -h qq.com -b 48083 -t 172.16.1.111 -p 23456
    我想把 23456 改为 54321,请问通过代码怎么实现?谢谢
    heiher
        38
    heiher  
       2023-02-06 22:17:35 +08:00   ❤️ 1
    @MeteorVIP #37 我没有理解错,已经启动的 natmap 的 -p 参数还不能运行时修改,建议使用防火墙的端口转发实现 -t 172.16.1.111 -p 23456 的转发功能,性能更好,而且也方便更新目标端口。

    如果暂时非要用 natmap 的应用程序端口转发,那么一种 workaround 方法是先后启动两个 natmap ,打同一个端口:

    1. natmap -4 -d -i pppoe-wan -s stun.stunprotocol.org -h qq.com -b 48083 -t 172.16.1.111 -p 23456 -e script1
    2. natmap -4 -d -i pppoe-wan -s stun.stunprotocol.org -h baidu.com -b 48083 -t 172.16.1.111 -p 54321 -e script2

    script1 负责启动第二个 natmap ,并关闭第一个 natmap 。script2 实现同等的功能,当公网端口映射变更时。需要注意的是 -h 参数两个 natmap 需要不同,防止冲突。两个不同的 http server 可以交替使用。

    还是建议使用防火墙方式,可以参考这个更新脚本:

    https://github.com/Mythologyli/qBittorrent-NAT-TCP-Hole-Punching/blob/master/update.sh#L21
    ChiCh
        39
    ChiCh  
       2023-08-29 21:19:07 +08:00 via iPhone
    BT 软件是支持打洞的,而且打洞方式已经被协议化了,详见: https://www.bittorrent.org/beps/bep_0055.html

    如果用的软件不是太旧的版本的话,想必都已经实现了此功能。

    协议中:只支持 UDP 打洞,并通过 uTP 传输( TCP 打洞不支持,我认为是因为 TCP 打洞只支持完全锥形 NAT ,打洞成功率较低)。

    STUN 也和大家想的不一样,他是通过把有公网 IP 的下载/做种用户当作 STUN 进行搭桥。

    至于 Tracker 部分,上传给 Tracker 的仍然是不可用的内网端口号。Tracker 在此环境下只提供“得到活动的公网 IP 用户”的功能。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3590 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 10:58 · PVG 18:58 · LAX 02:58 · JFK 05:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.