veth使用

Posted by 婷 on February 1, 2024 本文总阅读量

简介

主要描述veth网卡的使用,下一篇再分析veth网卡的驱动代码。veth网卡的特点,是成对出现的,一端连着内核网络协议栈,一端连着另一个veth网卡。从这个特点可知此网卡只用于本机通信。

过程

ip命令创建一对veth,然后查看

ip link add veth0 type veth peer name veth1
ip link show

image-20240130230738148

分别给网卡配置ip,并up网卡

ip addr add 192.168.1.1/24 dev veth0
ip addr add 192.168.1.2/24 dev veth1
ip link set veth0 up
ip link set veth1 up

image-20240130230929771

这时候用veth0ping另一端veth1,发现ping不通

ping 192.168.1.2 -I veth0

而且可以发现这两网卡的收发包数是相反的

image-20240130231359230

这时候各自网卡抓包查看

tcpdump -i veth0 -w veth0before.pcap &
tcpdump -i veth1 -w veth1before.pcap &

image-20240130231543946

打开veth0的抓包结果,可以看到veth0发送的arp请求无人回应

image-20240201214127780

veth1的抓包结果,跟veth0一模一样。不过veth1并没有回应这个arp请求。

image-20240201214337298

关掉反向过滤rp_filter,该模块会检查IP包是否符合要求,否则会过滤掉

打开accept_local,接受本机IP数据包

 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
 echo 1 > /proc/sys/net/ipv4/conf/veth0/accept_local
 echo 1 > /proc/sys/net/ipv4/conf/veth1/accept_local

image-20240130231918385

这个时候就能ping通了

image-20240130232207707

这个时候抓包看看

image-20240130232317213

tcpdump -i veth0 -w veth0after.pcap &
tcpdump -i veth1 -w veth1after.pcap &

veth0网卡抓到的包,只收到了veth1arp rely,但是并没有icmp echo

image-20240201220330958

而从veth1网卡抓到的包,竟然跟veth0的一模一样

image-20240201220300512

但是结果显示是ping得通的,那icmp rely的包从哪里来的?猜测是从lo网卡来的,对lo网卡进行抓包

tcpdump -i lo -w veth_and_lo.pcap &

image-20240130234916975

结果icmp rely真的就是lo网卡发出来的!!但是这里又解释不通为啥veth0能收到veth1发出的arp rely的包呢???

image-20240201220925286

如果把lo网卡down掉,那还能ping通吗,veth1会回复veth0网卡arp rely包吗?

先把网卡down

image-20240201225301488

然后ping,果然还是不通

image-20240201225531089

tcpdump -i veth0 -w veth0arp.pcap &

image-20240201225718793

分析抓包结果,可以看到arp rely还是有的,只是没有ping rely包了

image-20240201230651890

不是很理解,等下一篇分析下veth网卡驱动再看看。不过在网上查到一个博客,貌似在分析这个问题。

链接