关于 B 站观看直播使用 P2P 进行传输的研究

最近更新日期:2026 年 5 月 20 日,01:00。

必须注意

此文章可能有时效性,一段时间后可能不会起作用。此文章后续可能还有改动。另外根据自己的网络实际情况,实行相关措施。

如果操作不当,会影响其他正常需要 NAT 打洞的程序或游戏,例如 GTA 在线模式、绝地潜兵,以及 Minecraft 26.x 版本新更新的 P2P 好友联机等,按需设置!

1. 前言

之前我在浏览器或手机端看 B 站直播的时候,我发现网速有点不对劲,上下行近乎对等,甚至出现上传比下载还高的情况,遂使用 Wireshark 进行抓包,发现全是 UDP DTLS 的网络流量,对方 IP 都是家宽类型的,然后怀疑是不是直播用了 P2P 技术。

由于我是想到啥就写啥,所以可能看着有点乱,先凑合看吧。

2. 先分析

简单分析了下,然后,简单来说,你在看 B 站直播的时候,服务器会给你发送直播的画面。

与此同时,你的设备还会被当成服务器,给同样在直播间里的其他用户发送直播视频画面。而且,如果你网络环境好的话,上传给其他用户的概率也就越大。

它是怎么传出去给其他人的?当然是利用了 STUN 和 NAT 打洞。

3. 利与弊

好处就是,对于服务商来说,降低了服务器本身和网络资源占用,还能让服务商减少支出相关的费用。毕竟每年给运营商付的费用也不是个小数目。

坏处是,对用户来说,占用你设备大量的网络资源,和设备本身资源,只要在相同的直播间,都有可能参与 P2P 网络传输,而且直播间里的各个观众网络环境条件也是不一样的,非常容易出现直播缓冲的情况。

再者,鉴于目前三大运营商的跨省流量结算和跨运营商 QoS 的策略,如果上传流量太大(具体多大取决于运营商,完全说不准)很容易被运营商以 PCDN 为由,对你的网络进行限速处理。

4. 屏蔽措施

4.1 域名屏蔽法或 WEBRTC 屏蔽法

4.1.1 电脑

如果你用电脑看,其实很简单,只需要把 STUN 服务器地址屏蔽,就可以了,去 hosts 文件把 B 站的 STUN 服务器的域名,全解析到 0.0.0.0 就行。还有一种方法,是直接关闭 WEBRTC,你可以去浏览器的应用商店搜索 AdGuard,里面提供了关闭 WEBRTC 的选项,但是直接关闭 WEBRTC 过于一刀切了,会影响其他需要 P2P 的用途,除非…你不用。

不太建议使用 PC 版客户端,客户端更容易绕过屏蔽,如果你一定要用客户端,那可以试试用反病毒软件自带的网络监控功能,给客户端限制上传速度,请注意,上传速率设置太低会影响正常使用,限速大概在 30-50 KB 每秒就差不多行了。

4.1.2 手机

手机的话,屏蔽就有点难了,可能需要借助其他网络设备来屏蔽。

但你可以尝试下边的方法,如果你愿意,且有相关技术能力的话..

4.2 基于 Linux 的路由器的 IP 伪装端口随机化


必须注意

此方法可能影响其他正常需要 P2P 网络连接的程序,按需设置

这里只提供 IPTABLES 版命令行,如果你用 NFTABLES 的话,直接写 NFTABLES 版本语法就可以,如果不会,iptables-translate 命令会帮你的忙。

人话:劣化 NAT 等级到对称 NAT,俗称 NAT 4

另外,对于 Natter,作者本人已经在网关设备实测过,在网关设备执行 MASQUERADE RAMDOM 转换时,不会影响运行在网关的 Natter 的端口转发方式为 IPTABLES 的行为,放心使用。

4.2.1 OpenWRT 端口随机化整个局域网

如果想把整个局域网的 P2P 都禁止,而且用的是 OpenWRT,可以这样做...

首先命令行,使用 SSH 方式登录,然后使用文本编辑器,nano 或 vim 都可,编辑 /usr/share/firewall4/templates/zone-masq.uc 文件,在最后一行,找到 masquerade comment,在两个单词中间,添加 random,保存即可。

如果使用的是 ImmortalWRT 或者是其他第三方编译的版本,自行找到相关选项,并取消勾选。有的叫 Fullcone NAT,有的叫全锥型 NAT。

