应用场景
在安全监控和测试过程中,我们不可避免地会遇到这样的问题:需要部署大量基于镜像流量的安全设备,如IPS,流量异常、数据库审计、流量分析等,但镜像流量的端口数量有限,购买专业设备太贵。
针对这种情况,本文从Linux内核模块处理网络数据库包,解决上述问题。谢谢你在这里“白金PT”帮助。
架构设计
内核模块的过程相对简单,转发配置从用户状态提交给内核模块,如”eth1@eth2_eth1@eth3_eth1/eth4@eth5“,本段配置如下:
来自eth1复制流量eth2和eth3
来自eth1和eth4流量,聚合给eth5
MIRROR在核心模块中,只需要实现参数读取、配置分析、网卡判断(源、目的)。
实现算法和代码
参数输入
这个代码的功能是上面提到的“eth1@eth2_eth1@eth3_eth1/eth4@eth5“这样的参数,按照”_”分段提交给参数设置函数”option_setup”
参数设置
在这里,我们将获得参数”eth0@eth1”进一步拆分,分离源网卡eth0,目的网卡eth1,在核模块的整体变量中,有一个结构
”__read_mostly __u8 ethout_bits[MAX_OUT] ={0};“
可以理解,如果服务器有8张网卡,则每个网站将有一个8位的二进制数来表示其转发,例如eth0复制到eth1,那么ethout_bits[0]等于01万,以此类推,如果我想把它放在一边eth0复制到所有其他网卡,将是011111111。
同时,存储哪些网卡是镜像流量口,以防止多余的资源浪费。
__read_mostly__u8 ifindex_bits = 0;
Skb复制和转发包
当Linux收到一个内核skb结构数据包时,判断数据包是否在转发列表中,即网卡是否是镜像源。
然后我用了一个循环来遍历存储的转发目的网口。如果匹配,则使用它skb_clone通过函数复制数据包,然后通过dev_queue_xmit函数直接发送。
***清理skb_buff结构。
启动脚本
以下参数可用于便于调试和快速提交shell脚本:
实测效果
编译、填写参数并执行
执行sh sh.sh
Dmesg输出
镜像流量效果
这里可以看到流量统计由于网卡速率,时间差等,并不会100%一样,是正常的。
CPU占用
当流量达到时400M左右时,CPU占用率还是比较低的。
MIRROR.c源代码