看过我以前文章的同学都知道,经过之前的测试,发现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处理的。

 

=======================================

一些备忘信息

我没有深究,但从现象来看,本系统注入的位置为系统防火墙之前,所以可以捕获到许多系统防火墙并不允许的包。

同时说明,本系统与操作系统的防火墙并不冲突,可以同时使用。

这两天进行了进一步优化以及逻辑调整,系统性能应该得到大幅提升。

作者 听涛

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注