MPLS流量是数据中心和电信网络中常见的网络协议,基于标签完成数据包的路由。
去年,长亭推出了全新升级的新一代产品服务体系。
在众多底层技术中,你注意到这个名字了吗?
eBPF,作为近年来最火的内核新特征,堪称新一代技术“网红”。
在云原生的浪潮中,它经过不断升级迭代,已经能与新进的容器编排、容器网络技术完美融合。
新一代技术遇上新一代安全,会撞出什么火花?
看长亭雷池(SafeLine)下一代Web应用防火墙的三个实际应用。
#01
两天内
在WAF上实现负载均衡?
00
某大型商业银行的网络拓扑要求,在保证客户环境的特殊需求得前提下,WAF出向流量和入向流量需要走同一条链路。
01
经过深入发现,我们将需求定位为:正确地完成 “在不使用网络层路由能力的前提下,保证每个 TCP 流在数据链路层源进源出”。
而这通常是负载均衡的功能,WAF怎么在短时间内实现呢?
02
由于时间紧迫,我们不能造太大的轮子。
既然网络数据包的处理是 Linux 内核的能力, eBPF自然成了不二之选。
03
eBPF提供一个被共享的 MAP 缓存,记录每一个 TCP 流第一个 syn 包的源 MAC 。
于是方案变得非常清晰:
在 ingress 部分插入一个 eBPF 程序,负责记录 MAC,并分配一个 mark 给 conntrack
conntrack 为 TCP 流上每一个包打上对应 mark
在 egress 部分插入一个 eBPF 程序,根据 mark 从 MAP 缓存中找到对应的 MAC 地址,并赋值到数据包上
04
为了保证方案可以在客户生产环境稳定运行,我们搭建了一套类似环境并进行了稳定性与压力测试。eBPF 确实有着不错的性能,性能损耗完全在可接受范畴内。
#02
不改动网络架构的前提下
如何检测MPLS流量?
00
MPLS流量是数据中心和电信网络中常见的网络协议,基于标签完成数据包的路由。
01
客户采用透明代理模式串连在二层网络中,因此在代理之后不能改动原始流量的标签。
当时雷池(SafeLine)透明地部署在网络环境中,这种部署模式下,WAF不需要对现有三层网络做任何改造,非常便利,新的解决方案也不能让其复杂化。
02
解决方案变得比较清晰。
即 MPLS 流量进入 Linux 网络协议栈之前,移除报文中的 MPLS header ,这样进入 Linux 网络栈的流量就和普通的 IP 流量没有区别,WAF的透明代理模式就能继续工作。而在完成流量的检测后,报文的 MPLS header 添加回去,这样才能实现透明检测 ,不对原始流量做改动。
03
借助 XDP/eBPF,实现方案为对入向/出向流量的 MPLS 头的移除/添加操作。
同时我们还考虑了使用 tc-mpls 来完成标签的 pop/push 操作、开发一个简单的内核模块移除/添加 MPLS 的标签,但是两个方案存在技术缺陷和稳定性无法保障的问题,不再考虑。
04
为了验证方案可行性,我们快速搭建了一个 MPLS 流量验证环境。
经过多轮测试和调试,最终实现如下理想结果:
#03
透明代理模式下
主主会话有可能同步吗?
00
在某项目交付过程中,客户采用了透明代理模式,但同时又有双链路主-主模式的需求。
这让长亭研发小伙伴很犯愁。
雷池(SafeLine)现有机制中,同一会话链路上的所有包是不能有缺失的。
这种同一会话数据包跑在双链路的情况给透明代理模式带来了极大挑战。
01
先来简单看下透明代理主主的拓扑:
02
雷池(SafeLine)不能把会话直接分配给对端,但双链路的两台雷池(SafeLine)间有 HA 线互联,通过 HA 线互相分发数据包,就能实现完整会话代理。
于是想到了一种解决方案:我们可以利用 HA 状态下的对端设备,预先分配会话所在设备,然后再将对应的数据包分发到相应的设备上。
03
XDP/eBPF的重大特性,让方案落地。
XDP/eBPF 可以在内核分配 skb 之前就对数据包进行操作,那我们就可以在此处按 TCP 四元组计算出一个 Hash 值来确定当前这个会话的归属的,同时它还支持 redirect 将报文重定向到另外一个网口发出。
04
主要技术矛盾使用 eBPF 神器解决了,那接下来就是快速产品化。
响应时间从数月缩短到几周,甚至是几天。
这就是eBPF的魅力。
总体来说,eBPF 提供了强大的、针对内核协议栈的“魔改”能力,其稳定性、灵活性、高性能将使其成为新的网络安全的技术底座与核心引擎。
问题来了,如此好用的技术,所有WAF都可以使用吗?
eBPF:你是基于技术内核协议栈的WAF吗?
什么是基于内核协议栈的WAF?
传统WAF延续传统的流量网关设备的特点,采用高度定制化的操作系统内核,或者基于像DPDK这样的内核旁路方案,并使用自有的网络协议栈,限制了其网络适应能力。
基于内核协议栈的WAF则摒弃了L2、L3、L4层网络的相关逻辑,专注于L7层(应用层)的防护。这就意味着,WAF不依赖于任何特定硬件设备,能够在任何运行现代Linux操作系统的环境中的任意位置运行,无论是在云环境、私有数据中心还是边缘设备。
由于Web应用程序主要在L7层(应用层)进行数据传输和处理,因此基于内核协议栈的WAF可以心无旁骛的深入理解和分析HTTP请求与响应,制定更细粒度的安全策略,从而更准确地检测和阻止潜在的威胁。
同时由于其先进的架构理念与容器网络相同,此类WAF可以直接集成容器平台,如K8s,能与云环境和容器化架构无缝集成,实现云原生级别的安全防护。
区别于传统WAF需要将流量从云环境牵引到云内外特定区域做检测,完成之后再将流量回注到业务区,与云环境紧密集成的WAF可以在云内直接进行检测。更进一步的,与负载均衡或微服务框架集成之后,WAF甚至可以做到无需改变流量的传输路径,实现真正意义上的透明接入。
下一代 WAF 摆脱了硬件的限制,采用与Web应用相同的分布式架构,无论是多大规模的流量,都可以快速弹性扩缩容应对。
从稳定性角度,全球数亿 Linux 用户(包含服务器、桌面、移动端如 Android等)都是4 层以下网络协议栈的测试用户,下一代 WAF 只需要专注于 7 层网络功能的稳定性,所面临的挑战无疑要比从2到7层都需要自己实现的传统WAF小得多。
现代Linux内核协议栈拥有强大的可编程接口,下一代 WAF 能够根据特定需求对内核协议栈进行定制和扩展,从而灵活地适应不同类型网络环境与网络拓扑,并允许用户根据自身的需求来定义和实施安全策略。
内核协议栈在近些年来持续得到优化与提升,如多队列技术、零拷贝技术、新的异步 I/O 框架如 io_uring 等,再比如前文提到的eBPF,这些都使得内核的网络处理能力愈发强大。基于同样先进理念研发出的的下一代WAF则可以利用这些特性让自身能力飞跃式提升。