ip 命令详解与参数实测(Ubuntu 22.04)

实测 Ubuntu 22.04 的 ip 命令:ip a/link/-s/-br/-4/-6 查看族逐段解读,addr add·del 与 label、link add/set、route 查看与 get、静态路由与黑洞路由、neigh 邻居状态机、rule 策略路由,含 dummy0 全生命周期与无权报错形态,附 ifconfig/route 迁移对照。

Linux命令Linux系统UbuntuUbuntu 22.04命令行网络工具2026/10/16

ip 命令详解与参数实测(Ubuntu 22.04)

目标:全面掌握 ip 命令的每一个常用参数——ip a、ip link、ip -s link、ip -br、-4/-6 协议族过滤、ip addr add/del、ip link add/set、ip route 查看与 get、ip route add/del(静态路由与黑洞路由)、ip neigh、ip rule 与对象族帮助体系,全部命令与回显已在 Ubuntu 22.04(iproute2 5.15.0)实测通过。

一、环境信息

本章记录实测环境的操作系统、内核与工具版本,保证文中所有回显可追溯、可复现。以下信息均在实测机上真实采集。

  • 操作系统:Ubuntu 22.04.5 LTS(取自 /etc/os-release,实测见下)
  • 内核版本:6.8.0-138-generic(uname -r 实测)
  • 硬件架构:x86_64(uname -m 实测)
  • 本机地址:172.17.0.5/16(eth0,ip a 实测,见 3.1)
  • 默认网关:172.17.0.1(ip route 实测,见 3.10)
  • 工具版本:iproute2 5.15.0(ip -V 实测;软件包 iproute2 5.15.0-1ubuntu2.2,见 2.3)
  • 演示数据目录:/root/demo/ip/。本文的演示"数据"是临时网络对象——dummy0 虚拟网卡、临时 IP、临时路由与静态邻居表项,全部"用后即清",不落盘、不改动既有网络配置。

环境基线采集命令与实测回显:

head -2 /etc/os-release
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
uname -r; uname -m
6.8.0-138-generic
x86_64
dpkg -l iproute2 | tail -1
ii  iproute2       5.15.0-1ubuntu2.2 amd64        networking and traffic control tools

💡 说明:ip 命令由 iproute2 软件包提供,Ubuntu 22.04 最小系统默认自带;iproute2 是当前 Linux 官方主推的网络配置工具集(同包还有 ss、tc 等),其版本号与内核特性同步演进。

二、命令概览

2.1 语法与测试数据

ip 是一个"对象 + 命令"两段式命令:先选要操作的网络对象(OBJECT),再给动作(COMMAND)。它能查看与操控内核里的接口、三层地址、路由表、邻居(ARP/NDP)表、策略路由规则等,是 ifconfig / route / arp 三条老命令的统一替代者。

官方语法(来自 ip help 首行,完整帮助见 2.2):

Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
       ip [ -force ] -batch filename

两个实用书写规则(本文实测全程使用):

  • 对象名可用助记缩写:address→a/addr,link→l,route→ro,neighbor→neigh/n,rule 不缩写也常见 ru;
  • 每个对象都自带专属帮助:ip <对象> help(实测见 3.15)。

本文测试数据约定:

  • 环境如第一章:本机 eth0 地址 172.17.0.5/16,网关 172.17.0.1;
  • 写操作演示全部落在临时虚拟网卡 dummy0 上:创建(3.7)→ 加地址(3.8)→ 加路由(3.12)→ 逐项删除(3.13),对既有网络零影响;
  • 邻居表演示只读网关条目、增删一个静态条目(3.14),结束后 ip neigh flush all 清场。

参数速查表(每项实测值均来自第三章):

子命令全称语义本机实测
ip aip address查看/管理三层地址lo 127.0.0.1/8 + eth0 172.17.0.5/16(3.1)
ip link—查看/管理二层链路state UP / UNKNOWN(3.2)
ip -s linkstatistics收发统计RX/TX 的 errors、dropped 计数(3.3)
ip -br addrbrief一行一卡简洁视图eth0@if17 UP 172.17.0.5/16(3.4)
ip -4 / ip -6family inet/inet6协议族过滤本机 ip -6 route 为空(3.5)
ip addr add/del—增删 IPdummy0 上加删 10.55.0.1/24(3.8/3.13)
ip link add/set—建卡/改状态dummy0 创建→up→down→del(3.7/3.13)
ip route—路由表default via 172.17.0.1 dev eth0(3.10)
ip route get—路由解析一行给出出口/网关/源地址(3.11)
ip route add/del—增删路由via 静态路由与 blackhole 黑洞路由(3.12)
ip neighneighborARP/NDP 邻居表网关 REACHABLE、静态条目 PERMANENT(3.14)
ip rule—策略路由规则默认 3 条规则(3.15)

