这个问题真的困扰了很久,然后今天这么随便一试,貌似有了转机!
一、第一次尝试
过程复现如下:
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上,其它啥都不用配置,都默认
4、在虚拟机centOS里配置realtek ethernet这个网络的IP地址,192.168.1.101/24,很奇怪为啥叫realtek ethernet。关于为什么会出现realtek ethernet,好像是跟KVM或者QEMU有关系,后来我再用以上的方式添加网络,名字成了PCI ethernet!先不管了吧。
然后ifconfig看到以下景象:
ens9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> 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<link>
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抓包
ping 192.168.5.4 的结果,在veth4抓包
6、总结
虚拟机的ARP请求直接通过veth pair发送到宿主机了,就是这么回事