iproute2 是用于检查和配置 Linux 内核网络栈的标准用户空间工具套件。该套件涵盖链路、地址、路由、邻居、隧道、流量控制、套接字、硬件卸载以及若干专用网络子系统。大多数命令通过 Netlink 消息与内核通信;它们并不实现转发数据包的数据平面。
该项目针对每个 Linux 内核版本发布一个对应版本。匹配的版本会公开同一代内核接口;如果不请求旧内核不支持的功能,较新版本的 iproute2 也可以配合较旧的内核运行。
Linux 用户空间网络管理的历史 #
Linux 网络管理以分层方式发展。底层工具修改正在运行的内核状态,而配置框架和守护进程决定哪些状态应当持久化以及何时应用这些状态。
| 时期 | 软件 | 角色和历史意义 |
|---|---|---|
| 1990 年代初 | 源自 BSD 的命令和 net-tools | ifconfig、route、arp 和 netstat 等独立命令成为管理链路、IPv4 地址、路由、邻居条目和统计信息的传统 Linux 接口。其接口高度依赖网络 ioctl 和 /proc,因此无法表示许多后续出现的内核功能。 |
| 1990 年代起 | 发行版网络脚本和 ifupdown | Debian 的 /etc/network/interfaces 等文件和特定于发行版的网络脚本在底层命令之上增加了持久化配置。ifup 和 ifdown 描述接口生命周期,但它们属于编排工具而非内核 API。 |
| 1990 年代末起 | iproute2 | Alexey Kuznetsov 在开发内核高级路由、流量控制和 RTnetlink 的同时创建了 iproute2。ip 统一了 ifconfig、route、arp 和 iptunnel 所公开的对象模型;ss 和 tc 则涵盖套接字检查和流量控制。Netlink 可扩展、基于消息的接口使该套件能够跟进新的内核功能。 |
| 2004 年起 | NetworkManager | NetworkManager 引入了一个长期运行的连接管理器,用于管理动态有线、Wi-Fi、移动网络和 VPN 连接。连接配置文件表达期望状态,而 nmcli、nmtui 和图形客户端负责控制守护进程。 |
| 2014 年起 | systemd-networkd | systemd 210 增加了一个面向启动时及持续管理链路的声明式网络管理器。.link、.netdev 和 .network 文件定义命名、虚拟设备、地址、路由及相关策略;networkctl 提供运行时检查和控制功能。 |
| 2016 年起 | Netplan 和其他配置前端 | Netplan 增加了一个 YAML 配置层,可为 NetworkManager 或 systemd-networkd 生成配置。此类前端统一策略,但不会替代所选的网络管理守护进程或其下层内核接口。 |
这些世代相互重叠,因为它们解决的问题不同。ip addr add 会立即修改运行中的内核,而 NetworkManager、systemd-networkd 或 ifupdown 管理持久化策略,并可能在之后替换该变更。除诊断或有意设置临时状态外,管理员应避免使用临时执行的 ip 命令修改由守护进程管理的接口。
数据包过滤也有独立的发展脉络:iptables 和 nft 配置的是 Netfilter,而不是 iproute2 管理的路由和链路对象。
ip 对象模型
#
ip 使用 ip [options] object command 形式。主要对象与内核网络概念对应:
| 对象 | 用途 |
|---|---|
link | 检查或配置网络设备和链路层属性 |
address | 管理 IPv4 和 IPv6 地址 |
route | 管理单播、多播和特殊路由 |
rule | 管理路由策略数据库规则 |
neighbour | 管理 ARP 和 IPv6 邻居发现条目 |
netns | 创建命名网络命名空间并在其中操作 |
tunnel, l2tp, macsec | 配置隧道和安全链路类型 |
xfrm | 管理 IPsec 状态和策略 |
nexthop | 管理可复用的下一跳对象和组 |
mptcp | 管理多路径 TCP 端点和限制 |
monitor | 流式输出 RTnetlink 状态变更 |
对象列表持续增长,因为 ip 是一个可执行文件背后的多个前端集合。ip help 列出顶层对象,ip object help 则说明已安装版本支持的命令。
iproute2 7.1.0 安装的可执行文件 #
上游发布归档包含源代码,而非预构建二进制文件。下表列出 iproute2 7.1.0 上游 make install 规则安装的每个命令名称;该版本是本文写作时的当前版本。发行版软件包可能会拆分、省略、移动或修补这些命令。
| 命令 | 用途 | 构建或安装说明 |
|---|---|---|
ip | 检查和配置链路、地址、邻居、路由、规则、命名空间、隧道及相关网络对象 | 核心命令 |
rtmon | 记录 RTnetlink 链路、地址、路由和邻居事件,以供后续检查 | 核心命令;ip monitor 提供功能重叠的交互式操作 |
routel | 以分栏格式输出路由表 | 安装的 Python 脚本 |
tc | 配置流量控制排队规则、类别、过滤器和动作 | 核心命令 |
bridge | 管理网桥链路、转发数据库、VLAN、多播数据库和网桥端口状态 | 核心命令 |
ss | 检查套接字、协议状态、所有者、队列、内存和诊断数据 | netstat 套接字报告功能的后继者 |
nstat | 报告内核 SNMP 和协议计数器,包括自上次调用以来的变化 | 核心统计命令 |
ifstat | 报告每个接口的数据包和字节计数器 | 核心统计命令 |
rtacct | 根据内核路由记账数据,按路由域分组报告流量计数器 | 核心统计命令 |
lnstat | 定期报告通过 /proc/net/stat 导出的选定计数器 | 通用统计命令 |
rtstat | 通过 lnstat 的兼容模式报告路由缓存统计信息 | 指向 lnstat 的符号链接 |
ctstat | 通过 lnstat 的兼容模式报告连接跟踪统计信息 | 指向 lnstat 的符号链接 |
arpd | 维护用户空间 ARP 缓存,并根据持久化数据库响应内核邻居请求 | 仅在 Berkeley DB 兼容头文件和库可用时构建 |
genl | 查询和调用 Generic Netlink 系列 | 核心命令;主要用于协议开发和诊断 |
tipc | 配置和检查透明进程间通信的承载、链路、节点、套接字和命名空间 | 在 libmnl 可用时构建 |
devlink | 配置和诊断设备级网络资源、端口、固件参数、健康报告器、陷阱和硬件速率 | 在 libmnl 可用时构建 |
rdma | 检查和配置 RDMA 设备、链路、资源、系统设置和统计信息 | 在 libmnl 可用时构建 |
dcb | 检查和配置数据中心桥接缓冲区、优先级、优先级流量控制、ETS 和应用映射 | 在 libmnl 可用时构建 |
vdpa | 管理 vDPA 管理设备和虚拟数据路径加速器设备 | 在 libmnl 可用时构建 |
netshaper | 检查和配置通过 Netlink 公开的硬件传输整形对象 | 在 libmnl 可用时构建 |
dpll | 检查、配置和监控用于网络时钟同步的数字锁相环设备和引脚 | 在 libmnl 可用时构建 |
源代码树中还会出现名为 maketable、normal、pareto 和 paretonormal 的程序,但构建过程仅使用它们生成 tc 分布表。安装目标复制其生成的数据,而不是这些主机工具,因此它们并非发布命令。
选择正确的层 #
- 使用 iproute2 进行即时检查、诊断、实验,以及更高层管理器未公开的底层配置。
- 当状态必须在重启后保留,并需要对设备生命周期事件作出一致响应时,使用 NetworkManager、
systemd-networkd、ifupdown或发行版配置层。 - 使用
nft进行数据包过滤和网络地址转换,因为这些操作属于 Netfilter。 - iproute2 用户空间只能编码构建时已知的功能,而运行中的内核只能接受其已实现的功能,因此应让 iproute2 文档与安装版本匹配。
评论
在 GitHub 上阅读或评论(发表评论需要登录)