最近在捣鼓个小项目,考虑到政策风险,所以需要屏蔽国内IP。
找了比较新的IP范围,有5000多条,批量加入iptables里面。
起初我没意识到问题在iptables这里,系统负担很重,只能跑出来20M带宽。因为任何时刻服务器的并发连接都不会低于几千,每秒钟处理两万左右的请求,所以我一直以为是垃圾虚拟机的性能太渣(最低端配置,渣到不好意思说),始终在想办法优化系统、优化程序、优化网络架构。折腾了一周也只能提升到2.4到2.6万每分钟,实在没招了。
偶然灵光了一下,清空了iptables规则,带宽瞬间就到100M以上了,操,这下知道问题所在了。
于是改用ipset来屏蔽IP,对系统几乎完全没影响了,带宽稳定在60M到100多M,每分钟处理的请求在8万到10万以上了,cpu负载也只有20%到40%,对这么渣的配置来说,哥知足了。
再结合这些天对网络架构方面的优化,现在开了3个虚拟机,成本不到80块/月,每天处理请求数在一个亿以上了,总带宽在200M到300M左右浮动,知足了,知足了。
附:使用方法
#Debian系统需要安装: apt-get -y install ipset #创建名为cnip的集合: ipset create cnip hash:net #增加需要屏蔽的IP段: ipset add cnip 1.2.16.0/20 ipset add cnip 1.2.32.0/19 ipset add cnip 1.2.64.0/18 #添加对应的iptables规则: iptables -I INPUT -m set --match-set cnip src -p tcp --dport 80 -j DROP
我这里是屏蔽了这3个IP段连接服务器的tcp:80端口,有需要的话对应调整即可。