提升家庭网络稳定性:OpenWRT限制京东云连接数教程
连接数量对网速的影响
之前我并没有意识到连接数量对网络稳定性和网络速度存在影响,但是查阅部分资料后,发现活动连接数量过多
会影响网速的原因主要包括以下几个方面:
带宽消耗:每个连接都占用了网络带宽,活动连接数量增加时,带宽会被多个连接分摊,导致每个连接可用
的带宽减少,最终导致整体网速下降。
路由器/网络设备的处理能力:路由器和其他网络设备在处理大量连接时会增加工作负荷。如果设备的处理能
力有限,过多的连接会导致设备反应变慢,增加数据包的处理延迟,进而影响网速。
网络拥塞:过多的连接可能会导致网络拥塞,尤其是在家庭局域网中。网络拥塞会导致数据包丢失、重传等
问题,进一步降低实际的传输速度。
NAT表的限制:对于使用NAT(网络地址转换)的网络,每个连接需要在NAT表中建立一条记录。NAT表的
容量有限,当连接数过多时,NAT表可能会溢出或处理速度变慢,导致网络性能下降。
CPU和内存负载:如果你的设备(如计算机或服务器)处理大量的并发连接,CPU和内存负载会增加,可能
导致设备性能下降,进而影响网速。例如我的Asus Acrh17,在12000活动连接数时,内存占用超过70%,
此时局域网内其他设备明显可感觉到延迟。
运营商活动连接数量限制:大部分运营商会对每户入网的宽带进行活动连接数量限制,不同地区、不同运营商
甚至所属不同片区均不相同,当达到一定量的活动连接数量时,更多的连接会进行丢包处理,所以会直接影响
到使用者的体验。目前检索到的消息可以查看这里:
宽带连接数限制测试结果(来源):上海电信:公网不限制,私网 8000,云宽带 2800 上海移动:私网 2500 上海联通:公网 6000,私网 1500 江苏移动:公网不限制,私网 2500 浙江移动:公网 6000,私网 2000 江苏联通:公网 6000,私网 3000 江苏电信:公网不限制,私网 6000
本地网络环境介绍
光猫:桥接模式(中兴老款F450,已尝试修改了硬桥接,未使用软桥接方式,同时,未做光猫本身最大
连接数修改)
主路由:ASUS-ACRH17,系统为OpenWRT,开启Fullcone NAT。
旁路由(旁路网关):X86虚拟机(Hyper-V虚拟化),系统为OpenWRT的衍生版本ImmortalWRT
(本篇中并不重要)。
网心云:X86版本(Hyper-V虚拟化)并配置静态地址,网关直接指向主路由,避免流量经过旁路。
- 配置文件限制方法
主路由目前使用的OpenWRT版本为24.10,在这个OpenWRT版本中已经使用nftable取代了iptables,所以
在网上找到的很多iptables无法使用或者会提示过老版本,配置后查看规则计数器数据为0,没有生效。同时
nftable在OpenWRT上并没有提供luci app插件以及对应的UI操作界面,所以就需要我们自行编写nftable规
则进行连接数的控制。
在另一方面,由于主路由器开启了Fullcone NAT模式,所以使得所有来自外部的连接请求都可以通过主路由访问
内网的网心云,且不再使用UPNP。这意味着,如果在 nftables
中通过ip fileter添加了针对网心云的INPUT和
OUTPUT限制规则,那这些规则就不能正确匹配外部流量,所以通过INPUT和OUTPUT规则进行过滤没有任何的
效果,这也是我在尝试之后,发现匹配规则数量为什么一直都是0的原因。
同时,使用 conntrack
(conntrack需要安装,一般都没有预装)查看连接时,我发现连接信息已经包含NAT处
理后的外部IP地址和端口,而nftables规则要考虑对NAT后的地址和端口进行限制,那么目标就来到了 forward
链上。
首先确保OpenWRT已经安装了以下内核,如果缺少的话,在使用nftable时候会提示报错:“
Error: Could
not process rule: No such file or directory
”。
modprobe nft_chain_nat modprobe nft_counter modprobe nft_ct modprobe nft_limit modprobe nft_reject
可以通过如下命令进行安装:
opkg update opkg install kmod-nft-core kmod-nft-nat kmod-nft-connlimit
下面编辑文件限制udp连接数,(京东云如果限制所有连接数,会导致与云平台失联,虽然跑的很欢,但是积分很低)。编辑/etc/nftables.d/10-custom-filter-chains.nft
文件,取消注释并修改 user_post_forward
链,像这样:
chain user_post_forward { type filter hook forward priority 1; policy accept; # 限制从 192.168.0.4 发出的 UDP 连接数 ip protocol udp ip saddr 192.168.0.4 ct count over 5000 counter drop # 限制发往 192.168.0.4 的 UDP 连接数 ip protocol udp ip daddr 192.168.0.4 ct count over 5000 counter drop }
然后重启firewall/etc/init.d/firewall restart
/etc/init.d/firewall restart
通过nft list进行查看规则是否已经添加成功
nft -a list ruleset
chain FORMARD { # handle 1 type filter hook input priority filter - 1; policy accept; ip saddr X.X.X.X ct count over 5000 counter packets 0 bytes 0 drop # handle 36 ip daddr X.X.X.X ct count over 5000 counter packets 0 bytes 0 drop # handle 37 }
OpenWRT查看端口占用
查看单独端口占用情况及对应程序,例如8080为要进行查看的端口
netstat -tulnp | grep 8080
2.查看客户端IP地址端口占用情况
netstat -tulnp | grep <客户端IP>
总结归纳
kmod-nft-core(核心)
kmod-nft-nat(nat相关规则配置参数支持)
kmod-nft-connlimit(计数相关规则配置参数支持)
conntrack(查看连接,可选)
目前配置完成之后(我配置的来源和目的地活动连接数量均为4000),主路由显示的活动连接数量大概在5000
左右浮动,至于为什么没有完全和规则匹配上,我的猜想可能是因为有一些长连接还没有释放的原因,后续会进
行持续观察。
限制活动连接数量之后,对网心云的跑量影响需要等待几天才能看到,之后我也会更新到这里。目前来看,在上
传带宽方面没有任何的变化,依旧可以跑满限制带宽,理论上延迟应该也可以降下来,但存在一个副作用,就是
丢包也会上涨,这部分会影响多少的收益暂时还不清楚,同时具体连接数限制的数值的设定,也需要持续的观察
才能确认最优配置。
同时上述规则中没有配置IPV6的相关nftable规则,因为目前我的环境和观察下,IPV6的量只占很少的一部分,
如果之后量起来了,对本地的网络环境已经有了体感的影响,我也会进行研究相关配置。
这篇文章也不仅仅能应用于网心云,当你需要对局域网内的任何客户端,或者说是局域网内任何IP进行活动连
接数量的限制时,都可以根据上面的内容进行操作,尤其是对于抖音、快手、爱奇艺这种活动连接请求大户。