关键差异:ip a/ip link 是"读"(查看地址与链路),ip addr add/ip link set/ip route add 是"写"(改内核网络状态,需 root);ip route get 是"问路"(解析而非修改);-br/-s/-4/-6 是全局显示选项,可与任意对象组合。

2.2 help 全量输出(逐行照抄)

ip 的总帮助入口是 ip help。以下为完整实测回显,逐行照抄未删减:

ip help
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
       ip [ -force ] -batch filename
where  OBJECT := { address | addrlabel | fou | help | ila | ioam | l2tp | link |
                   macsec | maddress | monitor | mptcp | mroute | mrule |
                   neighbor | neighbour | netconf | netns | nexthop | ntable |
                   ntbl | route | rule | sr | tap | tcpmetrics |
                   token | tunnel | tuntap | vrf | xfrm }
       OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
                    -h[uman-readable] | -iec | -j[son] | -p[retty] |
                    -f[amily] { inet | inet6 | mpls | bridge | link } |
                    -4 | -6 | -M | -B | -0 |
                    -l[oops] { maximum-addr-flush-attempts } | -br[ief] |
                    -o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |
                    -rc[vbuf] [size] | -n[etns] name | -N[umeric] | -a[ll] |
                    -c[olor]}

逐项解读:

  • OBJECT 一行列出了 ip 的全部对象:本文详解 address、link、route、neighbor、rule 五大常用对象;monitor(监听网络事件)、netns(网络命名空间)、tunnel(隧道)、vrf(VRF 隔离)等属于进阶对象,语法同样是 ip <对象> <命令>;
  • OPTIONS 是全局选项:-V 版本、-s 统计、-d 更多细节、-r 把 IP 反解成主机名、-h 人类可读单位、-j/-p JSON/美化输出(适合脚本消费)、-f/-4/-6 协议族过滤、-br 简洁视图、-o 单行输出、-n 指定网络命名空间、-c[olor] 彩色输出;
  • 方括号内的字母表示可缩写,如 -s[tatistics] 可写 -s;
  • 帮助体系分两层:总帮助 ip help,对象帮助 ip <对象> help(后者给出该对象的完整语法与变量定义,实测见 3.15)。

💡 技术拓展:查看与配置 Linux 网络的命令体系主要有三代,横向对比——

体系代表命令维护状态特点与短板
net-toolsifconfig / route / arp2001 年后基本停更逐条 ioctl 老接口;不认识策略路由、多路由表、现代虚拟设备
iproute2ip / ss / tc当前标准,随内核演进netlink 直连内核;支持多表、策略路由、命名空间、全部新设备类型
nmcli / nmtuiNetworkManager桌面版与云环境常用面向"连接"的持久化配置管理,底层能力仍由内核网络栈提供

本文主角是 iproute2 的 ip。Ubuntu 22.04 默认安装已不含 net-tools(需要时得手动 apt install net-tools),新脚本一律建议直接写 ip。

2.3 版本信息

实测 ip -V:

ip -V
ip utility, iproute2-5.15.0, libbpf 0.5.0

💡 说明:版本参数是 -V(大写);一行同时报出 iproute2 与 libbpf 两个版本。数字 5.15.0 与软件包版本对应(dpkg -l iproute2 实测为 5.15.0-1ubuntu2.2,见第一章),对齐该版本才能复现文中回显格式——不同版本的 ip 输出细节(如报错文案)偶有差异。

三、参数逐项实测

本章逐个参数实测:每个参数给出实测命令、真实回显与要点说明。写操作演示全部在临时虚拟网卡 dummy0 上进行,每段演示自带创建与清理,跑完后环境回到初始状态。

3.1 ip a(ip address):地址层全量查看

ip a 是 ip address show 的缩写(也等价 ip addr),一次列出所有接口的二层地址、IPv4、IPv6 与状态信息,是最常用的网络查看命令。实测:

ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 6e:71:8e:30:a8:96 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.5/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

逐段解读:

  • 1: lo: 与 2: eth0@if17:——冒号前的数字是接口序号(ifindex),内核内唯一,ip link show dev 2 可按序号反查;eth0@if17 的 @if17 表示这是成对虚拟设备(veth 对),对端设备序号为 17,普通物理网卡没有这个后缀;
  • <LOOPBACK,UP,LOWER_UP>——设备标志:LOOPBACK 回环设备;UP 管理状态已启用(软开关打开);LOWER_UP 物理链路就绪("网线插好");BROADCAST 支持广播、MULTICAST 支持组播(eth0 上的两者是局域网卡标配);NOARP 不走 ARP(dummy 类型自带,见 3.7);
  • mtu 65536 / mtu 1500——最大传输单元,回环设备 65536,普通以太网 1500;
  • qdisc noqueue——排队规则(qdisc):noqueue 表示无队列排队,流量直接交给驱动;
  • state UNKNOWN vs state UP——操作状态(operstate)。回环设备没有物理链路概念,内核把它的 operstate 恒置 UNKNOWN,不代表异常;普通网卡链路就绪后为 UP;
  • group default——接口分组属性(可用于批量操作);qlen 1000——发送队列长度;
  • link/ether 6e:71:8e:30:a8:96——二层 MAC 地址,brd ff:ff:ff:ff:ff:ff 为广播 MAC;
  • inet 127.0.0.1/8 scope host lo——IPv4 地址/前缀长度/scope。/8 意味着整个 127.0.0.0/8 段都属于本机回环,ping 127.0.0.22 同样能通(实测见下);scope host 表示仅本机有效、不可对外路由;
  • inet 172.17.0.5/16 brd 172.17.255.255 scope global eth0——scope global 表示可对外路由,brd 是广播地址;
  • valid_lft forever preferred_lft forever——地址生命周期(IPv6 体系沿用至 IPv4 显示),静态地址为 forever;
  • inet6 ::1/128 scope host——IPv6 回环地址。

