linux中vlan 设备,eth/ens设备,bridge设备,veth设备, tap设备,tun设备

在这里插入图片描述
在这里插入图片描述
命令:
ip addr add 3.3.3.5/24 dev brg-o
ip link add veth0 type veth peer name veth1
ip addr add 3.3.3.3/24 dev veth0
ip addr add 3.3.3.4/24 dev veth1
ip link set veth0 up
ip link set veth1 up
ip link set dev veth0 master brg-o
ip link set dev veth0 master brg-o
ip route add default via 192.168.122.1
ip addr del 3.3.3.5/24 dev brg-o
ip link set dev veth1 address 08:00:27:3b:0d:b9
ip addr del 3.3.3.5/24 dev brg-o
tcpdump -n -vv -i brg-o.20 -c 10 -ee -x -b arp

linux网络设备类型:
vlan 设备:俗称vlan if接口,注册内核,采用重定向到实际网卡,根据vlan在协议栈找vlan if接口。
eth/ens设备:实际网卡设备,对于PC等主机,报文从网卡进来,进入协议栈;协议栈发出去的报文经过网卡到外网。
bridge设备:俗称网桥设备与交换机同理,可以将vlan设备、eth/ens设备绑定到网桥,成为网桥的端口,因为网桥俗称二层转发功能,报文服从:源mac地址学习,目的mac地址转发。

tap是链路层的虚拟网络设备,等同于一个以太网设备,它可以收发第二层数据报文包,如以太网数据帧。Tap最常见的用途就是做为虚拟机的网卡,因为它和普通的物理网卡更加相近,也经常用作普通机器的虚拟网卡
tun是网络层的虚拟网络设备,可以收发第三层数据报文包,如IP封包,因此常用于一些点对点IP隧道,例如OpenVPN,IPSec等。
Veth端口简介:
Linux container 中用到一个叫做veth的东西,这是一种新的设备,专门为 container 所建。veth 从名字上来看是 Virtual ETHernet 的缩写,它的作用很简单,就是要把从一个 network namespace 发出的数据包转发到另一个 namespace。veth 设备是成对的,一个是 container 之中,另一个在 container 之外,即在真实机器上能看到的。
VETH设备总是成对出现,送到一端请求发送的数据总是从另一端以请求接受的形式出现。创建并配置正确后,向其一端输入数据,VETH会改变数据的方向并将其送入内核网络子系统,完成数据的注入,而在另一端则能读到此数据。(Namespace,其中往veth设备上任意一端上RX到的数据,都会在另一端上以TX的方式发送出去)veth工作在L2数据链路层,veth-pair设备在转发数据包过程中并不串改数据包内容

veth虚拟网络设备:当协议栈收到外面的arp请求时,不管是问3.3.3.3还是3.3.3.4,都会回复两个arp应答,分别包含brg-o和veth1的mac地址,也即Linux觉得外面发给3.3.3.3和3.3.3.4的数据包从brg-o和veth1进协议栈都一样,没有区别。由于回复了两个arp应答,而外面的设备只会用其中的一个,并且具体用哪个会随着时间发生变化,于是导致一个问题,就是外面回复给3.3.3.3的数据包可能从3.3.3.4的brg-o上进来,即通过3.3.3.3 ping外面时,可能在veth1抓不到回复包,而在brg-o上能抓到回复包。说明数据流在交换机那层没有完全的隔离开,brg-o和veth1会收到对方的IP应答包。为了解决上述问题,可以配置rp_filter, arp_filter, arp_ignore, arp_announce等参数,但不建议这么做,容易出错,调试比较麻烦。

路由表查找原则:最长掩码匹配匹配
路由表说明:

1、网关为0.0.0.0,从此接口出去的arp报文,请求的是目的IP的mac地址arp请求报文,而不是网关的arp请求报文。网关是0.0.0.0,意味着端口直连的网络属于二层网络。
2、目的是0.0.0.0,掩码0.0.0.0,根据掩码最长匹配规则,当在路由表中查找不到目的ip的路由表项时,转发规则服从此路由表项,arp请求的是网关的ip的mac地址映射。
3、报文上三层协议栈的核心前提条件:二层终结。
4、三层转发:ip头不变,二层头变化。
5、二层转发:mac头不变,vlan变化。
在这里插入图片描述

//Note: ping 虚拟网卡,icmp报文在linux内核协议栈的处理流程
veth0绑定brg-o, ping veth1 指定brg-o端口:

1、ping进程构造ICMP echo请求包,并通过socket发给协议栈,
2、由于ping程序指定了走veth0,并且本地ARP缓存里面已经有了相关记录,所以不用再发送ARP出去,协议栈就直接将该数据包交给了veth0
3、由于veth0的另一端连的是veth1,所以ICMP echo请求包就转发给了veth1
4、veth1收到ICMP echo请求包后,转交给另一端的协议栈
5、协议栈一看自己的设备列表,发现本地有192.168.2.1这个IP,于是构造ICMP echo应答包,准备返回
6、协议栈查看自己的路由表,发现回给192.168.2.11的数据包应该走lo口,于是将应答包交给lo设备
lo接到协议栈的应答包后,啥都没干,转手又把数据包还给了协议栈(相当于协议栈通过发送流程把数据包给lo,然后lo再将数据包交给协议栈的接收流程)
7、协议栈收到应答包后,发现有socket需要该包,于是交给了相应的socket
8、这个socket正好是ping进程创建的socket,于是ping进程收到了应答包

//ARP报文处理,arp属于二层报文
1、ping进程构造ICMP echo请求包,并通过socket发给协议栈,
2、协议栈根据目的IP地址和系统路由表,知道去3.3.3.4的数据包应该要由veth0口出去
3、由于是第一次访问3.3.3.4,且目的IP和本地IP在同一个网段,所以协议栈会先发送ARP出去,
询问3.3.3.4的mac地址
4、协议栈将ARP包交给veth0,让它发出去,由于veth0的另一端连的是veth1,所以ARP请求包就转发给了veth1
5、veth1收到ARP包后,转交给另一端的协议栈
在这里插入图片描述在这里插入图片描述

创建veth设备并配置ip地址
root@ubuntu:~# ip link add veth0 type veth peer name veth1 //veth0 与 veth1 直连
root@ubuntu:~# ip addr add 3.3.3.3/24 dev veth0
root@ubuntu:~# ip addr add 3.3.3.4/24 dev veth1
root@ubuntu:~# ifconfig veth0 up
root@ubuntu:~# ifconfig veth1 up
在这里插入图片描述

在这里插入图片描述
将对应设备设置为混杂模式, 否则会丢掉目的mac地址是veth的数据包
root@ubuntu:~/tcpdumpPkt# ifconfig veth0 promisc
root@ubuntu:~/tcpdumpPkt# ifconfig veth1 promisc
root@ubuntu:~/tcpdumpPkt# ifconfig brg-o promisc
在这里插入图片描述

当在内核创建的虚拟网络设备:
veth0 绑定在 brg-o网桥上:
1、二者mac地址相同,协议栈通过veth0发送报文,经过veth0的报文不能送到协议栈,导致单通。同时由于veth0未重定向到真是网卡,也不能反问外网。实现方式将实际网卡绑定到网桥既可。
2、可以理解为协议层的:软交换机
在这里插入图片描述

veth0绑定到网桥brg-o,删除veth0网卡ip地址,ping veth1通过ping -I brg-o 3.3.3.4 :
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

linux内核中协议栈网桥代码:
在这里插入图片描述

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>