胡宇鸿 高鸿峰 韦旭勤 蒋源
摘要:为实现数据中心虚拟主机在IPv4/6混合使用情况下IPv4与IPv6主机间的数据交换,在开源虚拟交换机(OVS)中匹配确定的v4地址规则,增加数据包转换模块,完成内嵌IPv4的IPv6地址的地址转换和数据包转换,匹配确定的v6地址到预定v4地址的数据包转换。
关键词:开源虚拟交换机;IPv4/v6;流表
中图分类号:TP393.06 文献标识码:A 文章编号:1009-3044(2018)31-0036-02
随着云计算被越来越多用户接受,各类IT服务企业均大量建设和扩展数据中心,同时伴随着IPv4地址的耗尽,IPv6技术在新建或扩展数据中心时被越来越多地采用,但是实现IPv4/v6在数据中心的完全融合、平滑过渡,仍然需要逐步实现。当前虚拟化技术广泛地被应用到数据中心,虚拟交换机也越来越多地被用来通过标准接口和扩展编程实现服务器分布式管理和大规模网络自动化。
基于此本文讨论基于虚拟交换机环境下IPv4/v6的数据包转换技术,实现虚拟交换机环境下IPv4/v6主机间的数据交换。
1 虚拟交换机
OpenVswitch是Apache2.0许可下的开源多层虚拟交换机,可实现对数据包的接收、分析和处理,是网络虚拟化的重要组成部分,同时支持NetFlow、sFlow、SPAN、RSPAN等标准的管理接口和协议。通过与虚拟主机紧密结合能实现比物理交换机工作更高的工作效率,根据实际需求可同时虚拟出多个虚拟端口,与物理交换机相比具有更灵活、成本更低等优势[1]。
1.1 Linux内核数据包处理流程
常规情况下数据报文由驱动程序处理后从物理网卡获取数据,如数据报文目的不为本地,则根据路由信息从指定物理接口转发出去;如报文需本地处理则按照分层原则逐层分析,最后通过用户态与内核态接口将数据传送到用户态由上层应用继续处理[2]。
在OVS运行条件下,当数据包从物理网卡进入后,需依据OVS虚拟网桥中虚拟端口(vport)所绑定的物理网络接口信息决定报文是否经过vport进入OVS中,由OVS进行处理。
1.2 OVS组成及数据处理流程
OVS主要组成部件如图2,ovsdb提供数据库服务,存储虚拟交换机的配置信息,利用OVSDB协议与管理端、vswitchd交换信息。vswitchd是OVS的核心部件,通过openflow可與controller通信,使用OVSDB协议与ovsdb-server通信,通过netlink和内核模块通信,支持多个独立的datapath网桥,通过更改flow table实现绑定和VLAN等功能[1]。Datapath是OVS的内核模块,负责执行数据交换,把从接收端口收到的数据包在流表中进行匹配,并执行匹配到的动作。
2 OVS下IPv4/v6数据包转换
2.1 OVS接收数据处理过程
当虚拟交换机收到数据包,首先完成报文头的提取并计算key值,根据实际需求选择使用外部控制器管理或本地流表,虚拟交换机根据key值从第一个流表开始和流表项进行匹配,如果匹配成功,则更新计数器并根据流表中对应的action找到其对应的操作方法,完成相应的动作;匹配不成功,则执行默认的动作或回到Linux内核网络协议栈中继续处理。详细代码处理过程如图3[2]。
ovs_vport_receive_packets()接收到数据包后skb生成key值,如果出错则调用ovs_dp_process_packet交付给datapath处理。正确则利用ovs_flow_tbl_lookup_stats()基于key值进行流表查找,返回匹配的流表项;若不存在匹配,则调用ovs_dp_upcall上传至用户空间进行匹配。匹配成功,则调用ovs_execute_actions执行对应的操作。
2.2 IPv4/v6的地址转换
在本次实现中,当v4地址转换为v6地址时采用内嵌IPv4的IPv6地址方案实现v4地址到v6地址的转换[3]。根据预先设定的目标v6子网的方式选择一个特定的/64前缀,然后加上4个设置为0的8位组构成/96特定网络前缀,/96位的网络前缀加上32位的v4地址构成完整的v6地址。
当v6地址转换为v4地址时,因为v6地址的空间远远大于v4地址空间,本次实验中采用预指定的方式构成v6地址到v4地址的对应。
数据包协议头转换如表1、表2[4]。
2.3 OVS中转换过程的实现过程
目前OVS最新版本支持IPv4和IPv6基本功能,但是并未提供v4/v6数据包转换的功能。根据OVS数据包接收处理流程,根据需要在匹配流标后转到指定的action执行对应操作。
定义v4conv6和v6conv4的action。
/* OpenFlow 1.2, 1.3, and 1.4 actions. */
static conststruct ofpact_map of12[] { OFPACT_HANDLE_V4TOV6, 30 },
static conststruct ofpact_map of12[] { OFPACT_HANDLE_V6TOV4, 32 },
添加raw action type
enum ofp_raw_action_type {
……
/* OF1.2-1.4(28): void. */
OFPAT_RAW12_HANDLE_V4TOV6,
OFPAT_RAW12_HANDLE_V6TOV4,
……
}
添加HANDLE_V4TOV6的action的处理函数。
Static enum ofperr decode_OFPAT_RAW12_ HANDLE_V4 TOV6(struct ofpbuf *out)
static void encode_HANDLE_EXAMPLE (conststruct ofpact_null *null OVS_UNUSED, enum ofp_version ofp_version, struct ofpbuf *out)
static char *OVS_WARN_UNUSED_RESULT parse_ HANDLE_V4TOV6(char *arg OVS_UNUSED, struct ofpbuf *ofpacts, enum ofputil_protocol *usable_protocols OVS_UNUSED)
static void format_HANDLE_V4TOV6 (conststruct ofpact_null *a OVS_UNUSED, struct ds *s)
convert_IPV4_V6_addr具体实现
static void convert_IPV4_V6_addr(struct sk_buff *skb,__be32 s_ipv6[4],__be32 d_ipv6[4])
{
//按2.2中所述完成IPv4到IPv6报文头转换;
}
类似添加HANDLE_V6TOV4的action的处理函数。
static void convert_IPV4_V6_addr(struct sk_buff *skb,__be32 s_ipv4,__be32 d_ipv4)
{
//按2.2中所述完成IPv6到IPv4報文头转换;
}
3 结语
本文通过在OVS中实现IPv4和IPv6数据包转换,为OVS与控制器结合对v4/v6数据包的灵活传输、处理及应用做好准备。
参考文献:
[1] A Linux Foundation Collaborative Project Open vSwitch Documentation [EB/OL]. http://docs.openvswitch.org/en/latest/, 2016.
[2] 张若晨. 基于OpenvSwitch的代理虚拟交换机在SDN网络中的实现与应用[D]. 广州: 华南理工大学软件学院, 2016: 17-22.
[3] BAO C, HUITEMA C, BAGNULO M, et al.IPv6 addressing of IPv4/IPv6 translators[S]. RFC 6052, 2010.
[4] LI X, BAO C, BAKER F. IP/ICMP translation algorithm[S]. RFC 6145, 2011.