看过我以前文章的同学都知道,经过之前的测试,发现windows的防火墙实现有点弱鸡。
在数据量较大的时候,大约是每条规则1100左右地址的时候,就无法用常规方式追加了,而且规则数量多了还会特别慢,慢到防火墙管理程序始终卡死无响应。
后来通过网友的指点,通过powershell确实可以一次性多追加几千条,但对powershell的版本有硬性要求,而且仍然会导致管理程序卡死。
所以,在windows平台要封锁大量ip的时候,并没有原生有效的途径。
最近我做了一个数据包过滤系统,解决了这个问题。
功能很简单,就是数据包过滤,通过协议、源地址、源端口、目标地址、目标端口的匹配情况来决定该数据包是否允许通行。
而对于有状态的连接(不限协议),会自动进行判断,后续数据包的判断会高效跳过。
系统在启动后会自动进行规则、地址列表的监控和热重载,而且是异步无损热重载,在重载期间并不会对现有数据包的匹配产生任何影响。
并且做了强力优化,对已建立的连接,则不再需要进行判断直接放行,所以性能上会高出许多个数量级。
并且,支持tcp、udp、icmp甚至是所有协议的连接状态哦。
虽然理论上只有tcp是有状态会话,但是我琢磨了不少思路,最终构成目前状态。
我比较在意程序的性能,特别是服务器程序,特别是这种底层程序。所以在我力所能及的范围内,性能已达极限。
没有进行过压测,根据ai评估的情况:
### 性能估算 在4核CPU环境下,假设连接跟踪命中率为80%(这是TCP连接的常见情况),系统性能估算如下: - 已建立连接的数据包 (占80%):约200纳秒/包 - 新连接数据包 (占20%):约1-2微秒/包(需要遍历规则和Radix树) 综合考虑这些因素,系统在4核CPU上每秒可过滤的数据包数量约为: 约30-50万数据包/秒 这个估算基于以下假设: 1. 1. 数据包大小适中,不包含异常大的载荷 2. 2. 系统有足够的内存(至少2GB)支持连接跟踪和IP地址树缓存 3. 3. 磁盘IO不是瓶颈(文件规则加载完成后主要在内存中操作) 4. 4. 4核CPU利用率达到70-80%
程序用rust编写,坚实可靠!
另外,这个系统设计的初衷是自己用的,所以可以直接从我的服务器实时接收最新下发的命令,来即时封锁恶意IP。
linux版本就简单多了,直接使用iptables就行了,所以linux系统上的版本只是用go语言做了个对接服务器的壳子,底层通过iptables处理的。
=======================================
一些备忘信息
我没有深究,但从现象来看,本系统注入的位置为系统防火墙之前,所以可以捕获到许多系统防火墙并不允许的包。
同时说明,本系统与操作系统的防火墙并不冲突,可以同时使用。
这两天进行了进一步优化以及逻辑调整,系统性能应该得到大幅提升。