KVM的虚拟机与宿主机通过veth pair直连

这个问题真的困扰了很久,然后今天这么随便一试,貌似有了转机!

一、第一次尝试

过程复现如下:
1、建立VM,装centOS,过程略
2、建立veth pair

ip link add veth0 type veth peer name veth-centOS
ifconfig veth0 192.168.1.100/24 up
ifconfig veth-centOS up

3、利用virt-manager给VM创建一个网卡,接到veth-centOS上,其它啥都不用配置,都默认


KVM的虚拟机与宿主机通过veth pair直连_第1张图片

4、在虚拟机centOS里配置realtek ethernet这个网络的IP地址,192.168.1.101/24,很奇怪为啥叫realtek ethernet。关于为什么会出现realtek ethernet,好像是跟KVM或者QEMU有关系,后来我再用以上的方式添加网络,名字成了PCI ethernet!先不管了吧。
然后ifconfig看到以下景象:

ens9: flags=4163  mtu 1500
      inet 192.168.1.101  netmask 255.255.255.0  broadcast 192.168.1.255
      inet6 fe80::5054:ff:fe8e:7046  prefixlen 64  scopeid 0x20
      ether 52:54:00:8e:70:46  txqueuelen 1000  (Ethernet)
      RX packets 4  bytes 260 (260.0 B)
      RX errors 0  dropped 0  overruns 0  frame 0
      TX packets 43  bytes 6135 (5.9 KiB)
      TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

为啥叫ens9!!很奇怪!!全都是问题!!!

5、接着奇迹发生了!ping 192.168.1.100!通了!结果如下:

PING 192.168.1.100 (192.168.1.100) 56(84) bytes of data.
64 bytes from 192.168.1.100: icmp_seq=1 ttl=64 time=4.60 ms
64 bytes from 192.168.1.100: icmp_seq=2 ttl=64 time=0.376 ms
64 bytes from 192.168.1.100: icmp_seq=3 ttl=64 time=2.35 ms
64 bytes from 192.168.1.100: icmp_seq=4 ttl=64 time=0.962 ms
^C
--- 192.168.1.100 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 0.376/2.075/4.607/1.629 ms

6、总结
为啥会这样?需要进一步研究,或许这只是表象,还有许多问题啊!

二、第二次尝试

然后,果然!出现问题了!!!
过程复现如下:
1、建立第二个虚拟机VM2,装的redhat
2、建立veth pair

ip link add veth-redhat type veth peer name redhat-veth
ifconfig veth-red 192.168.1.102/24 up
ifconfig cenOS-veth up

3、然后重复上面第一部分的相关操作,虚拟机ip设为192.168.1.103/24
4、在虚拟机redhat里ping 192.168.1.102,竟然不通!然后ping 192.168.1.100,也不通!好吧,我承认我的网络基础知识太差了,可我真的没法理解
5、接着,我又回到centOS里,ping 192.168.1.102,通了!无语。。这究竟是为啥?!

三、第三次尝试

为了阅读起来清晰,我决定把上面全部推翻再来!
过程复现如下:
1、创建3个VMs,分别安装centOS、redhat、ubuntu
2、创建3个veth pairs,配在不同的网段里,如下:

ip link add veth0 type veth peer name veth0-centOS
ip link add veth1 type veth peer name veth1-redhat
ip link add veth2 type veth peer name veth2-ubuntu
//这次把三个veth配在三个不通网段里!!!
ifconfig veth0 192.168.1.2/24 up
ifconfig veth1 192.168.2.2/24 up
ifconfig veth2 192.168.3.2/24 up
ifconfig veth0-centOS up
ifconfig veth1-redhat up
ifconfig veth2-ubuntu up

3、给VMs分别添加NIC,连接到VM对应的veth上,这次device model选virtio,貌似这样网速快
4、开始测试网络连通情况,结果如下
veth0←→centOS通
veth1←→redhat通
veth2←→ubuntu通
其他连接均无法ping通
这个结果还是比较满意的
5、总结
为什么要配在不同的网段里?想不通

四、第四次尝试

这次尝试和第三次尝试类似,只不过宿主机的veth不设置ip地址了,具体过程如下:
1、创建虚拟机过程就略过了
2、配置veth pairs

ip link add veth3 type veth peer name veth3-centOS
ip link add veth4 type veth peer name veth4-centOS
ifconfig veth3 up
ifconfig veth4 up
ifconfig veth3-centOS up
ifconfig veth4-centOS up

3、在虚拟机centOS里配置新加入的两个网卡的IP,分别设为192.168.4.3/24和192.168.5.3/24
4、在虚拟机中ping上面两个IP同网段的地址,例如192.168.4.5和192.168.5.4
5、在宿主机中利用wireshark抓包,看veth3、veth4的收包情况,截图如下。结果是,收到ARP包了。
ping 192.168.4.4 的结果,在veth3抓包


KVM的虚拟机与宿主机通过veth pair直连_第2张图片

ping 192.168.5.4 的结果,在veth4抓包


KVM的虚拟机与宿主机通过veth pair直连_第3张图片

6、总结
虚拟机的ARP请求直接通过veth pair发送到宿主机了,就是这么回事

你可能感兴趣的:(KVM的虚拟机与宿主机通过veth pair直连)