时光绘梦集
位置:首页服务器正文

道法自然 2025/03/22 周6

iptables限制连接速率

数据进站,服务商那边的安全组或者防火墙是第一道过滤网,可以理解为路由。第一次过滤。

系统防火墙是第二道过滤网。

nginx是第三道过滤网。

php是最终处理程序。

它们的每一步都可以选择拒绝请求。但是第一步,第二步这里,直接拒绝,数据没有进站,不会对系统,cpu,内存,带宽造成大量损耗。如果到了第三部这里数据已经进入服务器,系统需要对他存储,处理,安排,即时最后拒绝请求,服务器带宽,负载也被消耗了。

我之前用nginx设置限制请求数每秒允许多少,用并发工具测试,感觉nginx限制的很准,很好。

但是我查看服务器负载情况,发现服务器cpu,内存,带宽仍然骤然飙升,特别是带宽明明吃满了。我设置了限制请求是为了让服务器不满载,怎么感觉不对劲。

后来无意中发现了防火墙也可以限制请求,就设置了一下。发现防火墙才是真防。设置了防火墙,再用并发测试检测,发现系统负载,带宽等,稳的很,不过感觉就是数据好像不太准。

我系统的防火墙是iptables。以下规则也是配置它的。

#查看进入端口策略
sudo iptables -L INPUT -n --line-numbers

#设置本地回环允许(本地数据库,缓存等等)
iptables -I INPUT -i lo -j ACCEPT

#设置已经建立的连接允许
iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

#设置22端口允许(SSH)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

#设置默认进站流量拒绝
sudo iptables -P INPUT DROP

#设置默认出站流量允许
sudo iptables -P OUTPUT ACCEPT

# 限制 TCP 80 端口的请求速率
iptables -A INPUT -p tcp --dport 80 -m limit --limit 50/sec -j ACCEPT

# 限制 TCP 443 端口的请求速率
iptables -A INPUT -p tcp --dport 443 -m limit --limit 100/sec -j ACCEPT

# 限制 UDP 443 端口的请求速率
iptables -A INPUT -p udp --dport 443 -m limit --limit 200/sec -j ACCEPT

#保存配置
sudo apt install iptables-persistent#第一次要安装
sudo netfilter-persistent save

#限制ipv6使用同样的命令,但是iptables换成ip6tables

iptables的配置规则从上往下执行,匹配到一条就不再匹配其他的,没有匹配到一条就按照默认值处理。所以该允许的一定要放在拒绝前面,不然前面拒绝了,后面允许也不行。

设置进站默认拒绝之前,需要确保开启之前所有的进站流量,该开启的都开了,不过还好这里是设置立马生效,不保存的话可以重启恢复。

我之前用nftables设置过一次,那个我当时是修改配置文件,设置了80,443端口,忘记了设置22和宝塔端口了,重载配置后,服务器连不上了,重启也没用,因为我是修改的配置文件,重启后还是连不上,最后只能重装系统。

如果设置默认允许则没关系,大不了再删除。设置拒绝策略要慎重,特别是那种设置默认值的,如果有一个需要用的服务忘记设置开启了就设置默认拒绝,比如22端口,然后再出一些意外,就要被迫重装系统了。


共有3条评论