127/8 全段回环的验证实测(ping 127.0.0.22 同样走回环):

ping -c 1 -W 1 127.0.0.22 | tail -2
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.077/0.077/0.077/0.000 ms

💡 要点:ip a 一次读齐"接口 → 标志 → MAC → IPv4 → IPv6"五层信息。判断网卡是否可用:先看尖括号里的 UP/LOWER_UP,再看 state;确认地址在不在:找对应 inet 行与其 scope。

3.2 ip link:链路层(二层)视图

ip link 只显示接口的二层属性(MAC、MTU、队列、状态),不显示 IP 地址,等价于 ip link show。实测:

ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 6e:71:8e:30:a8:96 brd ff:ff:ff:ff:ff:ff link-netnsid 0

与 ip a 对比:少了 inet/inet6 行,多了 mode DEFAULT(链路模式属性,驱动上报的默认值,日常排障很少关注)。写网卡 MAC、改 MTU、启停接口等二层操作都以 ip link 为入口(如 ip link set eth0 mtu 9000)。

💡 要点:查"网卡本身"用 ip link,查"网卡上的地址"用 ip a;两者输出主体相同,差别就在三、四层地址行。

3.3 ip -s link:收发统计(RX/TX errors、dropped)

-s(statistics)让输出带上每个接口的收发计数,是排查丢包、网卡错误的第一入口。实测:

ip -s link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    RX:  bytes packets errors dropped  missed   mcast           
             0       0      0       0       0       0 
    TX:  bytes packets errors dropped carrier collsns           
             0       0      0       0       0       0 
2: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 6e:71:8e:30:a8:96 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    RX:  bytes packets errors dropped  missed   mcast           
      51013439    9708      0       0       0       0 
    TX:  bytes packets errors dropped carrier collsns           
        399986    7296      0       0       0       0 

逐列解读:

  • RX: 接收方向:bytes 字节数、packets 包数、errors 错误包(CRC 校验错、帧长错、驱动错误等)、dropped 内核丢弃(队列满、内存不足等)、missed 网卡来不及收(DMA 描述符耗尽)、mcast 组播包数;
  • TX: 发送方向:bytes/packets/errors/dropped 同上,carrier 载波错误(物理层问题),collsns 冲突计数(半双工时代遗留);
  • 本例环境流量健康:errors/dropped/missed 全为 0;生产巡检的重点是 errors 与 dropped 的增长速率——持续增长才说明有问题,一次性历史计数无碍。

💡 要点:ip -s link show eth0 可只看单卡;更高的计数细节可加双 -s(ip -s -s link),但日常排障一级统计已够用。

3.4 ip -br addr / ip -br link:一行一卡的简洁视图(重点推荐)

-br(brief)把每个接口压缩成一行,先给接口名和状态,再给地址(或 MAC)。实测:

ip -br addr
lo               UNKNOWN        127.0.0.1/8 ::1/128 
eth0@if17        UP             172.17.0.5/16 
ip -br link
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> 
eth0@if17        UP             6e:71:8e:30:a8:96 <BROADCAST,MULTICAST,UP,LOWER_UP> 

三列布局为"接口名 / 操作状态 / 地址(或 MAC + 标志)",多卡服务器上一屏尽收,也便于 grep 与截图存档。

💡 要点:日常巡检推荐 ip -br addr;写自动化脚本需要精确解析时用 ip -j addr(JSON 输出,见 2.2 的 OPTIONS 列表)。

3.5 ip -4 / ip -6:协议族过滤

-4 等价 -f inet,-6 等价 -f inet6,分别只显示 IPv4/IPv6 内容,可与任意对象组合。实测:

ip -4 addr show lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
ip -6 addr show lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
ip -4 route
default via 172.17.0.1 dev eth0 
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.5 
ip -6 route

💡 要点:本机 ip -6 route 为空——eth0 没有配置 IPv6 地址,内核也没有任何 v6 路由,只保留了 lo 的 ::1。排查"IPv6 不通"时,先用 ip -6 addr 与 ip -6 route 确认地址与路由是否存在。

