OVS(Open vSwitch)注包

OVS(Open vSwitch)注包,第1张

OVS注包的场景:

UCloud的 SDN 网络是基于OVS做的。为了进行内网监控,需要 测试 用户的两台云主机通信是否正常。但是,作为服务方我们是无法登陆到用户的云主机的。因此,采用了向源端的OVS中注入一个ping包的方法测试网络是否正常。

基本原理

实验环境示意图:实现不登陆进SRC VM的前提下,发送Ping的请求包给DST VM,并捕获返回的应答包Ping Response。

染色:

用户有可能自己也会发送Ping包,为了区分用户的应答包和注入方式得到的应答包,需要对注入的Ping Request进行染色。首先看下ICMP包的格式,如下所示。

黄色标记起来的Identifier字段含义如下(RFC 792)

The identifier and sequence number may be used by the echo sender to aid in matching the replies with the echo requests

通过设置Identifier的值,可以区分不同的请求对应的应答包。

这里我们设置Identifier=111,捕获数据包时,需要指定ICMP包 icmp[4:2]=111,表明ICMP的第四、第五个字节的值等于111.

注入Ping Request包

需要使用ovs-ofctl packet-out进行注包 *** 作,命令格式如下:

ovs-ofctl packet-out switch in_port actions packet...

说明:

1、packet-out:连接到OVS,并且让OVS对Packet执行某个Action

Connects  to  switch  and  instructs it to execute the OpenFlow actions on each packet

2、switch:交换机的名字,比如实验环境中的br0

3、in_port:SRC VM连接到OVS的端口号,就是实验环境示意图中的In Port

4、packet:数据包,实验中就是染了色的Ping Request数据包。

5、Action:关键是Action的选择,我们采用的是resubmit,说明如下。resubmit会找到数据包对应的流表,然后更换掉in_port并执行流表中的Action。我们这里设置port=in_port。所以仅仅会执行流表中的Action。

resubmit([port],[table]):Re-searches this OpenFlow flow table with thein_portfield replaced byportand executes the actions found

捕获Ping的Response包

采用tcpdump进行捕获染了色的Ping数据包。命令如下

tcpdump -c 1 -iVIRTUAL_INTERFACEicmp and src hostSRC_IPand dst hostDST_IPand icmp[4:2]=111

1. VIRTUAL_INTERFACE: 云主机使用虚拟网卡的名字

2. SRC_IP:源云主机的IP地址

3. DST_IP:目的云主机的IP地址

4. 111:染色标记

golang实现的主逻辑

injectICMPCmd=util.GetInjectICMPPacket(srcIp,dstIp,srcMac,dstMac)//构造染了色的Ping Request包,以及注入命令tcpDumpCmd=util.TcpDumpICMPCommand(iface,srcIp,dstIp)//构造tcpdump的抓包命令tcpDumpResponse:=make(chanstring)srcHostIp:="XXX"//宿主机的IP地址gofunc(){command:=fmt.Sprintf("ssh %s@%s %s","root",srcHostIp,tcpDumpCmd)util.SshRunWithChannelResponse(command,tcpDumpResponse)}()// inject Packet into OVStime.Sleep(100*time.Millisecond)gofunc(){command:=fmt.Sprintf("ssh %s@%s %s","root",srcHostIp,injectICMPCmd)util.SshRun(command)}()success:=trueselect{casemsg:=<-tcpDumpResponse:ifstrings.Contains(msg,dstIp){fmt.Printf("Checking Success, Response: %s\n",msg)}else{success=falsefmt.Printf("Checking Fail, Response: %s\n",msg)}}returnsuccess

ovs_version: "2.5.2"

[ ok ] Restarting networking (via systemctl): networking.service.

这时使用ifconfig可以看到br0已经自动获取到IP地址,内外网链接正常。

如果需要手动设置IP则执行以下命令

至此ovs安装与虚拟网桥均创建完成。

验证CPU是否支持硬件虚拟化

要跑 KVM 必需要确保你 Linux 系统所在的 CPU 是支持硬件虚拟化的,不然将无法正常使用。我们可以在终端中执行如下命令进行验证:

egrep "svm|vmx" /proc/cpuinfo

如果你的 CPU 支持,将可以看到类似如下的返回:

如果 vmx 选项不可用,请重启系统并到 BIOS 中启用硬件虚拟化。

为Ubuntu 15.04安装KVM

一旦确认了 CPU 支持并开启硬件虚拟化之后,我们便可以使用如下命令来为 Ubuntu 15.04 安装 KVM 及相关的依赖包:

sudo apt-get install qemu-kvm qemu virt-manager virt-viewer libvirt-bin bridge-utils

启用桥接网络

通常情况下,为了保证虚拟机与 Internet 的相互通信,我们需要在主机中启动网络桥接。为了保证不破坏原有的网络配置,我们先使用如下命令将网络配置文件进行备份:

sudo cp /etc/network/interfaces /etc/network/interfaces-bak

备份完成后,我们需要对 /etc/network/interfaces 配置文件进行更改,将如下信息追加到配置文件当中:

# Enabing Bridge networking br0 interfaceauto br0iface br0 inet staticaddress 192.168.1.70network 192.168.1.0netmask 255.255.255.0broadcast 192.168.1.255gateway 192.168.1.1dns-nameservers 223.5.5.5bridge_ports eth0bridge_stp off

以上信息请根据你自己的网络环境进行更改,不要照搬哦!

配置完成后需要重启一下,再使用如下命令验证网络桥接是否配置成功:

ifconfig

启动KVM虚拟系统管理器

在安装及配置完桥接网络后我们便可以使用如下命令打开 KVM 虚拟系统管理器:

sudo virt-manager

点击文件菜单下的 new virtual machine 即可创建新虚拟机了。

小结

KVM 已是业界被广泛采用的一种虚拟化技术,它非常简单和易用,稳定性也非常之高。而且使用 KVM 无需支付任何费用,我们可通过命令行或图形界面对其进行管理,在硬件设备支持的情况下,理论上可扩展无限虚拟机。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11293330.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存