回到 OpenWRT 的网页 Luci 设置界面,找到【网络】选项中的【防火墙】,重新点击一下“保存并应用”,现在再使用 NAT Type Tester 再看看,测试结果为 Symmetric,且过滤行为和映射行为都应该显示为 AddressAndPortDependent

4.2.2 OpenWRT 端口随机化其中一台或多台设备

请提前使用 ifconfig 命令或其他方法查明出口网卡名称。

首先,我建议你给要做劣化 NAT 类型的设备,分配一个静态的 IP 地址,然后,去【开机启动脚本】选项里,输入这个命令

1
iptables -t nat -I POSTROUTING -s <内网设备的 IP> -o <出口网卡名> -j MASQUERADE --random-fully 

4.2.3 Padavan 路由器端口随机化

都是基于 Linux 的路由器,稍微改写一下就行,还是之前说的,先分配静态地址给设备,然后再用命令行

提前使用 ifconfig 命令或其他方法查明出口网卡名称。比如你路由器的出口网卡是 ppp0,那么就..

单个设备或多个设备的话..

1
iptables -t nat -I POSTROUTING -s <内网设备的 IP> -o ppp0 -j MASQUERADE --random-fully 

如果你想应用到整个局域网,比如你的路由器 IP 是 10.0.0.1,子网是 255.255.255.0,那么就这样写:

1
iptables -t nat -I POSTROUTING -s 10.0.0.0/24 -o ppp0 -j MASQUERADE --random-fully 

4.2.4 Root 过的安卓手机

意思都差不多,都是基于 Linux 的系统,找个能输入命令行的软件,比如 MT 管理器或 Termux。

但是,一般用手机开热点,而且用的是手机蜂窝网络流量上网,基本上是 NAT 4,但有个别网络不是,所以我仍然提供设置方法。

对于 Android 10 以及之前版本的机器,使用下面的命令行,此命令行包含了 USB 共享网络、无线热点、蓝牙共享网络 PAN 的网段。

1
iptables -t nat -I POSTROUTING -s 192.168.42.0/22 -o rmnet_data+ -j MASQUERADE --random

如果想单独给 USB 网络共享的作用域设置,使用下面的命令行

1
iptables -t nat -I POSTROUTING -s 192.168.42.0/24 -o rmnet_data+ -j MASQUERADE --random

如果想单独给无线热点的作用域设置,使用下面的命令行

1
iptables -t nat -I POSTROUTING -s 192.168.43.0/24 -o rmnet_data+ -j MASQUERADE --random

如果想单独给蓝牙网络共享 PAN 的作用域设置,使用下面的命令行

1
iptables -t nat -I POSTROUTING -s 192.168.44.0/24 -o rmnet_data+ -j MASQUERADE --random

如果是 Android 11 或更高版本的手机,直接使用这条命令行就行

1
iptables -t nat -I POSTROUTING -s 192.168.0.0/16 -o rmnet_data+ -j MASQUERADE --random

4.3 屏蔽 STUN 服务器法

只需要把 stun.chat.bilibili.com 和 stun6.chat.bilibili.com 屏蔽就行。
如果仍然无效可以试试通配符法,比如 stun*chat.bilibili.com 这种。

5. 其他可供参考的资料

https://www.bilibili.com/opus/960552827377156133
https://www.bilibili.com/opus/625913491082488344
https://www.bilibili.com/opus/858956728907071497

6. 结论

因为没有完美的办法,毕竟道高一尺魔高一丈。

文章开头也说明过,可能具有时效性,随着 APP 厂商的更新,会发生变动,所以并不是一直都是有效的。就像抵抗校园网的路由器共享检测(v4 NAT)一样,各种 TTL、DPI、UA、时间戳检测法。

所以,请根据自己当前的网络实际情况,实行相关的措施。

就先这样吧,后续有新想法我再修改修改。如果文章有错误,或者是需要改进的地方,欢迎提出意见!

…你说你的网络本来就是 NAT 4?好吧好吧,直接关掉这个页面就行。


关于 B 站观看直播使用 P2P 进行传输的研究
https://marshmallowlands.github.io/2026/01/02/2026-01/StreamMedia-P2P/
作者
Marshmallowlands
发布于
2026年1月2日
许可协议