3.6 定向查看与报错形态:ip a show / show type / 不存在的设备

show 支持三种过滤:按设备名、按类型、按 scope。定向查看实测:

ip a show lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
ip a show dev eth0
2: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 6e:71:8e:30:a8:96 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.5/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

按类型过滤(type dummy 指只看 dummy 类型设备;本机尚无 dummy 设备,输出为空且 rc=0——空输出表示"没有该类型设备",不是报错):

ip link show type dummy; echo rc=$?
rc=0

设备名写错时的报错形态实测:

ip addr show nosuchif; echo rc=$?
Device "nosuchif" does not exist.
rc=1

💡 要点:Device "nosuchif" does not exist. 且 rc=1 是"设备不存在"的标准报错;而"按类型过滤无匹配"是静默的 rc=0 空输出——脚本里判断"设备是否存在"应捕获 rc 与 stderr,而不是看有没有输出。

dummy 设备是"什么都不连接的纯软件网卡":它有完整 MAC 与协议栈行为,但没有物理对端,常用作本机流量实验、绑定 VIP 或充当稳定的 anchor 接口。本节从创建到启用逐步实测(若 dummy0 已存在,先 ip link del dummy0 清理,见 3.13)。

创建 dummy0(成功时无输出,静默返回):

ip link add dummy0 type dummy

刚创建的设备处于 DOWN 状态,MAC 由内核随机生成:

ip -br link show dummy0
dummy0           DOWN           16:02:f3:99:44:7d <BROADCAST,NOARP> 

启用接口:

ip link set dummy0 up
ip -br link show dummy0
dummy0           UNKNOWN        16:02:f3:99:44:7d <BROADCAST,NOARP,UP,LOWER_UP> 

解读:

  • 新建即存在但 DOWN,尖括号标志只有 <BROADCAST,NOARP>——NOARP 是 dummy 类型的固有属性(没有对端,无需 ARP);
  • ip link set dummy0 up 后标志追加 UP,LOWER_UP,但 state 显示 UNKNOWN——这是 dummy 类型的固定行为:没有物理链路可探测,operstate 无法判定为 UP。它不是故障,接口协议栈完全可用;
  • 关闭用 ip link set dummy0 down(实测见 3.13),删除用 ip link del dummy0。

💡 要点:ip link add <名> type <类型> 是创建一切虚拟设备的通用入口,type 可取 dummy、veth、bridge、vlan、vxlan 等(完整类型清单见 3.15 的 ip addr help 中 TYPE 定义)。

3.8 ip addr add:在 dummy0 上增删 IP(含 label 从地址)

给 dummy0 配置一个主地址和一个带 label 的从地址,然后查看。实测:

ip addr add 10.55.0.1/24 dev dummy0
ip addr add 10.55.0.2/24 dev dummy0 label dummy0:0
ip a show dummy0
3: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 16:02:f3:99:44:7d brd ff:ff:ff:ff:ff:ff
    inet 10.55.0.1/24 scope global dummy0
       valid_lft forever preferred_lft forever
    inet 10.55.0.2/24 scope global secondary dummy0:0
       valid_lft forever preferred_lft forever
    inet6 fe80::1402:f3ff:fe99:447d/64 scope link 
       valid_lft forever preferred_lft forever
ip -br addr show dummy0
dummy0           UNKNOWN        10.55.0.1/24 10.55.0.2/24 fe80::1402:f3ff:fe99:447d/64 

逐项解读:

  • inet 10.55.0.1/24 scope global dummy0——第一个加入的地址自动成为主地址(primary),scope 为 global(可对外路由);
  • inet 10.55.0.2/24 scope global secondary dummy0:0——同网段第二个地址标记为 secondary(从地址);label dummy0:0 是旧式别名的兼容写法,对应 ifconfig 时代的 eth0:0 子接口命名习惯;
  • inet6 fe80::1402:f3ff:fe99:447d/64 scope link——接口启用后内核按 EUI-64 规则从 MAC 自动生成链路本地地址(MAC 16:02:f3:99:44:7d 中间插入 ff:fe 并翻转第七位即得),scope link 表示仅链路内有效。

删除地址用 ip addr del(实测与"路由随之消失"的联动见 3.13)。

💡 要点:ip addr add 支持一次挂多个地址(重复调用即可);ip addr replace 可实现"有则改、无则加"的幂等语义,适合脚本。

3.9 报错形态:重复添加同一地址

对已存在的地址再次 ip addr add 的实测:

ip addr add 10.55.0.1/24 dev dummy0; echo rc=$?
Error: ipv4: Address already assigned.
rc=2

💡 要点:新版 iproute2 对重复地址给出明确的 Error: ipv4: Address already assigned.,退出码 2;脚本判断"地址是否已配"可以用 rc,或直接 ip addr show dev dummy0 | grep 10.55.0.1。

