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端口,然后再出一些意外,就要被迫重装系统了。