waf

iptables工作在主机层面,对于进出的网络或者主机的数据报文,根据事先设定好的检查规则对其检查,并作出相应的处理。

iptables实现waf

iptables拦截ip

# 拦截ip
iptables -A INPUT -p tcp --dport 80 -s 192.168.199.1 -j DROP

# 删除拦截
iptables -D INPUT -p tcp --dport 80 -s 192.168.199.1 -j DROP

利用ipset进行批量IP拦截

# 创建ip集
ipset create bloodzer0 hash:ip

# 查看ip集
ipset list

# 添加成员
ipset add bloodzer0 ip

# 删除成员
ipset del bloodzer0 ip

# 将ipset保存为文件
ipset save bloodzer0 -f bloodzer0.txt

# iptables与ipset结合
iptables -A INPUT -m set --match-set bloodzer0 src -p tcp --dport 80  -j DROP 

问题思考

iptables封禁IP,是封禁的直连IP,也就是直接与服务器通信的IP。但是我们一般的网络架构是:CDN--SLB--Server或者CDN--Server,这个时候我们使用上面的方式就失效了,所以我们采用新的方式:根据XFF来封禁IP。

根据XFF+iptables封禁IP

iptables -A INPUT -p tcp --dport 80 -m string --algo kmp --string "X-Forwarded-For: IP" -j DROP

备注:XFF很好伪造绕过。

踩坑记

XFF+iptables实现waf性能瓶颈

这种方式就不能使用ipset,所以如果是业务量很大的时候,不建议采用这种方式,因为一个IP一条规则,而iptables会针对INPUT每一个数据包进行解析判断。

我测试过一台2核16G的服务器,在规则数量达到2300+的时候,QPS稍微一大,服务器CPU容易飙到90%以上。

参考资料

最后更新于

这有帮助吗?