3.10 ip route:路由表查看与逐段解读

ip route 显示主路由表(main 表),是理解"包往哪走"的核心视图。此时 dummy0 已在线并配好 10.55.0.1/24,正好能看到三条路由的完整形态。实测:

ip route
default via 172.17.0.1 dev eth0 
10.55.0.0/24 dev dummy0 proto kernel scope link src 10.55.0.1 
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.5 

逐段解读:

  • default via 172.17.0.1 dev eth0——默认路由(0.0.0.0/0):没有更精确路由匹配时的兜底。via 指下一跳网关地址,dev 指出接口;
  • 10.55.0.0/24 dev dummy0 proto kernel scope link src 10.55.0.1——直连路由:
    • proto kernel——内核在执行 ip addr add 时自动生成的路由,删地址会自动消失(实测见 3.13);
    • scope link——直连网段,下一跳就是目标地址本身;
    • src 10.55.0.1——命中此路由时默认选用的源地址(发包的"回信地址");
  • 172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.5——本机所在网段的直连路由,字段含义同上。

💡 技术拓展:Linux 路由是多表体系,ip route 默认只看 main 表。系统自带三张表——

表名id内容
local255本机地址路由(local/broadcast 条目)
main254常规路由,ip route 默认显示的就是它
default253兜底空表,策略路由的默认落点

ip rule(见 3.15)决定"按什么顺序查哪张表";ip route show table local 可查看本机地址表(实测见下):

ip route show table local
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
local 172.17.0.5 dev eth0 proto kernel scope host src 172.17.0.5
broadcast 172.17.255.255 dev eth0 proto kernel scope link src 172.17.0.5

local 表的规律清晰可读:每个本机地址一条 local 条目(scope host)、每个广播地址一条 broadcast 条目(scope link)、回环整段一条 local 127.0.0.0/8。

3.11 ip route get:一句话解析"走哪张卡、哪个网关、哪个源地址"

ip route get <目标> 让内核按真实路由规则做一次"问路",一行给出命中路由的出接口、网关与源地址,是排障时最省事的定位手段。实测三个典型目标:

ip route get 8.8.8.8
8.8.8.8 via 172.17.0.1 dev eth0 src 172.17.0.5 uid 0 
    cache 
ip route get 10.55.0.7
10.55.0.7 dev dummy0 src 10.55.0.1 uid 0 
    cache 
ip route get 127.0.0.1
local 127.0.0.1 dev lo src 127.0.0.1 uid 0 
    cache <local> 

解读:

  • 8.8.8.8 不在任何直连网段 → 命中默认路由 → via 172.17.0.1 dev eth0 src 172.17.0.5(公网流量从 eth0 走网关,源地址选 172.17.0.5);
  • 10.55.0.7 在 dummy0 的直连网段 → 直接 dev dummy0 src 10.55.0.1,无需 via;
  • 127.0.0.1 命中 local 表的本机地址路由 → local 127.0.0.1 dev lo src 127.0.0.1,cache <local> 标记该结果来自 local 表缓存;
  • uid 0 表示发起查询的进程用户 ID,cache 行是路由缓存的标注。

💡 要点:排障第一步永远是 ip route get <目标IP>——它回答"这流量到底走谁",比人眼读全表快得多;若结果与预期不符,问题通常在路由表或策略路由(ip rule)。

3.12 ip route add / del:静态路由与黑洞路由(实测后即删)

添加静态路由。 在 dummy0 网段背后再挂一段"下游网段",下一跳指向 dummy0 上的虚构网关 10.55.0.254:

ip route add 10.66.0.0/24 via 10.55.0.254 dev dummy0
ip route show
default via 172.17.0.1 dev eth0 
10.55.0.0/24 dev dummy0 proto kernel scope link src 10.55.0.1 
10.66.0.0/24 via 10.55.0.254 dev dummy0 
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.5 

新路由 10.66.0.0/24 via 10.55.0.254 dev dummy0 已入表。删除路由(del 只需给目标前缀):

ip route del 10.66.0.0/24

按前缀精确查看一条路由:

ip route show 10.55.0.0/24
10.55.0.0/24 dev dummy0 proto kernel scope link src 10.55.0.1 

黑洞路由。 blackhole 类型的路由会把发往该网段的包在内核侧直接丢弃,常用于临时屏蔽恶意网段或灰度切流。实测:

ip route add blackhole 10.99.0.0/24
ip route show
default via 172.17.0.1 dev eth0 
10.55.0.0/24 dev dummy0 proto kernel scope link src 10.55.0.1 
blackhole 10.99.0.0/24 
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.5 

黑洞生效后,目标网段的流量在内核即被吞掉——ping 进程在建立 socket 连接阶段就失败,包根本没出协议栈:

ping -c 1 -W 1 10.99.0.5; echo rc=$?
ping: connect: Invalid argument
rc=2

