数据安全与虚拟网卡的应用(三)

前言

墨迹了大半年,终于把这个玩意墨迹的差不多了。整体的结构跟当初设计的还是有一些偏差的,一部分原因是因为懒,另一部分原因是没人关注没动力,随便搞搞吧。(源码链接见文末)

目录

跟之前基本没有差异

root
  \_ comm: 一些简单的公共依赖:文件描述符的发送、通用协议头
  \_ config: 配置读取及管理
  \_ doc: 这里可能会找到一些文档
  \_ tun: 创建虚拟网卡的
  \_ tunnel: 创建并维护数据流隧道
  \_ utils: 封装的组件:dh群交换、libevents、无锁环形buf等
  \_ xxx: 协商主逻辑

交互过程

整个项目共创建2个进程,fire-xxx-manage与fire-tunnel-manage,交互过程如下:

数据安全与虚拟网卡的应用(三)_第1张图片

可以看到交互过程非常简单,整个两台网关设备通信共涉及4个进程:

1. xxx-manage先通过dh群密钥交换协商出share key,接下来的通信全部通过share key保护。

2. 下一步则是分支端向总部发起用户名/密码认证,用户名/密码是提前配置在总部的

3. 认证完成后,整个协商过程就结束了,xxx-manage会将当前的连接描述符直接发送给tunnel-manage,tunnel-manage会复用这个协商连接作为通信连接;同时将总部配置的网段添加到系统路由中,路由目的是tun口

4. tunnel-manage直接定时发送echo报文进行隧道保活

5. xxx-manage定时通过conn info获取tunnel-manage的连接状态,决定是否需要销毁/重建

6. tunnel-manage监听虚拟网卡,抓取收上来的报文,判断如果是tunnel-manage的感兴趣流,就将报文放入环形buf

7. tunnel-manage的消费者线程raw_consumer会不停的处理这些报文并发送到WAN口

8. 注册的WAN收包接口接口在read事件到来时会收取WAN口报文,并在处理后将报文发送至tun口

9. 当前由于数据通信只有一条连接,内核分发按会话五元组(源目的ip/port/proto)进行分发,该连接只能分发在一个核上,所以单隧道场景下会存在性能瓶颈,一个可行的优化方法就是单隧道多连接,按内部流量会话分发至多连接,这样内核也可以将不同的会话分发至不同的核上。

Thank You !

https://github.com/Fireplusplus/fire-engine-

你可能感兴趣的:(Linux,项目,C语言,网络)