PT、BT 下载如何利用 P2P 打洞获得上传速度。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mmr
V2EX    宽带症候群

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

  •  
  •   mmr 2022-12-13 08:40:59 +08:00 9765 次点击
    这是一个创建于 1037 天前的主题,其中的信息可能已经有所发展或是发生改变。
    已经实现的:
    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 好像据说支持打洞,但没实际测试过
    UXha45veSNpWCwZR
        31
    UXha45veSNpWCwZR  
       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 大家一起探讨。
    UXha45veSNpWCwZR
        33
    UXha45veSNpWCwZR  
       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
    UXha45veSNpWCwZR
        35
    UXha45veSNpWCwZR  
       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 客户端侦听端口后,脚本里再更新防火墙的端口转发规则。
    UXha45veSNpWCwZR
        37
    UXha45veSNpWCwZR  
       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     Solana     2715 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 15:04 PVG 23:04 LAX 08:04 JFK 11:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86