Ubuntu下使用OvS实现路由功能
本文主要介绍在Ubuntu下安装配置OvS,实现相同网段和不同网段下两台虚拟机的互通。
1 虚拟机安装配置
本节主要介绍主机和虚拟机的安装配置,以及在主机上安装配置OvS。
1.1 主机配置
- 安装Ubuntu18.04作为主机系统,安装流程参见Window下安装Ubuntu系统。
- 使用
egrep -c '(vmx|svm)' /proc/cpuinfo
查看CPU是否支持虚拟化技术,如果输出的数值不是0,表示支持虚拟化。 - 使用
sudo apt install qemu-kvm virt-manager virtinst libvirt-clients bridge-utils libvirt-daemon-system -y
安装KVM和QEMU。 - 使用
uname -r
查看内核版本,下载相应的OvS版本。编写下述脚本,与OvS软件包放在一起,添加执行权限,执行脚本安装配置OvS。- 虚拟机下的Ubuntu系统在执行make命令时出现”/bin/bash: libtool: No such file or directory“。执行
make clean
清除编译文件,先使用命令./condigure
,执行make
进行编译,编译可以顺利完成。清除编译文件,再执行命令./condigure --with-linux=/lib/modules/$(uname -r)/build
,然后再进行编译,此时编译也能成功。 - 执行
modprobe openvswitch
安装的是Ubuntu系统自带的OvS驱动,而执行insmod datapath/linux/openvswitch.ko
安装的是自己编译的OvS驱动。 - 执行
sudo insmod datapath/linux/openvswitch.ko
时提示“insmod: ERROR: could not insert module datapath/linux/openvswitch.ko: Unknown symbol in module”。执行modinfo datapath/linux/openvswitch.ko
显示驱动信息,从depends一项可以看出openvswitch.ko依赖其它驱动,依次执行sudo modprobe nf_conntrack,modprobe tunnel16…
,然后再执行sudo insmod datapath/linux/openvswitch.ko
安装驱动,驱动安装成功。
- 虚拟机下的Ubuntu系统在执行make命令时出现”/bin/bash: libtool: No such file or directory“。执行
tar -zxvf ./openvswitch-2.17.5.tar.gz &&
cd openvswitch-2.17.5 &&
./configure --with-linux=/lib/modules/$(uname -r)/build &&
make &&
make install &&
make modules_install;
# /sbin/modprobe openvswitch &&
insmod datapath/linux/openvswitch.ko
/sbin/lsmod | grep openvswitch;
echo 'export PATH=$PATH:/usr/local/share/openvswitch/scripts' > /etc/profile.d/ovs.sh &&
source /etc/profile.d/ovs.sh &&
ovs-ctl start &&
echo "openvswitch is installed and started successfully" &&
ps -e | grep ovs
- 执行
ovs-vsctl add-br br0
添加网桥br0。 - 执行
ovs-vsctl add-port br0 vnet0 -- set interface vnet0 type=internal
和ovs-vsctl add-port br0 vnet1 -- set interface vnet1 type=internal
创建两个虚拟端口,并添加到网桥br0上。 - 执行
sudo gedit /etc/network/interfaces
编辑网络配置文件,添加下述内容,执行/etc/init.d/networking restart
重启网络。- 添加br0后无法连上网,可执行
ifconfig br0 down
禁用br0,在需要使用时执行ifconfig br0 up
启用br0。 - 修改br0的IP地址后重启网络发现IP地址并未改变,删除br0桥,重新创建br0桥后IP地址改变。
- 添加br0后无法连上网,可执行
auto br0
iface br0 inet static
address 10.159.11.1
network 255.255.255.0
dns-search ctler
bridge_stp off
brdige_fd 0
brdige_maxwait 0
1.2 虚拟机配置
- 执行
sudo virt-manager
打开虚拟机管理界面,按下述步骤安装虚拟机。- 点击“文件”→“新建虚拟机”→“本地安装介质”→“使用ISO镜像”,点击“浏览”,“本地浏览”选择Ubuntu镜像→设置内存和CPU→设置磁盘大小→设置虚拟机名称,选择网络为“主机设备 vnet0:macvtap”,存在提示“在多数配置中,macvtap不能为主机到客户机的网络通信工作”,不影响使用。
- 安装时出现“watchdog: BUG: soft lockup-CPU#0 stuck for 22s”的错误提示,更换一个Ubuntu镜像后问题解决。
- 按照提示安装Ubuntu虚拟机,在Installation type中选择Erase disk and install Ubuntu。
- 点击“编辑”→“虚拟机详情”,点击“查看”→“详情”可以查看虚拟机的详细设置,在NIC标签中可以查看和修改虚拟机的网络匹配,修改的内容会在主机的/etc/libvirt/qemu/ubuntu18.04.xml的<interface>中体现。
- 以同样的方式安装第二台虚拟机,网络选择为“主机设备 vnet1:macvtap”。
2 OvS路由功能测试
本节主要介绍使用OvS实现相同网段和不同网段下虚拟机间的通信,路由的相关知识查看网络基础知识。OvS设置的相关知识查看OvS介绍和OvS安装使用。
2.1 相同网段实现互通
虚拟机和物理机的网络配置如下图所示,两个虚拟机配置在同一网段,默认网关设置为10.159.11.1。
在流表匹配规则保持原始配置,即只有一条normal规则时,虚拟机1和2可以相互ping通。删除原始流表项,执行下述语句添加流表项,虚拟机之间仍可互通。
ovs-ofctl add-flow br0 arp,arp_tpa=10.159.11.21,actions=output:vnet0
ovs-ofctl add-flow br0 ip,nw_dst=10.159.11.21,actions=output:vnet0
ovs-ofctl add-flow br0 arp,arp_tpa=10.159.11.22,actions=output:vnet1
ovs-ofctl add-flow br0 ip,nw_dst=10.159.11.22,actions=output:vnet1
2.2 不同网段实现互通1
虚拟机和物理机的网络配置如下图所示,编辑/etc/network/interfaces文件,新增网桥br0的IP地址,并将虚拟机2的IP地址修改为10.159.12.22,默认网关改为10.159.12.1。
auto br0
iface br0 inet static
address 10.159.11.1
network 255.255.255.0
dns-search ctler
bridge_stp off
brdige_fd 0
brdige_maxwait 0
iface br0 inet static
address 10.159.12.1
network 255.255.255.0
在流表匹配规则保持原始配置,即只有一条normal规则时,虚拟机1和2可以相互ping通。删除原始流表项,执行下述语句添加流表项,虚拟机之间仍可互通。
ovs-ofctl add-flow br0 arp,arp_tpa=10.159.11.1,actions=normal
ovs-ofctl add-flow br0 ip,nw_dst=10.159.11.1,actions=normal
ovs-ofctl add-flow br0 arp,arp_tpa=10.159.11.21,actions=output:vnet0
ovs-ofctl add-flow br0 ip,nw_dst=10.159.11.21,actions=mod_dl_dst:52:54:00:20:2A:2E,output:vnet0
ovs-ofctl add-flow br0 arp,arp_tpa=10.159.12.1,actions=normal
ovs-ofctl add-flow br0 ip,nw_dst=10.159.12.1,actions=normal
ovs-ofctl add-flow br0 arp,arp_tpa=10.159.12.22,actions=output:vnet1
ovs-ofctl add-flow br0 ip,nw_dst=10.159.12.22,actions=mod_dl_dst:52:54:00:62:4E:21,output:vnet1
2.2 不同网段实现互通2
虚拟机和物理机的网络配置如下图所示,新建网桥br1,编辑/etc/network/interfaces文件,新增网桥br1,其IP地址为10.159.12.1。修改网桥br0和br1自带的端口br0和br1的类型为patch,并将端口br0和br1连接到一起,同时将虚拟机2连接到网桥br1的端口vnet1上。
auto br0
iface br0 inet static
address 10.159.11.1
network 255.255.255.0
dns-search ctler
bridge_stp off
brdige_fd 0
brdige_maxwait 0
auto br1
iface br1 inet static
address 10.159.12.1
network 255.255.255.0
dns-search ctler
bridge_stp off
brdige_fd 0
brdige_maxwait 0
在流表匹配规则保持原始配置,即只有一条normal规则时,虚拟机1和2可以相互ping通。删除原始流表项,执行下述语句添加流表项,虚拟机之间仍可互通。
ovs-ofctl add-flow br0 arp,arp_tpa=10.159.11.1,actions=normal
ovs-ofctl add-flow br0 ip,nw_dst=10.159.11.1,actions=normal
ovs-ofctl add-flow br0 arp,arp_tpa=10.159.11.21,actions=output:vnet0
ovs-ofctl add-flow br0 ip,nw_dst=10.159.11.21,actions=output:vnet0
ovs-ofctl add-flow br0 arp,arp_tpa=10.159.12.22,actions=output:br0
ovs-ofctl add-flow br0 ip,nw_dst=10.159.12.22,actions=output:br0
ovs-ofctl add-flow br1 arp,arp_tpa=10.159.12.1,actions=normal
ovs-ofctl add-flow br1 ip,nw_dst=10.159.12.1,actions=normal
ovs-ofctl add-flow br1 arp,arp_tpa=10.159.11.21,actions=output:br1
ovs-ofctl add-flow br1 ip,nw_dst=10.159.11.21,actions=output:br1
ovs-ofctl add-flow br1 arp,arp_tpa=10.159.12.22,actions=output:vnet1
ovs-ofctl add-flow br1 ip,nw_dst=10.159.12.22,actions=output:vnet1