假设http://FD.io VPP已经装好,并且可以用QEMU创建和启动 virtual machines。
参考官方实验:FD.io VPP with Virtual Machines
1. 简介
1.1 靶场拓扑介绍#
这个仿真靶场平台的实验,可以用一台物理服务器做实验,也可以跨越两台物理服务器作实验。
- 如果一台服务器作实验:可以把攻击机Kali Linux和预置漏洞的靶机Metasploitable运行在同一台服务器上。这台服务器并不需要有万兆光纤网卡,只需要用桥接模式的vpp软件交换机来连接两台虚拟机。
- 如果两台服务器做实验:可以一台运行攻击机Kali Linux,另外一台部署预置漏洞的靶机Metasploitable。两台服务器通过万兆光纤网卡连接,两台服务器上分别起桥接模式的VPP软件交换机。如下图所示,右边服务器上的VPP软件交换机启动了桥接模式,连接了万兆光纤物理网卡和虚拟网卡。
$ ping 192.168.100.3
64 bytes from 192.168.100.3: icmp_seq=492 ttl=64 time=0.104 ms
64 bytes from 192.168.100.3: icmp_seq=493 ttl=64 time=0.063 ms
...
1.2 KVM虚拟化简介#
KVM虚拟机(名称来自英语: Kernel-based Virtual Machine 的缩写,即基于内核的虚拟机),是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个虚拟机hypervisor。KVM由Quramnet公司于开发(2008年被 Red Hat 收购),从 Linux 2.6.20 起就作为模块被包含在 Linux 内核中。
KVM虚拟机需要宿主机的CPU能支持硬件虚拟化扩展(比如, Intel VT or AMD-V)。下面的命令可以校验宿主机cpu的硬件虚拟化支持。
egrep '(vmx|svm)' --color /proc/cpuinfo
如果输出结果不包含vmx 或者 svm 标志,这意味着宿主机CPU没有hardware virtualization支持。这样你就没法在宿主机上使用KVM。验证过宿主机cpu可以支持vmx或svm特性,下面才可以继续安装KVM。参考:How to use KVM from the command line on Debian or Ubuntu
参考资料:云计算与虚拟化技术发展编年史,以及虚拟化技术实现 — QEMU-KVM & Libvirt,以及虚拟化技术实现 — KVM 的 CPU 虚拟化。
2. 配置网卡
注意:要停止所有实验时,首先需要在QEMU界面里关掉所有虚拟机,然后再重启vpp软件交换机。
virsh list --all
virsh destroy Kali-Linux-2021.2-virtualbox-amd64
virsh destroy metasploitable-linux-2.0.0
virsh list --all
sudo vppctl "set interface l2 bridge VirtualEthernet0/0/0 0"
sudo vppctl "set interface l2 bridge VirtualEthernet0/0/1 0"
sudo vppctl "set interface l2 bridge TenGigabitEthernet86/0/0 0"
sudo vppctl "set interface l2 bridge host-vpp-out0 0"
sudo vppctl "create bridge-domain 100 del"
sudo vppctl "delete vhost-user VirtualEthernet0/0/0" #VPP删除vhost-user接口命令
sudo vppctl "delete vhost-user VirtualEthernet0/0/1" #VPP删除vhost-user接口命令
sudo rm /tmp/vm00.sock
sudo rm /tmp/vm01.sock
sudo vppctl "clear interfaces"
# 该命令会自动删除成对存在的两个虚拟网卡
sudo ip link delete dev vpp-host0
# 停止vpp服务
sudo service vpp stop
sudo ifconfig nic0 down
2.1 绑定物理网卡(如果服务器上有万兆网卡,想跨服务器作大型实验)#
先查看本地物理主机inspur1的光纤卡pcie地址
$ sudo lshw -class network -businfo
Bus info Device Class Description
========================================================
pci@0000:1a:00.0 eth0 network Ethernet Connection X722 for 1GbE
pci@0000:1a:00.1 eth1 network Ethernet Connection X722 for 1GbE
pci@0000:af:00.0 nic0 network Ethernet Controller XXV710 for 25Gb
pci@0000:af:00.1 nic1 network Ethernet Controller XXV710 for 25Gb
virbr0-nic network Ethernet interface
修改vpp启动配置文件,位置/etc/vpp/startup.conf
,把下面配置信息插入,目前只利用nic0到另外一台服务器的光纤连接,所以只配置nic0的信息。
dpdk {
socket-mem 1024 #更改每个套接字的大页面分配 默认值256
dev 0000:af:00.0{ #根据服务器上的光纤网卡的情况修改,我用的是X710网卡的第一个网口
name TenGigabitEthernet86/0/0
}
uio-driver vfio-pci ## dpdk driver for nic0
}
重新开启vpp,查看此时的网卡信息
sudo ifconfig nic0 down
sudo service vpp start
2.2 在VPP中创建虚拟网口,等待连接虚拟机#
Virtio networking (virtio-net)介绍:这是Linux KVM虚拟化方案中宿主机host和客户虚拟机guest之间的网络通信协议。下图展示了基于virtio虚拟网络的系统架构。可以看到宿主机的vhost和虚拟机guest之间建立了virtio网络连接。
在 vhost 的方案中,由于 vhost 实现在内核中,guest 与 vhost 的通信,相较于原生的 virtio 方式性能上有了一定程度的提升,从 guest 到 k