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