雷池社区版-运营
发布于 IP属地浙江省

详解雷池支撑超大流量的秘密(2):透明桥篇

本文主要介绍了透明桥这一常见的部署方式。

透明桥是什么桥

WAF 即 Web 应用防火墙(Web Application Firewall),通过识别并防御如:「SQL 注入」、「XSS 跨站脚本」等常见Web攻击,过滤海量恶意访问,来保障网站的安全与可用性。透明桥是 WAF 的一种常见的部署模式,因其部署便捷、性能优异的特点而倍受用户的青睐。它到底是一座什么样的“桥”,这“桥”和“墙”又有怎样的关联呢?借毛泽东的《水调歌头·游泳》中的半阕词,点破这一层疑惑:

一桥飞架南北,天堑变通途

透明桥是以“二层网桥”的形式接入网络中,其一对网口分别连接客户端和服务器两个物理子网。未检测到攻击时,透明桥会将一侧网口收上来的数据包从另一侧网口转发出去。

更立西江石壁,截断巫山云雨

透明桥提取并解析网络中的 HTTP 报文后,随即会向攻击检测引擎发起检测请求,最终根据检测结果对包含攻击的 TCP 连接进行阻断。

神女应无恙,当惊世界殊

透明桥的高性能转发配合雷池先进的语义分析引擎,对照着 WAF 上网络转发和攻击检测两个核心模块,一“桥”一“墙”,相得益彰,守护着用户的网络安全。
图一(透明桥 pipeline)

透明桥的大流量密码

答案之一是 DPDK


摘录自 DPDK 官网,尽管支撑亿万级别的吞吐需要特定的场景限制,但也足以一窥其在网络数据包处理中高吞吐和低延迟的能力。

Some packet processing functions have been benchmarked up to hundreds million frames per second, using 64-byte packets with a PCIe NIC.

DPDK 并不是一个“开箱即用”的完整应用产品,而是一种专为高性能数据包转发提供的解决方案。基于这个层面,笔者归纳了 DPDK 的两个关键技术点:「用户态网卡驱动」和「面向硬件的优化」。

用户态网卡驱动

DPDK 的用户态驱动方式是绕过 Linux kernel 直接从用户空间访问网卡的。通过 DMA 将网卡收到的数据包传输到位于用户的缓冲区中,减少了中断和上下文切换。用户态应用程序直接以轮询的方式读取数据包,并在原地址上直接处理,省去了从内核向用户态拷贝数据包的性能消耗。

DPDK 官方最新版本给出 Intel i40e 网卡的单核性能测试数据,DPDK 处理一个包仅需要 30 多个时钟周期,而对比传统 Linux 内核则需要 2000-3000。

根据最近的一些研究资料,针对网络 IO 对 Linux kernel 做了大量优化后,吞吐也只能达到 DPDK 的 70% 左右。不过对比优化之前仅为 25% 的数据来看,kernel 确实是有很大的潜力,但优化的门槛对于大多数开发者来说还是相对较高,需要大量的研究试错和稳定性验证。从上手的难易程度来说,DPDK 还是对开发者更友好一些。

面向硬件的优化

除了绕过内核,DPDK 针对内存和 CPU 的一些使用限制和优化举措。DPDK提供了一套内存池接口,可以用来管理网卡收到数据包的内存获取和释放,减少内存的碎片。DPDK的内存管理提供给内存池从大页内存分配内存的接口,更大的页就代表着更少的页表,降低了内存地址转换过程中的「Cache miss」和「TLB miss」,从而提高了访问内存的速度。

通过 CPU 亲和性(CPU affinity),绑定网卡队列和处理转发的线程到固定的CPU核心,减少 CPU 任务切换的同时,提升了 CPU cache 的命中率。从而节省了调度的性能消耗,有效地提升了转发的效率。同时每个 CPU 核心分别对应着所接管网卡的一个接收队列和一个发送队列,数据包的转发在核与核之间相互独立,称为「IO 独占」。这样实现的好处是即便某个核阻塞了,不会影响其他核的正常转发。而且只要硬件允许,就可以线性地提升网络并发。

给多线程加点料

上文提到了透明桥和攻击检测引擎的紧密联系,指明透明桥还需要处理攻击检测引擎的上下游事务,如会话跟踪、协议解析等等。为了能提供百万,甚至千万并发的攻击检测防御,我们在多线程的基础加入了自研的轻量级协程。

stackful coroutine

有栈式协程的本质其实就是线程里的函数,其切换的机制也与线程和进程相差无几。某个协程阻塞后,保存调用栈和寄存器后挂起,主动把 CPU 让给别的协程。阻塞的协程等待条件满足后,发挥协程「中断可恢复特性」,在阻塞的地方唤醒并继续运行,如此既实现了线程内部的并发,也避免了用户态到内核态切换的开销。有栈式协程的优点是实现起来简单,从程序设计的角度看,和同步程序相差无几,而且不需要编译器和编程语言的特殊支持。

share nothing

「share nothing」 架构多用于分布式计算和数据库,我们这里借鉴了其 「功能分片」「避免资源竞争理念」。在多线程程序设计上,充分思考事务本身的可分割和可并行性,基本无需锁来保护资源。同一个线程的不同协程不会同时访问彼此的资源,同一协程不同阶段也不会访问彼此的资源。而且协程可以感知 CPU 核心,不同的线程间不会交换协程。通过这一设计理念,从根源上避免竞争。

不是秘密的秘密

偷偷讲一句:雷池的另一种常用的部署模式——「硬件流量镜像」,与 「透明桥」 的技术原理和软件架构是一样一样一样滴,almost。

结语

作为安全从业者,始终在探索和对抗中追求更高、更快、更强。这一切一切的终极目标,是为了能让用户 「不管风吹浪打,胜似闲庭信步」 般地使用网络,为了不让黑客越雷池半步!

参考:
https://talawah.io/blog/linux-kernel-vs-dpdk-http-performance-showdown/
http://core.dpdk.org/perf-reports/
http://db.cs.berkeley.edu/papers/hpts85-nothing.pdf
https://zhuanlan.zhihu.com/p/515093212

浏览 (829)
点赞 (2)
收藏
打赏
评论