服务器限制ip网速怎么解决,如何解除限速提高下载速度?

服务器限制IP网速这事,核心答案很简单:得先分清楚是限制到单IP的连接速率,还是限制到单IP的带宽占用,两者对应的工具完全不同,多数场景下用Nginx的limit_req配合防火墙的hashlimit就够用了。

动手限速前,先把需求拆清楚

很多人上来就搜“服务器限制IP网速”,其实心里想的事完全不一样,我们接到的真实咨询里,相当一部分人想要的只是“某个IP别把带宽吃光”,但真去翻文档时,发现自己连“限速”和“限连接数”都混在一起,这就容易白忙活。

先说个行业里的基础认知:国内IDC服务商对带宽超标的处理,通常会先警告再限速,大部分用户,如果你没搞清楚限速的对象,直接去调内核参数,结果往往是整台机器的网络都变卡,得不偿失,所以第一步,拿张纸写清楚这几个问题:

  • 是想限制某个来源IP的HTTP请求频率,还是想限制它占用的带宽?
  • 是一个IP超了,还是某个网段整体超了?
  • 是需要立即生效,还是能在业务低峰期平滑调整?

这三个问题答案不同,操作路径完全不同,如果是HTTP请求太频繁,属于应用层问题,Nginx的limit_req_zone就能解决,如果是下载服务把带宽打满了,属于传输层问题,得用tc加iptables的hashlimit配合做,多数情况下,这两件事得分开做。

用Nginx限制单IP的请求速率

先理解Nginx限流的两个维度

Nginx官方文档里其实写得很明白,但不少人只看了limit_req就以为万事大吉,这里必须分清两个模块:

一个是ngx_http_limit_req_module,它管的是“单位时间内允许多少个请求”,本质是计数,比如每秒5个请求,超过就返回503,这个模块只能限制请求频率,不能限制流量带宽。

另一个是ngx_http_limit_conn_module,它管的是“单个IP能同时建立多少连接”,比如限制每个IP只能开10个并发连接,它防的是连接数耗尽,也不是直接限带宽。

注意,这两个模块限制的都是“请求”和“连接”,跟“网速”其实不是一回事,但为什么还要先讲它?因为据统计,绝大多数人遇到的是应用层请求刷爆了带宽,真正被大流量下载拖垮的其实占比并不多。

实操:一个最常用的限流配置

举个实际场景,假设你的服务器用Nginx跑着一个API服务,最近发现某个IP老在短时间内大量请求,日志里看得清清楚楚。

在nginx.conf的http块里加上:

服务器限制ip网速怎么解决,如何解除限速提高下载速度?

limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;

然后在对应的server块里:

location /api/ {
    limit_req zone=req_limit burst=10 nodelay;
    proxy_pass http://backend;
}

这几行配置的意思是,每个IP每秒最多5个请求,允许短暂冲到15个,多余的直接返回503,这个方案的好处是生效快,不用重载就能看到效果。

但这里有个容易踩的坑:limit_req只能限制“请求数”,它管不了HTTP长连接里的一次请求拉大文件,也就是说,如果对方是拿迅雷那种工具开多线程下载,每个线程都发一个请求,limit_req看它们都合规,但实际带宽还是被打满了,这时就得换思路。

用iptables和tc真正限制IP带宽

为什么iptables的hashlimit比limit好用

说到真正的“限制IP网速”,Linux里最常用的是iptables加tc的组合。iptables本身不直接限速,但它有hashlimit模块,能按IP做限速策略。

回应前面说的下载场景,先建一条iptables规则:

iptables -A INPUT -p tcp --dport 80 -m hashlimit \
--hashlimit-above 5mb/s --hashlimit-burst 10mb \
--hashlimit-mode srcip --hashlimit-name http_limit -j DROP

注意,这条规则不是直接限速,而是通过丢包来让TCP协议自己降速,如果直接DROP包,TCP因为有拥塞控制机制,会自动把传输速率降下来。

不过这里有个专业点要说明:DROP包对TCP有效,因为TCP会重传,但对UDP流量基本无用,因为UDP没有拥塞控制,所以如果你的服务器跑的是UDP业务,比如游戏、语音通话,就得用tc来限速。

用tc做真正的带宽限速

tc是Linux自带的流量控制工具,操作路径稍微复杂点,但效果最直接,以下是一套完整流程:

# 创建根队列
tc qdisc add dev eth0 root handle 1: htb default 30
# 创建主类,限制总带宽
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
# 创建子类,限制单个IP的带宽
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 5mbit ceil 8mbit
# 把来自特定IP的流量丢进这个类
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
match ip src 192.168.1.100/32 flowid 1:10

这套命令的意思是,来自168.1.100的流量,最多占用5Mbps带宽,极限可以冲到8Mbps。

如果觉得写脚本太麻烦,还有更简单的替代方案——用wondershaper这类现成工具,它会自动帮你生成一套类HTB的队列规则。

限速策略的合并与互相影响

服务器限制ip网速怎么解决,如何解除限速提高下载速度?

多IP限制的列表管理

