查看容器内的eth0网卡对应宿主机上的哪块网卡
- 问题描述
- 解决办法
- 1. 进入容器,查看网卡的`iflink(接口链路索引)`值
- 方法1:
- 方法2:
- 2. 从`宿主机`过滤查询到的`iflink(接口链路索引)`值
- 3. 确定veth接口连接的网桥
- 方法2: brctl查看连接到网桥的接口--推荐
- 4. 查看网桥连接的物理网卡
问题描述
查看容器内的eth0网卡对应宿主机上的哪块网卡,后面用来抓包指定网卡排查问题
解决办法
- 思路总结:
查找流程是veth
->网桥
->物理网卡
。
核心是找到 veth 接口
所属的 master 网桥
,然后看这个网桥上连接了哪些非 veth 的接口
。
-
参考:
https://medium.com/@noosphere00/%E5%A6%82%E4%BD%95%E7%AE%A1%E7%90%86linux%E8%AE%BE%E5%A4%87%E4%B8%8A%E7%9A%84bridge-%E7%BD%91%E6%A1%A5-%E5%92%8Cdocker-bridge-e6304a748f41 -
小工具:
dockerveth
能显示docker 容器
连接到服务器
上的哪些veth
接口。
dockerveth
项目: https://github.com/micahculpepper/dockerveth
1. 进入容器,查看网卡的iflink(接口链路索引)
值
方法1:
# 进入容器
docker exec -ti 容器id bash
# 查看接口索引(ifindex)值
cat /sys/class/net/eth0/ifindex
接口索引(ifindex)值是46360
# 查看iflink(接口链路索引)值
cat /sys/class/net/eth0/iflink
方法2:
# 进入容器
docker exec -ti 容器id bash
# 查看容器ip
ip a
# 记录下网卡后面的值
46360: eth0
是eth0
在容器内的接口索引(ifindex)
。@if46361
这部分是关键。if46361
表示这个eth0
接口在宿主机上的 **对等接口(peer interface)**的接口索引(ifindex)是46361
。
2. 从宿主机
过滤查询到的iflink(接口链路索引)
值
在宿主机
上查找 索引为46361
的接口:
ip a |grep -i 46361
# 或者更精确地查找对等接口
ip link|grep -i 46361
输出会显示宿主机
上接口索引为 46361
的网络接口信息,得到**veth**
开头的接口名;
这里的veth88e1268@if46360
就是宿主机上与容器内 eth0
相对应的 veth 接口
。@if46361
也反过来确认了它在容器内的对等接口索引
是 46361
。
3. 确定veth接口连接的网桥
# 显示系统中所有*网络接口*(链路层设备)的信息。
## - 'link' 指定操作对象是网络接口(链路层)。
## 输出内容包括接口的索引号、名称(如 lo, eth0, wlan0)、状态(UP/DOWN/UNKNOWN)、链路层地址(MAC 地址)、MTU(最大传输单元)等。
ip link show veth88e1268@if46360
这里的 master docker0
表明 vethabcdef
连接到了名为 docker0
的网桥
。
方法2: brctl查看连接到网桥的接口–推荐
# 安装brctl
dnf install bridge-utils -y
# 列出系统上所有的网桥以及连接到它们的接口
brctl show |grep -i veth88e1268
4. 查看网桥连接的物理网卡
# 列出系统上所有的网桥以及连接到它们的接口
brctl show docker0