删除黑洞路由,恢复原有转发行为:

ip route del blackhole 10.99.0.0/24

💡 要点:ip route add 的常用形态三种——直连补路由 ip route add <网段> dev <网卡>、带下一跳 ip route add <网段> via <网关> dev <网卡>、丢弃型 ip route add blackhole <网段>;ip route add default via <网关> 则用于补默认路由。写操作均需 root。

本节把 3.7/3.8 建的临时对象逐项清场,同时实测两个联动行为:删地址会连删直连路由、down 之后接口仍在、del 才真正消失。实测:

ip addr del 10.55.0.2/24 dev dummy0
ip addr del 10.55.0.1/24 dev dummy0
ip route show
default via 172.17.0.1 dev eth0 
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.5 

两个地址删掉后,10.55.0.0/24 dev dummy0 的 proto kernel 直连路由自动消失——这正是 3.10 说的"proto kernel 路由跟着地址走"。接着关闭并删除接口:

ip link set dummy0 down
ip link show dummy0
3: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
    link/ether 16:02:f3:99:44:7d brd ff:ff:ff:ff:ff:ff

down 之后接口仍然存在(标志退回 <BROADCAST,NOARP>、state DOWN),地址行随地址删除已为空。真正删除:

ip link del dummy0
ip link show type dummy; echo rc=$?
rc=0

ip link show type dummy 空输出、rc=0——dummy0 已从内核消失,环境回到初始状态。

💡 要点:set down 是"软关机"(可逆),link del 是"拆卡"(不可逆,MAC 也会换);清场顺序建议:删地址 → down → del。

3.14 ip neigh:邻居表(ARP/NDP)

ip neigh 显示内核的邻居表——IPv4 即 ARP 表(IP ↔ MAC 映射),IPv6 即 NDP 表。先看空表(已 flush),再 ping 一次网关触发 ARP 解析,然后查看条目。实测:

ip neigh show
ping -c 2 -W 2 172.17.0.1 >/dev/null; echo ping-rc=$?
ping-rc=0
ip neigh show 172.17.0.1
172.17.0.1 dev eth0 lladdr e6:df:fb:96:2e:f4 REACHABLE

ping 网关后,内核解析到网关的 MAC(lladdr e6:df:fb:96:2e:f4),条目进入 REACHABLE(可达)状态。

静态绑定一条 ARP 条目(不经过 ARP 协议,直接写入内核):

ip neigh add 172.17.0.199 lladdr aa:bb:cc:dd:ee:ff dev eth0
ip neigh show 172.17.0.199
172.17.0.199 dev eth0 lladdr aa:bb:cc:dd:ee:ff PERMANENT

手工添加的条目状态为 PERMANENT(永久,永不过期)。删除该条目:

ip neigh del 172.17.0.199 dev eth0
ip neigh show 172.17.0.199

删除后查询为空。最后清空整表:

ip neigh flush all
ip neigh show

💡 要点:邻居条目的常见状态——REACHABLE 已验证可达;STALE 曾可达但已过期,下次发包会重新验证;DELAY/PROBE 延迟/正在探测;FAILED 解析失败(对端不回应 ARP);PERMANENT 手工静态条目;INCOMPLETE 解析进行中。ip neigh 拿不到对端 MAC 时,先 ping 一下目标再看表。

3.15 ip rule:策略路由规则一览 + ip addr help 对象帮助

ip rule 显示策略路由规则库:每条规则由"优先级 + 匹配条件 + 查哪张表"组成,数字越小越先匹配。默认三条规则实测:

ip rule show
0:	from all lookup local
32766:	from all lookup main
32767:	from all lookup default

解读:默认规则保证"先查本机地址(local 表),再查常规路由(main 表),最后落 default 表"——这就是 3.10 拓展里三张默认表的查表顺序。高级场景(多线接入、按源地址分流)会在此插入自定义规则,如 ip rule add from 10.55.0.1 table 100。

每个对象还有专属语法帮助,以 ip addr help 为例(完整实测回显,逐行照抄):

ip addr help
Usage: ip address {add|change|replace} IFADDR dev IFNAME [ LIFETIME ]
                                                      [ CONFFLAG-LIST ]
       ip address del IFADDR dev IFNAME [mngtmpaddr]
       ip address {save|flush} [ dev IFNAME ] [ scope SCOPE-ID ]
                            [ to PREFIX ] [ FLAG-LIST ] [ label LABEL ] [up]
       ip address [ show [ dev IFNAME ] [ scope SCOPE-ID ] [ master DEVICE ]
                         [ type TYPE ] [ to PREFIX ] [ FLAG-LIST ]
                         [ label LABEL ] [up] [ vrf NAME ] ]
       ip address {showdump|restore}
IFADDR := PREFIX | ADDR peer PREFIX
          [ broadcast ADDR ] [ anycast ADDR ]
          [ label IFNAME ] [ scope SCOPE-ID ] [ metric METRIC ]