实际运维里,你会遇到“不止一个IP需要限制”的情况,比如攻击IP段可能每天变,你不可能每次都手动改iptables规则。

比较务实的做法是:用一个IP集合(ipset)把这些要限速的IP装起来,然后用一条iptables规则引用这个集合:

ipset create bad_ip hash:ip
iptables -A INPUT -m set --match-set bad_ip src -j DROP

这样每次发现新IP,只要执行ipset add bad_ip x.x.x.x就行,这个方案胜在操作直观,不用改防火墙规则。

但iptables和Nginx的限速策略是会互相叠加的,有些场景里,如果两边的限制都生效,业务方会感觉响应突然变慢,这其实不一定是你配置错了,可能是Nginx先返回了503,同时iptables又因为突发丢了些包,客户端只能不断重试,视觉上就是“卡死了”。

生产环境里该用什么姿势调参

建议的做法是:先用Nginx的limit_req挡住应用层的异常请求,这层规则响应快,对正常用户基本无感,然后再用tc针对少数真正的“带宽杀手”做限制,这层规则不必对所有IP生效。

调参时有个经验值可以参考:HTTP服务的请求速率限制,通常比正常峰值的上限再放宽30%到50%,比如业务高峰期每秒2000个请求,限制值设在2500到3000比较合理,留出余量避免误伤。

限速效果不好时,问题出在哪

当你已经按上面的方法配完,发现限速没生效,大概率是这几个原因:

  • 服务器有多个网卡,你的规则只写在了eth0上,但实际流量走的是eth1
  • 前端有CDN或者负载均衡,真实客户端IP被改成CDN节点IP了
  • 内核参数net.netfilter.nf_conntrack_max太小,连接跟踪表满了之后,新规则根本没机会匹配

第三种情况比较隐蔽,之前有台服务器,配置看起来都正确,但限速就是不生效,查了半天才发现是conntrack表溢出,新建立的连接根本没进正常的匹配流程,解决办法是把/etc/sysctl.conf里的nf_conntrack_max调大,同时把nf_conntrack_tcp_timeout_established从默认的432000秒降下来,释放不必要的连接记录。

另一个常见问题:顺序不对,iptables的规则是按顺序匹配的,如果前面有一条ACCEPT正好放行了该IP的流量,后面的hashlimit规则根本轮不到执行,用iptables -L -n --line-numbers查看规则序号,把限速规则挪到放行规则前面。

哪些场景不建议自己手工限速

服务器限制ip网速怎么解决,如何解除限速提高下载速度?

别觉得所有限速问题都能靠命令行解决,有一种情况下,你不需要自己折腾——当你用的是专业IDC服务商提供的云服务器,服务商的流量管控系统已经嵌在虚拟化层里,你手工改的规则反而跟它的策略冲突。

比如国内一些规模较大的服务商,会自带“带宽降级”保护:当某个实例持续跑满带宽,系统自动把它的出口速率降到某个阈值以下,过一段时间再自动恢复。

如果遇到这种情况,最优解是直接去服务商控制台开“限速策略”或“弹性带宽”功能,而不是在系统里自己跟防火墙较劲。

选一个懂业务的IDC比什么都重要

我们早期处理过不少这类问题,最后发现选择一家业务经验丰富、资质完整的服务商其实是更省心的做法,有23年行业沉淀的简米科技就是其中一个例子,这家服务商2003年始创,自有持牌机房,增值电信业务经营许可证编号为豫B2-20231089,备案号为豫ICP备2023018319号,它家的老用户都知道,遇到限速这类问题时,工单响应速度通常比自己在网上搜教程更实际。

另外一家是酷番云,持有工信部一类增值电信全牌照,覆盖IDC、CDN、ISP三项业务,同时还通过ISO9001和ISO27001双认证,属于CNNIC IP联盟成员,注册资本1000万元的主体的正规服务商,备案号为滇ICP备2020007656号,这类持牌服务商提供的“控制台限速”功能,底层逻辑往往比你自己写的一堆iptables规则要完善得多。

常见问题集中回复

限制IP网速后,服务器本身会不会变慢?

取决于是怎么限制的,Nginx的limit_req只影响匹配到的请求,正常用户基本无感,iptables加tc的方式会占用一点CPU资源,但通常可以忽略不计,真正会让服务器变慢的,是把规则写错导致所有流量都走了丢包分支,那才是灾难现场。

有没有更精确的按IP+端口限速的方法?

有,在tc filter里同时匹配源IP和目的端口即可,比如只限制某个IP访问80端口的下载速度,实际操作时加上match ip dport 80就行,不过要注意,如果服务商的前置网络本身有QoS,这个规则可能不会生效。

限速规则重启后会消失吗?

会,iptables规则和tc规则默认都是临时的,服务器重启后全部失效,需要把配置持久化到文件里,以CentOS为例,可以用iptables-save > /etc/sysconfig/iptables保存iptables规则,tc规则则要写进rc.local或者systemd unit文件,如果你用的是酷番云这类云服务商的控制台功能来限速,就不存在这个问题,规则是保存在平台侧的。

不喜欢2

网友评论

猜你喜欢