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