SCOPE-ID := [ host | link | global | NUMBER ]
FLAG-LIST := [ FLAG-LIST ] FLAG
FLAG  := [ permanent | dynamic | secondary | primary |
           [-]tentative | [-]deprecated | [-]dadfailed | temporary |
           CONFFLAG-LIST ]
CONFFLAG-LIST := [ CONFFLAG-LIST ] CONFFLAG
CONFFLAG  := [ home | nodad | mngtmpaddr | noprefixroute | autojoin ]
LIFETIME := [ valid_lft LFT ] [ preferred_lft LFT ]
LFT := forever | SECONDS
TYPE := { bareudp | bond | bond_slave | bridge | bridge_slave |
          dummy | erspan | geneve | gre | gretap | ifb |
          ip6erspan | ip6gre | ip6gretap | ip6tnl |
          ipip | ipoib | ipvlan | ipvtap |
          macsec | macvlan | macvtap |
          netdevsim | nlmon | rmnet | sit | team | team_slave |
          vcan | veth | vlan | vrf | vti | vxcan | vxlan | wwan |
          xfrm }

解读:Usage 段给出 address 对象的全部动作(add/change/replace/del/save/flush/show 等);IFADDR :=、SCOPE-ID := 等是 BNF 式语法定义,说明每个参数的合法取值;TYPE := 枚举了 ip link add 支持的全部设备类型(dummy、veth、bridge、vlan、vxlan 等 30 余种)。

💡 要点:记不清语法时先查 ip <对象> help,比搜索引擎快且与当前安装版本严格一致。

四、实战示例

本章给出一组组合场景,命令均来自第三章的实测片段,可按场景直接套用。

4.1 场景一:临时模拟一块"业务网卡"并绑定双 IP

适用:联调时本机没有多余网段,需要一块独立网段的接口做绑定/监听实验。完整流程(创建 → 启用 → 双地址 → 验证 → 清理):

ip link add dummy0 type dummy
ip link set dummy0 up
ip addr add 10.55.0.1/24 dev dummy0
ip addr add 10.55.0.2/24 dev dummy0 label dummy0:0
ip -br addr show dummy0
dummy0           UNKNOWN        10.55.0.1/24 10.55.0.2/24 fe80::1402:f3ff:fe99:447d/64 

验证生效后按"删地址 → down → del"收尾(实测回显见 3.13)。服务要监听新地址,直接 bind 10.55.0.1 即可,无需重启网络。

4.2 场景二:三步定位"到某地址的出口"

适用:排障时回答"这台机器访问某 IP 到底走哪张卡、哪个网关、用的哪个源地址"。

ip route get 8.8.8.8
8.8.8.8 via 172.17.0.1 dev eth0 src 172.17.0.5 uid 0 
    cache 
ip route
default via 172.17.0.1 dev eth0 
10.55.0.0/24 dev dummy0 proto kernel scope link src 10.55.0.1 
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.5 
ip neigh show 172.17.0.1
172.17.0.1 dev eth0 lladdr e6:df:fb:96:2e:f4 REACHABLE

三步结论链:route get 给出出口(via 172.17.0.1 / dev eth0 / src 172.17.0.5)→ ip route 确认该结果由默认路由决定 → ip neigh 确认网关二层可达(REACHABLE 且有 MAC)。任何一步异常即定位到对应层(路由缺失查表、MAC 拿不到查二层)。

4.3 场景三:临时黑洞一个网段(屏蔽恶意来源/灰度切流)

适用:发现某网段在刷接口,需要立刻静默丢弃其流量(比防火墙更快生效,且不产生拒绝应答)。实测三步:

ip route add blackhole 10.99.0.0/24
ping -c 1 -W 1 10.99.0.5; echo rc=$?
ping: connect: Invalid argument
rc=2

目标网段的流量在内核被静默丢弃(ping 的 connect 直接失败),验证丢弃生效后解除:

ip route del blackhole 10.99.0.0/24

⚠️ 注意:黑洞路由影响本机发出与转发的所有命中流量,操作前先 ip route show 确认网段范围精确,避免误伤业务网段;重启后自动失效(不持久化)。

4.4 场景四:网卡巡检两连击(状态 + 丢包错误)

适用:交接班/例行巡检时,两条命令看完全部网卡的状态与健康度。

ip -br addr
lo               UNKNOWN        127.0.0.1/8 ::1/128 
eth0@if17        UP             172.17.0.5/16 
ip -s link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    RX:  bytes packets errors dropped  missed   mcast           
             0       0      0       0       0       0 
    TX:  bytes packets errors dropped carrier collsns           
             0       0      0       0       0       0 
2: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 6e:71:8e:30:a8:96 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    RX:  bytes packets errors dropped  missed   mcast           
      51013439    9708      0       0       0       0 
    TX:  bytes packets errors dropped carrier collsns           
        399986    7296      0       0       0       0 

