首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
测试工具
SmokePing
IPv6 访问测试
V2EX  ›  宽带症候群

BT 下载疑问,公网可以向我的内网发送 UDP 包?打洞洞加持?

  •  
  •   brMu · 42 天前 · 1972 次点击
    这是一个创建于 42 天前的主题,其中的信息可能已经有所发展或是发生改变。
    qbittorrent 4.1.5,装在软路由上,软路由直接拔号,获取了内网 ipv4 和公网 ipv6,BT 下载时,tcpdump 发现对方是通过公网 IP 发送 UDP 包到我的 ipv4 内网地址的,一般 TCP 通过建立连接后这种现象是正常的,UDP 是无连接的,为什么他可以主动发送到我的内网 ipv4 的 BT 端口的?打洞洞?

    16:41:19.728597 IP 60.109.50.*.47772 > 10.9.168.*.9982: UDP, length 1426
    16:41:19.728601 IP 60.109.50.*.47772 > 10.9.168.*.9982: UDP, length 1426
    16:41:19.728605 IP 60.109.50.*.47772 > 10.9.168.*.9982: UDP, length 1426
    16:41:19.728609 IP 60.109.50.*.47772 > 10.9.168.*.9982: UDP, length 1426
    16:41:19.728613 IP 60.109.50.*.47772 > 10.9.168.*.9982: UDP, length 1426
    16:41:19.733553 IP 60.109.50.*.47772 > 10.9.168.*.9982: UDP, length 1426
    16:41:19.733559 IP 60.109.50.*.47772 > 10.9.168.*.9982: UDP, length 1426
    15 回复  |  直到 2019-05-09 09:11:15 +08:00
        1
    sean10   42 天前 via Android
    对,NAT 打洞
        2
    dryadent   42 天前
    一般都是 NAT 映射出去的
        3
    ihipop   42 天前 via Android   ♥ 1
    upnp
        4
    OneNian   42 天前 via iPhone
    你作为客户端先去请求资源的,并不是公网的用户直接给你发数据。

    运营商的 nat 是无法穿透的,upnp 也不能传递
        5
    brMu   42 天前
    @sean10
    感谢,我又搜了下,这篇文章讲的太细了,应该就是通过中间服务器来实现 UDP 打洞的。
    https://blog.csdn.net/ustcgy/article/details/5655050
        6
    cwbsw   42 天前
    @OneNian
    一级运营商都是锥形 NAT,后面的节点之间是可以直连的。
        7
    OneNian   42 天前 via iPhone
    @brMu
    BT 的 tracker 不是中间服务器
        8
    catalina   42 天前
    @brMu bt 的 tracker 只是告诉你这个种子有哪些 ip 在下载、哪些 ip 在上传而已。。。否则怎么能叫 p2p ?
        9
    brMu   42 天前
    @OneNian
    @catalina
    我说的中间服务器不是 tracker 服务器喔,是通过一台外网的节点做为桥接,来实现 2 台内网 IP 之间的 UDP 通讯,通讯建立后,这台中间节点就不再需要了,这个可能是µTP 协议的功能,桥接节点也可能是µTP 协议随机找的一台 DHT 外网节点。
        10
    ryd994   42 天前 via Android   ♥ 3
    这不叫打洞,对方有公网 IP。你发起连接,对方回复。nat 规则会留下双向记录,所以返回包也可以正常通过。
    你怎么不想想你怎么上网的?你发起连接,出门的时候被 nat 到公网地址,然后服务器认为是在和这个公网地址会话。返回的包匹配到连接表里的这个条目,执行相反操作。不然你怎么收得到回包?

    打洞是双方都是内网地址,这种情况下是无法由外向内主动发起连接的。只能在打洞服的协调下同时发起连接,这样连接表里各自就有了合法的条目,后续的包就可以通过了。


    你看到的永远是对方公网地址,否则这包来源地址你怎么回复?要检查对方是不是内网很简单,使用另一个公网地址发起连接,用 tcpping 或 udpping,如果这样还会有回复那就是公网。反之则无法判断。你不知道是 nat 无法匹配而 drop 还是对方防火墙 drop。
        11
    liuminghao233   42 天前 via iPhone
    你先发了包给服务器
    所以它可以 reply
        12
    ryd994   42 天前 via Android   ♥ 4
    UDP nat,因为 UDP 无状态,只能依赖四元组来匹配。通过第三方公网节点中转,双方协商要用的四元组,然后使用同样的参数发起连接。各自的出站包会在连接表里增加条目。然后等对方入站包到的时候,连接表里就可以匹配反方向的四元组了。
    现实中不可能完全同步,所以总有一方先到的会被弃。但是没关系,继续重试即可。

    难点是你不知道出站 nat 会被 nat 成哪个端口,所以需要用 heuristic 猜测。协商只能协商内网端口,但路由器不一定就保持内网端口不变。猜得中就能打动成功。
        13
    brMu   42 天前 via Android
    @ryd994 厉害了我的哥,讲的太好了,给你点赞!👍
        14
    OneNian   42 天前 via iPhone
    @brMu
    不想想这个打洞的服务器谁提供呢
    上面回复的就是我一开始说的
        15
    shuiyingwuhen   41 天前
    @ryd994,学习到新姿势
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2167 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 15:56 · PVG 23:56 · LAX 08:56 · JFK 11:56
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1