XDP VNP虚拟以太网关(章节:三)
重点:关于重新注入内核
TCP SYN包
TCP后续包
UDP/ICMP
VNP返回流量
网卡接收
XDP程序
AF_XDP用户态
仅此一次!
查MAPS → XDP_PASS
内核协议栈处理
AF_XDP用户态
VNP帧封装
XDP_TX直接发送
仅SYN包需要重新注入内核
通过raw socket/tun/其它
内核TCP优化
高性能
XDP_TX直接发送
绕过内核
ZC/OC快速响应
后续TCP/IP报文走内核XDP高速通道
备注:基于AF_XDP技术原理,我们并不能通过它重新注入内核,因为它对外发帧时会绕过内核协议栈直通传递到网卡驱动,但可以采用 PF_RING、TUN/TAP、LIBPCAP、AF_PACKET_V3/4 等方式重新注入到内核。
四、自定义路由系统设计
4.1 RIB/FIB路由架构
本系统实现了一套完整的自定义路由系统,独立于操作系统内核路由表,为每个数据包提供灵活的路由决策能力。RIB(路由信息库)负责存储路由策略,FIB(转发信息库)负责快速查找和执行转发决策。
4.1.1 路由结构
路由决策
转发信息库FIB
路由信息库RIB
路由验证与执行
分层查询策略
是
否
是
否
是
否
不可达
可达
路由信息分发
路由变化检测
路由计算
转发表更新
缓存失效处理
工作线程通知
路由动作执行器
VNP隧道
本地网关
发送RST
直接丢弃
动作类型判断
路由动作
隧道封装
本地转发
RST响应
静默丢弃
多路径支持
等价多路径
非等价多路径
权重分配
健康检查
优化转发结构
IPv4前缀树
IPv6前缀树
端口映射表
协议状态表
动态路由学习
ARP表学习
路由跟踪学习
流量特征学习
性能反馈学习
策略路由系统
源地址策略
目的地址策略
协议类型策略
端口范围策略
时间策略
域名策略
静态路由配置
直连路由
静态路由条目
默认路由
黑洞路由
路由规则管理器
FIB管理器
异常处理表
数据包特征提取
快速路径查询
命中快速表?
返回路由结果
策略路由查询
策略匹配?
应用策略路由
常规路由查询
最长前缀匹配
路由存在?
返回最佳路由
默认路由处理
下一跳可达性
可达性状态
备选路由选择
路由信息同步
路由重新计算
4.2 NAT状态跟踪系统
本地转发流量需要NAT状态跟踪,以确保回程流量能够正确转发到原始客户端。本系统实现了完整的NAT状态机,支持TCP、UDP和ICMP协议的状态跟踪。
4.2.1 NAT状态跟踪流程