巡检口径:-br addr 看每张卡"在不在、起没起、有没有地址";-s link 看_errors/dropped/missed 是否在增长(建议间隔一段时间对比两次读数,看增速而非绝对值)。

4.5 场景五:从 ifconfig/route 迁移到 ip 的命令对照速查

适用:老脚本/老记忆里的 net-tools 写法迁移到 iproute2。对照表:

旧命令(net-tools)ip 等价写法
ifconfig -aip a
ifconfig eth0ip a show dev eth0
ifconfig eth0 up / downip link set eth0 up / down
ifconfig eth0 10.0.0.5 netmask 255.255.255.0ip addr add 10.0.0.5/24 dev eth0
ifconfig eth0 mtu 9000ip link set eth0 mtu 9000
route -nip route
route add default gw 172.17.0.1ip route add default via 172.17.0.1
route add -net 10.0.0.0/8 gw 172.17.0.1ip route add 10.0.0.0/8 via 172.17.0.1
arp -nip neigh
arp -s 172.17.0.199 aa:bb:cc:dd:ee:ffip neigh add 172.17.0.199 lladdr aa:bb:cc:dd:ee:ff dev eth0
netstat -iip -s link
netstat -rip route

对照要点:ip 的写法一律"对象 + 动作",地址必须带前缀长度(/24),网关用 via、出接口用 dev;Ubuntu 22.04 默认没有 net-tools,遇旧脚本报 ifconfig: command not found 时,改写比安装更值得。

五、注意事项与常见问题

Q1:ip a 里 lo 的状态是 UNKNOWN,是不是异常? 不是。state 是内核维护的操作状态(operstate),回环设备没有物理链路可探测,内核恒置 UNKNOWN(实测见 3.1:lo 为 state UNKNOWN 且 flags 含 UP,LOWER_UP)。判断回环是否可用看 flags 里的 UP,不看 state。dummy 类型接口同理(实测见 3.7:up 之后 state 仍为 UNKNOWN)。

Q2:执行 ip link add / ip addr add 报 RTNETLINK answers: Operation not permitted 怎么办? 当前用户缺少网络管理权能(CAP_NET_ADMIN)。本文在同版本 iproute2 的无权环境下实测复现了该报错形态:

$ ip link add dummy0 type dummy
RTNETLINK answers: Operation not permitted
$ ip route add blackhole 10.99.0.0/24
RTNETLINK answers: Operation not permitted

以 root 执行或加 sudo 即可解决;纯查看类命令(ip a / ip route / ip neigh)不需要特权。

Q3:ip addr add 配的地址、ip route add 加的路由,重启后还在吗? 不在。ip 的所有写操作都是对内核的即时修改,不持久化。持久化要写发行版的网络配置:Ubuntu 22.04 用 Netplan(/etc/netplan/*.yaml 声明后 netplan apply),或 systemd-networkd、NetworkManager 的连接配置。本文的 dummy0 与临时地址/路由之所以敢直接在环境里演示,正是利用了"不落盘、用后即清"的特性。

Q4:删除一个地址,路由会跟着消失吗? 会,且只删"proto kernel"的直连路由。实测(见 3.13):ip addr del 10.55.0.1/24 dev dummy0 后,10.55.0.0/24 dev dummy0 proto kernel scope link src 10.55.0.1 自动消失;而手工 ip route add 的静态路由不会受地址删除影响,需要显式 ip route del。

Q5:ip neigh 里的 REACHABLE / STALE / FAILED / PERMANENT 分别是什么意思? 它们是邻居条目的状态机:REACHABLE 最近验证过可达(实测:ping 网关后条目为 REACHABLE,见 3.14);STALE 曾经可达但超时未再验证,下次发包会转入探测;DELAY/PROBE 内核正在延迟/主动探测;FAILED ARP 请求无应答(对端不在线);PERMANENT 手工静态条目永不过期(实测:ip neigh add 后为 PERMANENT,见 3.14)。看到 STALE 不必紧张,发包即会刷新;看到 FAILED 才需要排查二层连通性。

Q6:ip route get 127.0.0.1 输出里的 local 和 cache <local> 是什么? 内核路由是多表体系:本机自己的地址记录在 local 表(id 255)。ip route get 127.0.0.1 命中的是 local 表里的 local 127.0.0.1 dev lo 条目(完整 local 表实测见 3.10 拓展),cache <local> 标注该查询结果来源于 local 表。想验证可对照 ip route show table local。

Q7:ip addr show 不存在的设备 与 ip link show type 无匹配 行为为何不同? 前者是明确的用户错误:输出 Device "nosuchif" does not exist. 且 rc=1(实测见 3.6);后者是合法查询的空结果:无输出、rc=0(实测见 3.6/3.13)。脚本化判断时应分别处理——用 rc 区分"查询失败"与"结果为空"。

六、参考链接