文章目录
-
- 一、简介
- 二、用法
- 三、常用对象
-
- [1、`addr` --- 管理 IP 地址](#1、
addr— 管理 IP 地址) - [2. `link` --- 管理网络设备](#2.
link— 管理网络设备) - [3. `route` --- 管理路由表](#3.
route— 管理路由表) - [4. `rule` --- 管理路由策略规则](#4.
rule— 管理路由策略规则) - [5. `neigh` --- 管理邻居表](#5.
neigh— 管理邻居表) - [6. `tunnel` --- 配置隧道](#6.
tunnel— 配置隧道) - [7. `netns` --- 网络命名空间管理](#7.
netns— 网络命名空间管理)
- [1、`addr` --- 管理 IP 地址](#1、
- 四、组合场景
一、简介
ip是 Linux 系统中用于配置和管理网络接口、路由、策略路由、隧道、地址等网络功能的核心命令行工具。它是iproute2工具集的一部分,旨在替代老旧的ifconfig、route、arp等命令。
ifconfig/route/arp(属于net-tools套件) :
- 主要通过读取和写入
/proc和/sys文件系统中的伪文件(如/proc/net/dev、/proc/net/route、/proc/net/arp)来获取或配置网络状态。- 这些接口由内核以文本格式暴露,工具需进行大量字符串解析和格式转换,效率较低。
- 每次调用都触发完整的文件读取和解析流程,无法高效处理大规模网络配置(如数百个 IP 地址或路由条目)。
- 功能设计基于较旧的 BSD 网络模型,不支持现代 Linux 内核的高级网络特性(如策略路由、多地址接口、VRF、网络命名空间等)。
- 自 2001 年起基本停止维护,与当前内核网络栈发展脱节。
ip(属于iproute2工具集) :
- 使用 Netlink sockets (特别是
NETLINK_ROUTE协议族)直接与内核的网络子系统通信。- 能以二进制结构体的形式高效读写网络配置数据(如接口属性、地址、路由表、邻居项等),避免了文本解析开销。
- 数据直接来自内核的
rtnetlink、neigh、addr等核心数据结构,实时性高、精度高、性能优。- 原生支持现代网络功能:策略路由、多播、隧道、VLAN、VXLAN、网络命名空间、IPv6 全面管理等。
- 设计模块化,命令结构统一(如
ip addr、ip route、ip link、ip rule),便于脚本化和自动化运维。
二、用法
bash
ip [选项] 对象 {命令 | help}
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename
where OBJECT := { address | addrlabel | fou | help | ila | 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 | -I | -D | -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]}
1、对象
| 对象(OBJECT) | 简要说明 |
|---|---|
address (addr) |
管理接口 IP 地址。 |
| link | 管理网络接口状态、MTU、MAC 等。 |
| route | 查看/配置 IP 路由表。 |
neighbor (neighbour) |
查看/管理 ARP 或 NDP 表。 |
| netns | 管理网络命名空间。 |
| rule | 配置策略路由规则。 |
| monitor | 实时监听网络配置变化(调试用,但非常实用)。 |
| nexthop | 管理可复用的下一跳对象(现代高级路由架构)。 |
| tcpmetrics | 查看 TCP 连接性能缓存(排错时有用)。 |
| netconf | 查看协议级内核网络参数(如 IPv6 转发设置)。 |
ntable (ntbl) |
调整邻居表底层行为(高级调优,较少用)。 |
| maddress | 管理多播 MAC 地址(特殊硬件或多播调试)。 |
| mroute | 多播路由表(需内核支持,企业/视频流场景)。 |
| mrule | 多播策略路由规则(配合 mroute 使用)。 |
| l2tp | 配置 L2TP 隧道(用于某些 VPN 场景)。 |
| fou | Foo over UDP 封装(用于自定义隧道,如 GUE)。 |
| macsec | 配置 IEEE 802.1AE 链路层加密(高安全网络)。 |
| sr | Segment Routing(SRv6),用于新型广域网架构。 |
| ila | Identifier-Locator Addressing(大规模虚拟化网络实验性功能)。 |
| mptcp | Multipath TCP 管理(需 MPTCP 内核支持,仍较新)。 |
| tap | 创建 TAP 设备(通常由虚拟化工具如 QEMU 自动管理,手动较少)。 |
| addrlabel | IPv6 地址标签(极少见,主要用于特定策略路由)。 |
| help | 显示帮助(功能性对象,非配置用途)。 |
如需深入了解某个对象,可运行:
ip OBJECT help某些对象(如
ila、sr、mptcp)需要特定内核配置或较新版本才可用。
2、选项
| 选项 | 简要说明 |
|---|---|
-4 |
仅操作 IPv4 地址或路由。 |
-6 |
仅操作 IPv6 地址或路由。 |
-s (--statistics) |
显示接口或协议的统计信息(如 RX/TX 字节、错误包数)。 |
-d (--details) |
显示更详细的输出信息(如时间戳、标志位等)。 |
-r (--resolve) |
尝试将 IP 地址反向解析为主机名(仅用于显示,不影响配置)。 |
-br (--brief) |
以简洁格式输出(常用于脚本处理)。 |
-j (--json) |
以 JSON 格式输出结果(便于程序解析,需 iproute2 ≥ v5.7)。 |
-n (--netns) |
在指定的网络命名空间中执行命令。 |
-N (--numeric) |
以数字形式显示地址和标识符(不解析服务名或主机名)。 |
-o (--oneline) |
将每条记录强制输出为单行(便于 grep 或 awk 处理)。 |
-t (--timestamp) |
在 monitor 模式下为每条输出添加时间戳。 |
-a (--all) |
显示所有对象(即使处于 DOWN 状态的接口等)。 |
-f (--family) |
指定地址族(如 inet, inet6, mpls, bridge, link)。 |
-h (--human-readable) |
以可读单位(如 K、M)显示字节数或速率。 |
-iec |
使用 IEC 单位(KiB、MiB)而非 SI 单位(KB、MB)显示大小。 |
-p (--pretty) |
与 -j 配合使用时美化 JSON 输出(缩进格式)。 |
-l (--loops) |
设置刷新地址时的最大重试次数(用于批量操作容错)。 |
-b (--batch) |
从文件中批量读取并执行 ip 命令。 |
-rcvbuf |
设置 Netlink 接收缓冲区大小(用于处理大量数据时避免溢出)。 |
-ts (--tshort) |
在 monitor 模式下使用短格式时间戳。 |
-c (--color) |
启用彩色输出(部分终端支持)。 |
-V (--Version) |
显示 ip 工具的版本信息。 |
-I, -D, -M, -B, -0 |
分别是 -f inet、-f decnet、-f mpls、-f bridge、-f link 的快捷别名(极少单独使用)。 |
允许使用【唯一前缀缩写】 来表示对象------ 只要该前缀能【无歧义地匹配一个对象名】。如果对象名称不记得,也能按【TAB】键自动补全。
例如:
address→ 可缩写为a(因为没有其他对象以a开头)link→l(但注意:l2tp也以l开头,所以l不能 安全缩写为link!)
三、常用对象
1、addr --- 管理 IP 地址
| 子命令 | 简要说明 |
|---|---|
show |
显示网络接口的 IP 地址信息(默认子命令,可省略)。 |
add |
为指定接口添加一个 IP 地址。 |
del |
从指定接口删除一个已配置的 IP 地址。 |
flush |
批量清空符合指定条件的 IP 地址(如清空某接口或某协议族的所有地址)。 |
replace |
添加 IP 地址,若已存在则替换其属性(如有效期、作用域等)。 |
change |
修改现有 IP 地址的属性(如标签、作用域),但不改变地址本身。 |
save |
将当前地址配置以二进制格式保存到标准输出(供 restore 使用)。 |
restore |
从标准输入读取由 save 生成的数据并恢复地址配置。 |
showdump |
以可解析的文本格式(类似 dump)输出地址信息,用于备份或迁移。 |
flush常用于脚本中清理配置,操作不可逆,需谨慎使用。
常用示例:
bash
# 查看所有接口的 IP 地址
ip addr show
# 查看特定接口(如 eth0)的地址
ip addr show dev eth0
# 为 eth0 添加 IPv4 地址
ip addr add 192.168.1.100/24 dev eth0
# 添加 IPv6 地址
ip -6 addr add 2001:db8::1/64 dev eth0
# 删除 IP 地址
ip addr del 192.168.1.100/24 dev eth0
# 清空 eth0 上的所有 IPv4 地址(谨慎!)
ip -4 addr flush dev eth0
2. link --- 管理网络设备
| 子命令 | 简要说明 |
|---|---|
show |
显示网络接口的链路层信息(状态、MTU、MAC 地址等)。 |
set |
修改网络接口的属性(如启用/禁用、更改 MTU、MAC、别名、VRF 绑定等)。 |
add |
创建新的虚拟网络设备(如 veth、vlan、vxlan、bridge 等)。 |
delete |
删除已存在的虚拟网络设备。 |
xstats |
显示特定类型设备的扩展统计信息(如 VXLAN、bond 的详细计数器)。 |
afstats |
显示接口按地址族(AF)划分的协议统计信息(较少使用)。 |
property |
管理接口的附加属性,如添加或删除备用名称(altname)。 |
help |
显示指定设备类型(TYPE)的详细帮助信息。 |
show是默认子命令(执行ip link等价于ip link show)。
常用示例:
bash
# 列出所有网络接口
ip link show
# 启用/禁用接口
ip link set eth0 up
ip link set eth0 down
# 修改 MTU
ip link set eth0 mtu 9000
# 修改 MAC 地址
ip link set eth0 address 00:11:22:33:44:55
# 创建虚拟以太网对(常用于容器)
ip link add veth0 type veth peer name veth1
# 删除虚拟接口
ip link delete veth0
3. route --- 管理路由表
show(或 list) |
显示当前系统的 IP 路由表内容(默认子命令,show 与 list 功能等价)。 |
|---|---|
add |
向路由表中添加一条静态路由。 |
del |
从路由表中删除指定的路由条目。 |
get |
模拟查询内核如何路由一个目标地址(用于路径决策调试)。 |
replace |
添加路由,若已存在则替换原有条目。 |
change |
修改已存在的路由条目(要求路由必须已存在)。 |
flush |
批量清空符合条件的路由条目(如清空某表或某协议来源的路由)。 |
save |
将当前路由表以二进制格式导出到标准输出(供 restore 使用)。 |
restore |
从标准输入恢复由 save 导出的路由配置。 |
showdump |
以结构化文本格式输出路由表内容,便于解析或备份。 |
append |
在多路径路由中追加一个新的下一跳(较少使用)。 |
常用示例:
bash
# 查看主路由表
ip route show
# 添加默认网关
ip route add default via 192.168.1.1
# 添加到特定网络的路由
ip route add 10.0.0.0/8 via 192.168.1.254 dev eth0
# 添加主机路由
ip route add 192.168.5.100 via 192.168.1.1
# 删除路由
ip route del 10.0.0.0/8
# 清空所有路由(危险!慎用)
ip route flush table main
4. rule --- 管理路由策略规则
| 子命令 | 简要说明 |
|---|---|
list |
显示当前系统中的策略路由规则列表(默认行为)。 |
add |
添加一条新的策略路由规则。 |
del |
删除一条已存在的策略路由规则。 |
flush |
清空所有策略路由规则(通常保留内核默认的三条基础规则)。 |
save |
将当前策略路由规则以二进制格式导出到标准输出(供 restore 使用)。 |
restore |
从标准输入恢复由 save 导出的策略路由规则。 |
常用示例:
bash
# 查看当前规则
ip rule show
# 添加规则:源地址 192.168.2.0/24 使用 table 100
ip rule add from 192.168.2.0/24 table 100
# 添加规则:目标地址使用特定表
ip rule add to 203.0.113.0/24 table 200
# 删除规则
ip rule del from 192.168.2.0/24 table 100
5. neigh --- 管理邻居表
| 子命令 | 简要说明 |
|---|---|
show |
显示当前系统的邻居缓存表(ARP 表或 IPv6 NDP 表),默认行为。 |
flush |
批量清空符合条件的邻居条目(如指定设备或状态)。 |
get |
查询内核中特定 IP 地址对应的邻居项状态(用于调试解析过程)。 |
add |
手动添加一个静态邻居条目(如静态 ARP 绑定)。 |
del |
删除指定的邻居条目。 |
change |
修改现有邻居条目的属性(如链路层地址或状态),要求条目已存在。 |
replace |
添加邻居条目,若已存在则覆盖其内容。 |
状态说明:
reachable:可达stale:陈旧delay/probe:正在探测failed:失败permanent:静态条目
常用示例:
bash
# 查看 ARP 表(IPv4)
ip neigh show
# 查看 NDP 表(IPv6)
ip -6 neigh show
# 手动添加 ARP 条目
ip neigh add 192.168.1.50 lladdr 00:11:22:33:44:55 nud permanent dev eth0
# 删除邻居条目
ip neigh del 192.168.1.50 dev eth0
# 刷新过期条目
ip neigh flush dev eth0
6. tunnel --- 配置隧道
show |
显示系统中已配置的 IP 隧道设备列表及其参数(默认行为)。 |
|---|---|
add |
创建一个新的 IP 隧道设备(如 GRE、IPIP、SIT 等)。 |
del |
删除指定的 IP 隧道设备。 |
change |
修改现有隧道设备的运行时参数(如 remote/local 地址、TTL、key 等)。 |
prl |
管理 ISATAP 隧道的潜在路由器列表(Potential Router List)。 |
6rd |
配置或修改 6rd(IPv6 Rapid Deployment)隧道的前缀和中继参数 |
常用示例:
bash
# 创建 GRE 隧道
ip tunnel add gre1 mode gre remote 203.0.113.10 local 192.0.2.1 ttl 255
# 启用隧道接口
ip link set gre1 up
# 为隧道分配 IP
ip addr add 10.10.10.1/30 dev gre1
# 删除隧道
ip tunnel del gre1
7. netns --- 网络命名空间管理
网络命名空间(Network Namespace)是 Linux 内核提供的一种轻量级隔离机制,它为每个命名空间创建独立的网络协议栈,包括网络接口、IP 地址、路由表、防火墙规则和端口空间。其核心作用是实现进程间网络资源的完全隔离,使得不同命名空间中的应用程序可以拥有各自独立且互不干扰的网络环境,广泛应用于容器技术(如 Docker、Kubernetes)、网络仿真测试和安全沙箱等场景。
| 子命令 | 简要说明 |
|---|---|
list |
列出系统中所有已创建的网络命名空间(默认行为)。 |
exec |
在指定的网络命名空间中执行命令。 |
add |
创建一个新的网络命名空间。 |
delete |
删除一个或全部网络命名空间。 |
pids |
显示当前使用指定网络命名空间的所有进程 PID。 |
identify |
根据 PID 查询其所属的网络命名空间名称(若存在)。 |
attach |
将一个已有进程绑定到指定的网络命名空间(需内核支持)。 |
set |
为网络命名空间设置固定的内核 netns ID(用于跨命名空间引用)。 |
list-id |
列出系统中已分配的网络命名空间 ID(netnsid)映射关系。 |
monitor |
实时监听网络命名空间的创建与删除事件。 |
常用示例:
bash
# 列出所有命名空间
ip netns list
# 创建命名空间
ip netns add ns1
# 在命名空间中执行命令
ip netns exec ns1 ip addr show
# 将接口移入命名空间
ip link set eth1 netns ns1
# 删除命名空间
ip netns del ns1
四、组合场景
bash
# 快速查看本机 IP(类似 ifconfig)
ip a
# 查看默认路由
ip route show default
# 查看某接口的统计信息(带 -s)
ip -s link show eth0
# 一次性启用接口并配置 IP
ip link set eth0 up && ip addr add 192.168.1.10/24 dev eth0
# 导出当前网络配置(用于备份)
ip addr show > ip_addr_backup.txt
ip route show > ip_route_backup.txt
# 实时监控网络配置变更
ip monitor
# 精准诊断路由路径
ip route get 8.8.8.8