XDP VNP虚拟以太网关(章节:一)
一、核心理念与概览
1.1 设计思想
本方案的核心设计思想是构建一个高性能的VNP虚拟网关,通过XDP(eXpress Data Path)技术在网卡驱动层实现数据包的快速处理,结合AF_XDP用户态程序实现灵活的网络策略控制。整个系统采用旁路由架构,无需修改客户端配置,通过智能流量分类和路由决策,实现流量的动态分流和优化。
1.2 结构设计
流量出口处理
AF_XDP用户态处理层
XDP数据平面层
物理网络层
用户态处理流水线
Action
XDP流量分类
标准以太网帧
MTU 1516字节
网关重定向/流量镜像
TCP豁免流量
需处理流量
加密隧道
NAT转换
VNP隧道
本地网络
本地服务
RIB_Lookup
提取五元组
查询路由规则
应用策略路由
返回路由决策
DNS_Check
端口53检测
DNS报文解析
域名匹配
分流决策
内网客户端
物理交换机
VNP网关网卡
XDP程序
内核态处理
数据包解析器
流量分类器
转发决策
XDP_PASS到内核
重定向到AF_XDP
AF_XDP应用层程序
协议深度解析
VNP隧道封装
本地转发处理
主动RST响应
数据包丢弃
物理网卡发送
重新注入内核
内核协议栈转发
内核TCP协议栈
远程VNP服务器
本地应用服务
二、XDP数据平面设计
2.1 XDP程序设计
XDP程序作为系统的第一层处理,运行在内核空间,直接挂载在网卡驱动之后。其主要职责是进行高速数据包过滤和初步分类,决定哪些数据包需要送入用户态处理,哪些可以直接交给内核协议栈处理。
2.1.1 数据包接收与预处理流程
最终转发决策
多层协议解析
预处理阶段
IPv6处理路径
IPv4深度处理
UDP快速处理
TCP智能处理
无效
有效
不匹配
其他
其他
是
否
是
否
是
否
TCP豁免流量
需用户态处理
异常流量
匹配
0x0800 IPv4
0x86DD IPv6
TCP 6
UDP 17
网卡接收数据帧
验证数据包有效性
有效性检查
丢弃数据包
解析以太网头部
目的MAC匹配检查
XDP_PASS
交给内核
提取以太网类型
协议类型判断
未知协议处理
解析IP头部
提取协议字段
传输层协议
其他协议处理
提取TCP头部
检查TCP标志位
TCP SYN包?
创建MAPS豁免项
查询MAPS豁免表
设置临时豁免
豁免命中?
更新时间戳
标记为需处理
提取UDP头部
目的端口53?
DNS特殊标记
常规UDP处理
设置高优先级
标准处理流程
解析基本头部
跳过扩展头部
直达传输层
类似IPv4处理
收集分类结果
决策逻辑
XDP_PASS到内核
XDP_REDIRECT到AF_XDP
数据包丢弃
内核协议栈
AF_XDP用户态
统计计数器
2.1.2 BPF MAPS设计
BPF MAPS是XDP程序与用户态程序之间数据交换的核心机制,也是连接状态跟踪的关键组件。本系统设计了多层次的MAPS结构,以支持不同类型的控制和管理需求。
BPF_MAPS_System
-Map maps_registry
+initialize_all_maps()
+cleanup_all_maps()
+sync_to_userspace()
TCP_Exemption_Map
+Map<FlowKey, ExemptionInfo> entries
+LRU淘汰策略
+超时清理机制
+insert_exemption(FlowKey, info)
+lookup_exemption(FlowKey) : ExemptionInfo
+remove_exemption(FlowKey)
+clean_expired_entries()
FlowKey
+u32 src_ip
+u32 dst_ip
+u16 src_port
+u16 dst_port
+u8 protocol
+u8 flags
+calculate_hash()
+equals(other)
ExemptionInfo
+u64 create_timestamp
+u64 last_update
+u32 ttl_seconds
+u8 exemption_type
+u32 packet_count
+u64 byte_count
Virtual_Gateway_Config
+u32 virtual_ip_address
+u8 virtual_mac[6]
+u32 mtu_size
+u8 operation_mode
+u32 max_connections
+update_config(new_config)
+get_current_config()
Statistics_Map
+PerCPU数组存储
+packets_processed
+packets_redirected
+packets_passed
+packets_dropped
+update_counter(counter_type, value)
+get_aggregated_stats()