五、主动RST响应机制
5.1 RST响应触发条件
在某些情况下,系统需要主动发送TCP RST数据包来终止连接。这主要发生在以下场景:
- 路由策略拒绝:当路由决策决定拒绝某个连接时
- 资源分配失败:无法分配NAT资源或隧道资源时
- 安全策略拦截:连接违反安全策略规则时
- 连接状态异常:检测到异常连接状态时
5.2 RST响应生成流程
替代处理方式
连接状态清理
发送优化处理
发送路径选择
触发条件验证
RST数据包构造
是
否
是
否
否
直接发送
重新注入
内核发送
是
TCP头部设置
设置源/目的端口
设置序列号
设置RST标志
设置窗口大小
计算校验和
序列号计算
是
否
获取最后ACK号
有有效ACK?
使用ACK+1
使用当前序列号
需要发送RST的决策点
检查连接合法性
连接是否存在?
检查连接状态
无法发送RST
需要主动RST?
验证RST权限
其他处理方式
有权发送RST?
记录日志
获取原始数据包
提取连接信息
构造以太网头部
构造IP头部
查询路由策略
发送路径
通过原始套接字
通过XDP程序
通过内核协议栈
选择发送接口
设置发送优先级
批量发送优化
发送完成处理
更新连接状态表
移除NAT映射
释放资源
记录统计信息
完成处理
记录拒绝原因
更新计数器
可选的通知机制
六、单网卡架构下的流量处理
6.1 单网卡流量分离机制
在单网卡架构下,系统需要处理三种不同类型的流量:本地管理流量、VNP隧道流量和本地转发流量。通过智能的流量分类和转发机制,实现在单一物理接口上的流量分离。
流量路径总结
流量出口处理
AF_XDP用户态处理
XDP处理路径
流量入口处理
流量分类决策
管理流量
目的IP=网关IP
VNP隧道流量
本地客户端流量
TCP豁免流量
需处理流量
VNP隧道
本地转发
阻断连接
出站流量
VNP隧道流量
RST响应
管理响应
本地转发响应
VNP响应
连接终止
物理网卡接收流量
流量类型判断
内核协议栈处理
XDP程序处理
XDP程序处理
VNP流量识别
本地流量识别
流量决策
XDP_PASS到内核
XDP_REDIRECT到AF_XDP
用户态程序接收
DNS流量检测
常规流量处理
DNS分流决策
RIB路由查询
决策结果
隧道封装处理
本地NAT处理
RST响应处理
内核TCP协议栈
物理网卡发送队列
重新注入内核
直接发送RST
本地应用或转发
内核转发
物理网卡发送
物理网络
远程VNP服务器
原始客户端
内网客户端
内网客户端
VNP网关
客户端连接重置
6.2 本地转发流量处理机制
本地转发流量是指那些需要经过NAT转换后发送到本地物理网关的流量。这些流量不经过VNP隧道,直接使用本地运营商的网络出口。
6.2.1 本地转发处理流程
响应处理流程
内核转发流程
内核注入机制
头部重写处理
NAT映射管理
反向NAT转换
地址恢复
存在映射
原始套接字
netlink接口
虚拟设备
否
无映射
是
新映射创建
分配外部IP
分配外部端口
创建映射条目
初始化状态
记录映射信息
本地转发决策
提取五元组
查询NAT表
使用现有映射
修改源IP地址
修改源端口
更新IP校验和
更新传输层校验和
调整TTL值
选择注入接口
注入方式
通过raw socket
通过netlink
通过tun/tap
设置套接字选项
构造netlink消息
写入虚拟设备
路由查找
ARP解析
发送队列
物理网卡发送
等待响应
接收响应数据包
查询NAT映射表
映射存在?
丢弃数据包
修改目的IP
修改目的端口
更新校验和
通过AF_XDP发送
发送到原始客户端
记录丢弃原因
七、系统配置与管理
7.1 虚拟网关配置方案
系统支持两种虚拟网关配置模式,适应不同的部署环境和需求。
AF_XDP程序配置
XDP程序配置
配置模式选择
共享物理IP模式
独立虚拟IP模式
虚拟网关配置
部署模式
创建虚拟网络接口
配置虚拟IP地址
设置虚拟MAC地址
配置路由策略
客户端网关指向虚拟IP
复用物理接口IP
配置策略路由
基于端口分流
客户端网关指向物理IP
XDP程序加载
网卡绑定设置
混杂模式配置
MAPS初始化
流量规则加载
用户态程序启动
路由策略加载
DNS规则配置
隧道参数设置
启动工作线程
7.2 路由策略配置示例
系统通过配置文件定义路由策略,支持多种匹配条件和动作类型。
7.2.1 路由策略配置结构
路由策略配置:
├── 全局设置
│ ├── 默认动作: VNP隧道
│ ├── DNS默认策略: 本地解析
│ └── 日志级别: 信息
├── 域名规则
│ ├── 匹配模式: 后缀匹配
│ ├── 规则列表:
│ │ ├── *.github.com -> VNP隧道
│ │ ├── *.cloudflare.com -> VNP隧道
│ │ ├── *.cn -> 本地网关
│ │ └── *.local -> 本地网关
├── IP地址规则
│ ├── CIDR匹配
│ ├── 规则列表:
│ │ ├── 10.0.0.0/8 -> 本地网关
│ │ ├── 192.168.0.0/16 -> 本地网关
│ │ └── 0.0.0.0/0 -> VNP隧道
├── 端口规则
│ ├── 端口范围匹配
│ ├── 规则列表:
│ │ ├── 80,443 -> VNP隧道
│ │ └── 53 -> DNS特殊处理
└── 协议规则
├── 协议类型匹配
└── 规则列表:
├── TCP -> 智能处理
└── UDP -> 快速处理
八、总结
本方案设计了一个基于XDP技术的高性能VNP虚拟以太网关系统,预期可以实现在10G/25G网络环境下的线速处理能力。
重点:
-
XDP与AF_XDP协同处理:利用XDP实现内核态高速过滤,AF_XDP实现用户态灵活处理,平衡性能与功能需求。
-
TCP连接智能豁免:通过SYN包检测和MAPS状态跟踪,实现TCP连接的智能豁免机制,充分利用内核协议栈的TCP优化能力。
-
DNS智能分流:实现基于域名的DNS流量分流,支持CDN优化和访问控制,解决跨境网络访问的常见问题。
-
自定义路由系统:构建独立的RIB/FIB路由系统,实现灵活的路由策略控制,支持复杂的流量工程需求。
-
单网卡流量分离:在单一物理接口上实现管理流量、VNP流量和本地流量的智能分离和转发。
-
主动RST响应机制:在资源分配失败或策略拒绝时,能够主动发送TCP RST数据包,优雅地终止连接。