我在实验室里有一个包含 4 台机器的测试装置:
- 2 台旧 P4 机器(t1、t2)
- 1 Xeon 5420 DP 2.5 GHz 8 GB RAM (t3) 英特尔 e1000
- 1 Xeon 5420 DP 2.5 GHz 8 GB RAM (t4) 英特尔 e1000
测试 Linux 防火墙的性能,因为在过去的几个月里我们遭受了多次 syn-flood 攻击。所有机器都运行 Ubuntu 12.04 64 位。t1、t2、t3 通过 1GB/s 交换机互连,t4 通过额外的接口连接到 t3。因此,t3 模拟防火墙,t4 是目标,t1、t2 扮演攻击者,通过数据包风暴(192.168.4.199 是 t4):
hping3 -I eth1 --rand-source --syn --flood 192.168.4.199 -p 80
t4 丢弃所有传入数据包以避免与网关混淆、t4 的性能问题等。我在 iptraf 中查看数据包统计信息。我已按如下方式配置防火墙 (t3):
- stock 3.2.0-31-generic #50-Ubuntu SMP 内核
- rhash_entries=33554432 作为内核参数
sysctl 如下:
net.ipv4.ip_forward = 1 net.ipv4.route.gc_elasticity = 2 net.ipv4.route.gc_timeout = 1 net.ipv4.route.gc_interval = 5 net.ipv4.route.gc_min_interval_ms = 500 net.ipv4.route.gc_thresh = 2000000 net.ipv4.route.max_size = 20000000
(我做了很多调整以使 t1+t2 发送尽可能多的数据包时 t3 保持运行)。
这些努力的结果有些奇怪:
- t1+t2 设法每秒发送大约 200k 个数据包。t4 在最佳情况下总共发送大约 200k 个数据包,因此一半的数据包丢失了。
- 尽管数据包正在流经控制台,但 t3 在控制台上几乎无法使用(软中断数量较多)
- 路由缓存垃圾收集器根本无法预测,在默认设置下,每秒的数据包数量非常少(<50k 数据包/秒)
- 激活有状态的 iptables 规则会使到达 t4 的数据包速率下降到大约 100k 数据包/秒,实际上会丢失超过 75% 的数据包
这是我主要关心的 - 使用两台旧的 P4 机器发送尽可能多的数据包 - 这意味着网络上的几乎每个人都应该能够做到这一点。
所以我的问题是:我是否忽略了配置或测试设置中的一些重要点?是否有其他方法可以构建防火墙系统,尤其是在 smp 系统上?
答案1
我将迁移到不再具有路由缓存的内核 >= 3.6。这应该可以解决您的部分问题。
答案2
您在 T3 上的日志设置如何?如果记录了所有丢弃的数据包,则磁盘 I/O 可能是原因。
由于这是一个测试环境,您可以尝试关闭 T3 日志记录进行测试。