以任务为中心的 iproute2 用户指南

Hacker News Top 工具

摘要

一本以任务为中心的 iproute2 指南,iproute2 是 Linux 网络工具包,涵盖 ip、bridge 和 ss 命令及实际使用示例。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/07/25 17:10

# 以任务为中心的 iproute2 用户指南 来源:https://baturin.org/docs/iproute2/ ## \# (https://baturin.org/docs/iproute2/#overview-of-iproute2)iproute2 概述 iproute2 (https://wiki.linuxfoundation.org/networking/iproute2) 是 Linux 网络工具包,取代了传统的工具(如 `ifconfig`、`vconfig`、`brctl`、`route`、`arp` 等)。这些旧工具仅为了与旧脚本兼容而保留,无法访问 Linux 内核许多较新的网络功能。它最初由 Alex Kuznetsov 编写,现在由 Stephen Hemminger 维护。大部分网络功能统一在 `ip` 命令中。此外还有用于管理流量策略(QoS)的 `tc`、用于管理软件桥接接口的 `bridge`,以及 `ss`(`netstat` 的替代品)。这些命令通常包含在名为 `iproute2` 或 `iproute` 的软件包中。如今大多数 Linux 发行版默认安装它。`ip` 命令有时安装在 `/sbin` 目录下,因此默认情况下非特权用户的 `$PATH` 中可能不包含它。 ## \# (https://baturin.org/docs/iproute2/#about-this-document)关于本文档 历史上,文档一直是 iproute2 的薄弱环节。官方手册页列出了可用选项,但几乎没有提供任何使用示例。这一需求由第三方文档来满足。本文档旨在为 `ip` 和 `bridge` 命令提供一份全面且易于使用的指南,并包含一些关于 `ss` 的信息。以这种风格文档化 `tc` 将是一个独立的大型项目。本文档是**以任务为中心**的:它告诉你如何使用 iproute2 命令完成不同的任务,而不是列出可用的子命令。 ## \# (https://baturin.org/docs/iproute2/#contributing)贡献 本文档由 Daniil Baturin (https://www.baturin.org/) 维护,并根据 CC-BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0/) 协议发布——这是一个强 Copyleft、自由文化的许可协议。欢迎贡献;你可以找到源文件于 github.com/dmbaturin/iproute2-cheatsheet (https://github.com/dmbaturin/iproute2-cheatsheet)。 `` git clone https://github.com/dmbaturin/iproute2-cheatsheet.git `` 你也可以通过购买维护者一杯隐喻的咖啡 (https://www.buymeacoffee.com/dmbaturin) 来表达支持。 本文档按“原样”提供,不附带任何保证。作者对因使用本文档而造成的任何损害不承担任何责任。照常,输入前请三思,按回车键前再仔细考虑。 ## \# (https://baturin.org/docs/iproute2/#typographic-conventions)排版约定 元语法变量采用类似 Shell 的语法编写:`$\{something\}`。可选命令部分放在方括号中。必需参数放在尖括号中。 ## \# (https://baturin.org/docs/iproute2/#general-notes)一般说明 所有更改设置的命令都需要 root 权限。仅显示信息的命令通常不需要特殊权限。 配置文件位于 `/etc/iproute2` 中,主要用于为网络栈实体(如路由表)分配符号名称。每次运行 `ip` 命令时都会重新读取这些文件,因此无需执行任何操作即可应用更改。 ## \# (https://baturin.org/docs/iproute2/#abbreviating-commands)命令缩写 任何 `ip` 命令都可以缩写。例如,`ip address add 192.0.2.1/24 dev eth0` 可以写成 `ip addr a 192.0.2.1/24 dev eth0`,甚至 `ip a a 192.0.2.1/24 dev eth0`。在某些情况下,你甚至可以省略单词。例如,`show` 和 `list` 单词始终可以省略:`ip address` 等同于 `ip address show` 和 `ip address list`。 请注意,缩写系统并不总是一致的。`ip a a 192.0.2.1/24 dev eth0` 中的 `dev` 关键字不能缩写,尽管其他每个单词都可以。本文档故意给出所有命令的完整形式,以便于阅读。在脚本中也最好使用完整形式,因为读者可能不熟悉缩写,并且代码被阅读的频率远高于编写频率。 ## \# (https://baturin.org/docs/iproute2/#scripting-considerations)脚本编写考虑 对于发行版移除 `ifconfig` 的常见抱怨是它迫使人们重写脚本。然而,iproute2 更适合脚本编写,因为它支持机器可读的输出。它提供以下输出选项: `-o` (`--oneline`):将每个换行符替换为反斜杠。自早期版本起支持。 `-br` (`--brief`):生成简洁、面向机器的输出。非常适合用 awk/cut 解析。至少从 4.11 版本开始支持。 `-j` (`--json`):生成 JSON 输出,非常适合非 Shell 脚本。支持 `--pretty` 和 `--brief` 选项。至少从 4.13 版本开始支持。 以下是输出的比较(为节省空间省略了 `--json --pretty` 和 `--json --brief`): `` $ ip --oneline address show lo 1: lo inet 127.0.0.1/8 scope host lo\ valid_lft forever preferred_lft forever 1: lo inet6 ::1/128 scope host \ valid_lft forever preferred_lft forever $ ip --brief address show lo lo UNKNOWN 127.0.0.1/8 ::1/128 $ ip --json --brief address show lo [{"ifname": "lo", "operstate": "UNKNOWN", "addr_info": [{"local": "127.0.0.1", "prefixlen": 8},{"local": "::1", "prefixlen": 128}]}, {}, {}] `` ## \# (https://baturin.org/docs/iproute2/#ip-address)IPv4 和 IPv6 地址 --- iproute2 接受点分十进制掩码和前缀长度值。也就是说,`192.0.2.10/24` 和 `192.0.2.10/255.255.255.0` 都是可接受的格式。 ### \# (https://baturin.org/docs/iproute2/#ip-address-show)显示所有地址 `` ip address show `` 所有 show 命令都可以与 `-4` 或 `-6` 选项一起使用,以仅显示 IPv4 或 IPv6 地址。 ### \# (https://baturin.org/docs/iproute2/#ip-address-show-dev)显示单个接口的地址 `` ip address show ${接口名称} `` 示例: `` ip address show eth0 `` ### \# (https://baturin.org/docs/iproute2/#ip-address-show-up)仅显示运行中的接口的地址 `` ip address show up `` ### \# (https://baturin.org/docs/iproute2/#ip-address-show-permanent-dynamic)仅显示静态或动态 IPv6 地址 仅显示静态配置的地址: `` ip address show [dev ${接口}] permanent `` 仅显示通过自动配置获取的地址: `` ip address show [dev ${接口}] dynamic `` ### \# (https://baturin.org/docs/iproute2/#ip-address-add)向接口添加地址 `` ip address add ${地址}/${掩码} dev ${接口名称} `` 示例: `` ip address add 192.0.2.10/27 dev eth0 ip address add 2001:db8:1::/48 dev tun10 `` 你可以添加任意多个地址。如果添加多个地址,你的机器将接受发往所有这些地址的数据包。你添加的第一个地址将成为“主地址”。接口的主地址默认用作外出数据包的源地址。你设置的所有附加地址将成为辅助地址。 ### \# (https://baturin.org/docs/iproute2/#ip-address-add-label)添加带有可读描述的地址 `` ip address add ${地址}/${掩码} dev ${接口名称} label ${接口名称}:${描述} `` 示例: `` ip address add 192.0.2.1/24 dev eth0 label eth0:WANaddress `` 标签必须以接口名称开头,后跟冒号,这是由于一些向后兼容性问题,否则你会收到错误。标签长度保持少于 16 个字符,否则你会收到此错误:`RTNETLINK answers: Numerical result out of range`。 #### 注意事项 对于 IPv6 地址,此命令无效。它会正确添加地址但会忽略标签。 ### \# (https://baturin.org/docs/iproute2/#ip-address-delete)从接口删除地址 `` ip address delete ${地址}/${前缀} dev ${接口名称} `` 示例: `` ip address delete 192.0.2.1/24 dev eth0 ip address delete 2001:db8::1/64 dev tun1 `` 接口名称是必需的——内核不会尝试自动猜测你要从哪个接口删除该地址。这种猜测并不总是明确的:Linux 确实允许在同一地址配置在多个接口上,并且这有有效的用例(在 Cisco 世界中,这被称为“无编号接口”)。 ### \# (https://baturin.org/docs/iproute2/#ip-address-flush)从接口移除所有地址 `` ip address flush dev ${接口名称} `` 示例: `` ip address flush dev eth1 `` 默认情况下,此命令移除 IPv4 和 IPv6 地址。如果你只想移除 IPv4 或 IPv6 地址,请使用 `ip -4 address flush` 或 `ip -6 address flush`。 ### \# (https://baturin.org/docs/iproute2/#promote-secondaries)更改主地址 无法交换主 IPv4 地址和辅助 IPv4 地址,也无法显式设置新的主 IPv4 地址。尽量始终先设置主地址。如果 sysctl 变量 `net.ipv4.conf.${接口}.promote_secondaries` 设置为 1,则当你删除主地址时,第一个辅助地址将成为主地址。你可以通过 `net.ipv4.conf.default.promote_secondaries=1` 全局启用此行为。请注意,当 `promote_secondaries` 设置为 0 时,删除主地址也会从其接口移除**所有**辅助地址。此设置因 Linux 发行版而异,因此在尝试更改主地址之前请务必检查。 如果删除主地址,辅助 IPv6 地址始终会被提升为主地址。 ## \# (https://baturin.org/docs/iproute2/#ip-neighbor)邻居(ARP 和 NDP)表 --- 此命令同时支持美式拼写(`ip neighbor`)和英式拼写(`ip neighbour`)。 ### \# (https://baturin.org/docs/iproute2/#ip-neighbor-show)查看邻居表 `` ip neighbor show `` 所有“show”命令支持 `-4` 和 `-6` 选项,以仅查看 IPv4(ARP)或 IPv6(NDP)邻居。默认情况下显示所有邻居。 ### \# (https://baturin.org/docs/iproute2/#ip-neighbor-show-dev)查看特定接口的邻居 `` ip neighbor show dev ${接口名称} `` 示例:`ip neighbor show dev eth0` ### \# (https://baturin.org/docs/iproute2/#ip-neighbor-flush)刷新接口的邻居表 `` ip neighbor flush dev ${接口名称} `` 示例:`ip neighbor flush dev eth1` ### \# (https://baturin.org/docs/iproute2/#ip-neighbor-add)添加邻居表条目 `` ip neighbor add ${网络地址} lladdr ${链路层地址} dev ${接口名称} `` 示例:`ip neighbor add 192.0.2.1 lladdr 22:ce:e0:99:63:6f dev eth0` 它的一个用例是数据链路层安全的一种形式。你可以完全禁用接口上的 ARP,并手动添加授权设备的 MAC 地址。 ### \# (https://baturin.org/docs/iproute2/#ip-neighbor-delete)删除邻居表条目 `` ip neighbor delete ${网络地址} lladdr ${链路层地址} dev ${接口名称} `` 示例:`ip neighbor delete 192.0.2.1 lladdr 22:ce:e0:99:63:6f dev eth0` 允许你删除静态条目或丢弃自动学习的条目,而无需刷新整个表。 ## \# (https://baturin.org/docs/iproute2/#ip-link)网络链路 “链路”是网络接口的另一种说法。`ip link` 家族的命令执行所有接口类型通用的操作,例如查看链路信息或更改 MTU。 历史上,`ip link` 命令无法创建隧道(IPIP、GRE 等)、VXLAN 链路或 L2TPv3 伪线。至少从 iproute2 3.16 开始,它可以创建除 L2TPv3 接口之外的任何内容,并且在 iproute2 5.7 中仍然如此。不过,很多时候,用于特定接口类型的旧命令仍然更便于使用。 请注意,Linux 内核允许网络接口使用任意名称,甚至非 ASCII 名称。最好坚持使用字母数字,因为用户空间程序(如 iptables)可能不会那么宽容。 ### \# (https://baturin.org/docs/iproute2/#ip-link-show)显示所有链路的信息 `` ip link show ip link list `` 这些命令等效。 ### \# (https://baturin.org/docs/iproute2/#ip-link-show-dev)显示特定链路的信息 `` ip link show dev ${接口名称} `` 示例: `` ip link show dev eth0 ip link show dev tun10 `` 你可以省略 `dev` 单词。 ### \# (https://baturin.org/docs/iproute2/#ip-link-set-up-down)启用或禁用链路 `` ip link set dev ${接口名称} up ip link set dev ${接口名称} down `` 示例: `` ip link set dev eth0 down ip link set dev br0 up `` 注意:虚拟链路(隧道、VLAN 等)总是在“down”状态下创建。你需要启用它们才能开始使用。 ### \# (https://baturin.org/docs/iproute2/#ip-link-set-alias)设置可读的链路描述 `` ip link set dev ${接口名称} alias "${描述}" `` 示例:`ip link set dev eth0 alias "LAN interface"`。链路别名会显示在 `ip link show` 输出中,如下所示: `` 2: eth0: mtu 1500 qdisc mq state UP mode DEFAULT qlen 1000 link/ether 22:ce:e0:99:63:6f brd ff:ff:ff:ff:ff:ff alias LAN interface `` ### \# (https://baturin.org/docs/iproute2/#ip-link-property-altname)添加链路备用名称 内核将链路名称长度限制为 15 个字符。为了克服这一限制,可以为链路添加备用名称。 `` ip link property add dev ${接口名称} altname ${备用名称} `` 示例:`ip link property add dev eth0 altname eno1 altname enp3s0` 可以在 iproute 命令中使用备用名称来引用该链路。 `` $ ip link show eno1 2: eth0: mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:11:af:63 brd ff:ff:ff:ff:ff:ff altname eno1 altname enp3s0 `` ### \# (https://baturin.org/docs/iproute2/#ip-link-set-name)重命名接口 `` ip link set dev ${旧接口名称} name ${新接口名称} `` 示例:`ip link set dev eth0 name lan` 注意,你不能重命名活动中的接口。在重命名之前,你需要先将其停用 (https://baturin.org/docs/iproute2/#ip-link-set-up-down)。 ### \# (https://baturin.org/docs/iproute2/#ip-link-set-address)更改链路层地址(通常是 MAC 地址) `` ip link set dev ${接口名称} address ${地址} `` 链路层地址是一个相当广泛的概念。最广为人知的例子是以太网设备的 MAC 地址。要更改 MAC 地址,你需要类似 `ip link set dev eth0 address 22:ce:e0:99:63:6f` 的命令。 ### \# (https://baturin.org/docs/iproute2/#ip-link-set-mtu)更改链路 MTU `` ip link set dev ${接口名称} mtu ${MTU 值} `` 示例:`ip link set dev tun0 mtu 1480` MTU 代表“最大传输单元”,即接口一次可以传输的最大帧大小。除了减少隧道中的分片外,这还用于提高支持所谓“巨型帧”(最大 9000 字节的帧)的千兆以太网链路的性能。如果你的所有设备都支持千兆以太网,你可能想要执行类似 `ip link set dev eth0 mtu 9000` 的操作。请注意,你可能也需要在你的二层交换机上配置它,有些交换机默认禁用巨型帧。 ### \# (https://baturin.org/docs/iproute2/#ip-link-delete)删除链路 `` ip link delete dev ${接口名称} `` 显然,只能删除虚拟链路,如 VLAN、桥接或隧道。对于物理接口,此命令无效。 ### \# (https://baturin.org/docs/iproute2/#ip-link-set-multicast-on-off)启用或禁用接口上的多播 `` ip link set ${接口名称} multicast on ip link set ${接口名称} multicast off `` 除非你确实知道自己在做什么,否则最好不要动这个选项。 ### \# (https://baturin.org/docs/iproute2/#ip-link-set-arp-on-off)启用或禁用接口上的 ARP `` ip link set ${接口名称} arp on ip link set ${接口名称} arp off `` 有人可能希望禁用 ARP 以实施安全策略,只允许特定的 MAC 地址与接口通信。在这种情况下,邻居

相似文章

HomeLab #1: MikroTik 作为家庭路由器

Hacker News Top

实用指南:设置MikroTik路由器用于家庭实验室,涵盖如何识别ISP连接类型(IPoE与PPPoE)以及WAN IPv4地址(公网与CGNAT/DS-Lite),以便正确配置路由器。

搭建 OPNsense 路由器

Lobsters Hottest

一份关于为家庭网络搭建定制 OPNsense 路由器的详细指南,介绍了路由器架构、VLAN 配置,以及选用 OPNsense 替代商业网关方案的理由。

我的ASN之旅系列(2024)

Hacker News Top

一份全面的初学者指南,介绍如何获取和配置自己的ASN和IP地址,涵盖BGP设置、成本和限制。