hello云胜

技术与生活

0%

veth pair对互相之间无法ping通

我们创建一对veth,然后配置ip

1
2
3
[root@t-middle01 ~]# ip link add veth0 type veth peer name veth1
[root@t-middle01 ~]# ifconfig veth0 1.2.3.100/24 up
[root@t-middle01 ~]# ifconfig veth1 1.2.3.200/24 up

![image-20231009093950110](D:\github\docs\云原生\k8s\基础原理\veth pair对互相之间无法ping通.assets\image-20231009093950110.png)

提两个问题?

  1. ping -I 1.2.3.100 1.2.3.200 能不能通?
  2. ping -I veth0 1.2.3.200能不能通?

我的测试结果

  1. ip ping能通
  2. veth0 不通

很困惑。看TCP dump抓包情况。对veth0、veth1、lo回环设备进行监听

ip ping的场景

![image-20231009102248195](D:\github\docs\云原生\k8s\基础原理\veth pair对互相之间无法ping通.assets\image-20231009102248195.png)

可以ping通

![image-20231009101851749](D:\github\docs\云原生\k8s\基础原理\veth pair对互相之间无法ping通.assets\image-20231009101851749-16968179323972.png)

veth0网卡没有任何流量

![image-20231009101932609](D:\github\docs\云原生\k8s\基础原理\veth pair对互相之间无法ping通.assets\image-20231009101932609.png)

veth1网卡也没有任何流量

![image-20231009102012730](D:\github\docs\云原生\k8s\基础原理\veth pair对互相之间无法ping通.assets\image-20231009102012730.png)

发现icmp的请求和响应包都是从lo回环设备上走的。

veth ping的情况

![image-20231009102226169](D:\github\docs\云原生\k8s\基础原理\veth pair对互相之间无法ping通.assets\image-20231009102226169.png)

ping不通

![image-20231009102321044](D:\github\docs\云原生\k8s\基础原理\veth pair对互相之间无法ping通.assets\image-20231009102321044-16968182017864.png)

veth0发起arp请求

因为veth0不知道1.2.3.200的MAC地址,于是,veth1广播了arp request

![image-20231009102404295](D:\github\docs\云原生\k8s\基础原理\veth pair对互相之间无法ping通.assets\image-20231009102404295.png)

veth1也发起arp请求,找1.2.3.200

这个有点奇怪。自己就是1.2.3.200。为什么不响应呢?

![image-20231009102436476](D:\github\docs\云原生\k8s\基础原理\veth pair对互相之间无法ping通.assets\image-20231009102436476.png)

lo回环设备返回1.2.3.200无法到达。

什么原因?为什么veth1不响应arp?

经多方查找,发现是系统内核中一些 ARP 相关的默认配置限制所导致的

当前的配置

![image-20231009111321587](D:\github\docs\云原生\k8s\基础原理\veth pair对互相之间无法ping通.assets\image-20231009111321587.png)

修改为

1
2
3
4
5
6
7
8
9
echo 1 > /proc/sys/net/ipv4/conf/veth1/accept_local

echo 1 > /proc/sys/net/ipv4/conf/veth0/accept_local

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter

echo 0 > /proc/sys/net/ipv4/conf/veth0/rp_filter

echo 0 > /proc/sys/net/ipv4/conf/veth1/rp_filter

再测试,还是不通

再次抓包。现在情况有些不同了。

![image-20231009112532003](D:\github\docs\云原生\k8s\基础原理\veth pair对互相之间无法ping通.assets\image-20231009112532003.png)

veth0的情况,看到发出了arp request。并且收到了arp reply。

![image-20231009113332433](D:\github\docs\云原生\k8s\基础原理\veth pair对互相之间无法ping通.assets\image-20231009113332433.png)

veth1收到了veth0的icmp request。但是没有发出icmp replay

![image-20231009112625377](D:\github\docs\云原生\k8s\基础原理\veth pair对互相之间无法ping通.assets\image-20231009112625377.png)

lo没收到icmp request,但是发出了icmp replay