Linux虚拟网络设备之veth

down 发表于: 2021-04-30   最后更新时间: 2022-12-05 23:49:17  
{{totalSubscript}} 订阅, 4,372 游览

VETH(Virtual Ethernet)

VETH(Virtual Ethernet)是Linux提供的另外一种特殊的网络设备,中文称为虚拟网卡接口。它总是成对出现,要创建就创建一个pair。一个Pair中的veth就像一个网络线缆的两个端点,数据从一个端点进入,必然从另外一个端点流出。每个veth都可以被赋予IP地址,并参与三层网络路由过程,可以实现不同netns之间网络通信。

veth

veth设备的特点

  • veth和其它的网络设备都一样,一端连接的是内核协议栈
  • veth设备是成对出现的,另一端两个设备彼此相连。
  • 一个设备收到协议栈的数据发送请求后,会将数据发送到另一个设备上去。

veth

veth创建与使用

# yum install -y iproute  ##确保安装iproute工具
$ ip netns add blue    #创建命令空间
$ ip link add veth-red type veth peer name veth-blue
$ ip link set veth-blue up netns blue
$ ip link set veth-red up
# 开启veth-red,赋予它IP地址192.168.15.1,子网掩码为255.255.255.0
$ ip addr add 192.168.15.1/24 dev veth-red
$ ip link set veth-red up
# 开启veth-blue,赋予它IP地址192.168.15.2,子网掩码为255.255.255.0
$ ip netns exec blue ip addr add 192.168.15.2/24 dev veth-blue
$ ip netns exec blue ip link set veth-blue up
# 查看命令空间blue的路由
$ ip netns exec blue route -n
# 互相ping通
$ ip netns exec red ping 192.168.15.2
# 查看arp表,发现blue的arp表中出现了red的ip地址以及MAC地址记录,相应的red的arp表中也出现了blue的记录。
$ ip netns exec blue arp

查看docker veth pair与网卡的对应关系

执行ip link命令查看veth的映射关系:

...
$ ip link
# 如下示例:
18: veth5971b02@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-6c2a98b60161 state UP mode DEFAULT group default
    link/ether ce:52:40:36:5d:1b brd ff:ff:ff:ff:ff:ff link-netnsid 2

通过该命令,看到18: veth5971b02@if17,代表当前网卡的id号18网卡接口(interface)id17相互映射;

在查看iflink文件

我们可以通过/sys/class/net/目录,看到当前网络命名空间所有逻辑网卡的路径;然后,通过查看各自路径下的iflink文件查看到对应网卡的id号;

# 当前默认网路空间中的网卡
$ ls /sys/class/net
br-6c2a98b60161  docker0  lo           veth5971b02  veth-red  virbr0-nic
br-8aa7231af266  ens33    veth079ec9b  veth6448963  virbr0
$ cat /sys/class/net/veth5971b02/iflink
18

这样就可以确定:nginx这个容器的eth0在物理机上对应的veth pair18: veth5971b02@if17

同时可以查询blue网络命名空间中的veth网卡id号:

$ ip netns exec blue ls /sys/class/net
lo  veth-blue
$ ip netns exec blue cat /sys/class/net/veth-blue/iflink
23
更新于 2022-12-05

查看Linux更多相关的文章或提一个关于Linux的问题,也可以与我们一起分享文章