Linux ip 命令完全指南:从基础操作到网络配置实战
概述
在 Linux 网络管理中,ip 命令是 新一代网络配置工具,旨在替代传统的 ifconfig、route、arp 等命令(部分 Linux 发行版已默认移除 ifconfig)。它功能更强大、支持的网络特性更全面(如网络命名空间、VLAN、隧道等),能一站式完成 “IP 地址管理、链路状态控制、路由配置、网络隔离” 等核心操作,是 Linux 运维、开发人员必备的网络工具。
ip 命令的核心优势:
- 功能全覆盖:整合了地址、链路、路由、邻居、命名空间等网络管理模块,无需切换多个命令;
- 支持现代网络特性:对 VLAN、Bridge、Open vSwitch、网络命名空间等虚拟化 / 隔离技术的支持更完善;
- 输出格式规范:结果易于解析(可通过 -j 输出 JSON 格式),便于脚本自动化处理;
- 系统原生支持:属于 iproute2 工具集(多数 Linux 发行版预装),无需额外安装。
一、核心模块 1:ip addr(IP 地址管理)
ip addr(缩写 ip a)是 ip 命令最常用的模块,负责 IP 地址的查看、添加、删除、修改,涵盖传统 ifconfig 的核心功能。
1. 查看所有网络接口的 IP 信息(最常用)
# 完整命令:查看所有网络接口的详细 IP 配置(包括 IPv4/IPv6、MAC 地址、接口状态)
ip addr
# 缩写命令:功能与 ip addr 完全一致,日常操作更简洁
ip a
# 过滤指定接口:仅查看 eth0 的 IP 信息(避免输出过多)
ip a show dev eth0 # 或 ip addr show eth0
输出关键信息解读:
- eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> ...:eth0 为接口名,<UP> 表示接口已启用;
- link/ether 00:16:3e:xx:xx:xx brd ff:ff:ff:ff:ff:ff:接口的 MAC 地址;
- inet 192.168.0.100/24 brd 192.168.0.255 scope global eth0:IPv4 地址(192.168.0.100)、子网掩码(/24 即 255.255.255.0)、广播地址;
- inet6 fe80::216:3eff:fexx:xxxx/64 scope link:IPv6 链路本地地址。
2. 给网络接口添加 IP 地址
# 基本格式:ip addr add [IP/子网掩码] dev [接口名]
# 示例1:给 eth0 添加 IPv4 地址 192.168.0.1,子网掩码 /24(临时生效,重启后消失)
ip addr add 192.168.0.1/24 dev eth0
# 示例2:给 eth0 添加第二个 IP(同一接口可配置多个 IP,即“别名 IP”)
ip addr add 192.168.0.2/24 dev eth0
# 示例3:添加 IPv6 地址(需确保系统支持 IPv6)
ip addr add 2001:db8::1/64 dev eth0
注意:以上命令为 临时配置,若需永久生效,需写入系统网络配置文件(如 Ubuntu 的 /etc/netplan/*.yaml、CentOS 的 /etc/sysconfig/network-scripts/ifcfg-eth0)。
3. 删除网络接口的 IP 地址
# 基本格式:ip addr del [IP/子网掩码] dev [接口名]
# 示例:删除 eth0 上的 192.168.0.2/24 地址
ip addr del 192.168.0.2/24 dev eth0
# 清空接口所有 IP(谨慎使用,会删除该接口的所有 IPv4/IPv6 地址)
ip addr flush dev eth0
二、核心模块 2:ip link(链路状态控制)
ip link(缩写 ip l)用于管理 网络接口的物理链路属性,如 “启用 / 禁用接口、修改 MAC 地址、设置 MTU 大小” 等,对应传统 ifconfig 的链路控制功能。
1. 查看所有网络接口的链路状态
# 完整命令:查看所有接口的链路信息(MAC 地址、状态、MTU 等)
ip link
# 缩写命令:功能一致,更简洁
ip l
# 过滤指定接口:仅查看 eth0 的链路状态
ip l show dev eth0
输出关键信息解读:
- state UP/DOWN:接口状态(UP 启用,DOWN 禁用);
- mtu 1500:最大传输单元(默认 1500 字节,适用于以太网,VPN 场景可能需调整为 1400 等);
- link/ether 00:16:3e:xx:xx:xx:MAC 地址(硬件地址)。
2. 启用 / 禁用网络接口(常用操作)
# 启用接口(对应传统 ifconfig eth0 up)
ip link set dev eth0 up
# 禁用接口(对应传统 ifconfig eth0 down,禁用后接口无 IP,无法联网)
ip link set dev eth0 down
# 验证结果:查看接口状态是否变为 UP/DOWN
ip l show dev eth0 | grep state
3. 修改接口的 MTU 大小
MTU(Maximum Transmission Unit)是接口一次能传输的最大数据包大小,过大可能导致数据包分片,过小则降低传输效率,需根据网络环境调整(如 PPPoE 网络常用 MTU 1492)。
# 基本格式:ip link set dev [接口名] mtu [数值]
# 示例:将 eth0 的 MTU 设置为 1500(以太网默认值)
ip link set dev eth0 mtu 1500
# 验证结果:查看 MTU 是否生效
ip l show dev eth0 | grep mtu
4. 修改接口的 MAC 地址(临时)
MAC 地址是网络接口的硬件标识,特殊场景下需临时修改(如测试网络设备兼容性):
# 注意:修改前需先禁用接口(否则报错)
ip link set dev eth0 down
# 修改 MAC 地址(格式需符合 MAC 地址规范,如 00:11:22:33:44:55)
ip link set dev eth0 address 00:11:22:33:44:55
# 重新启用接口
ip link set dev eth0 up
# 验证结果:查看新的 MAC 地址
ip l show dev eth0 | grep link/ether
注意:此修改为临时生效,重启后会恢复默认 MAC 地址;永久修改需编辑系统网络配置文件。
三、核心模块 3:ip route(路由表管理)
ip route(缩写 ip r)用于 查看和配置系统路由表,决定 “数据包从哪个接口发送到目标网络”,对应传统 route 命令的功能,是实现跨网段通信的核心。
1. 查看系统当前路由表(最常用)
# 完整命令:查看所有路由规则(目标网络、网关、接口、优先级等)
ip route
# 缩写命令:日常操作首选,输出更简洁
ip r
输出关键信息解读(以典型路由为例):
- default via 192.168.0.1 dev eth0 proto dhcp src 192.168.0.100 metric 100:
- default:默认路由(所有未匹配其他路由的数据包,均通过此路由转发);
- via 192.168.0.1:网关地址(数据包需先发送到网关);
- dev eth0:出接口(通过 eth0 发送数据包);
- src 192.168.0.100:源 IP(发送数据包时使用的本地 IP);
- 192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.100 metric 100:
- 本地局域网路由(目标为 192.168.0.0/24 网段的数据包,直接通过 eth0 转发,无需网关)。
2. 添加静态路由(跨网段通信必备)
当需要访问 “非本地网段”(如 192.168.1.0/24)且无默认网关时,需手动添加静态路由:
# 基本格式:ip route add [目标网络/子网掩码] via [网关地址] dev [出接口]
# 示例:访问 192.168.1.0/24 网段,通过网关 192.168.0.254、接口 eth0 转发
ip route add 192.168.1.0/24 via 192.168.0.254 dev eth0
# 验证结果:查看路由是否添加成功
ip r | grep 192.168.1.0
3. 删除静态路由
# 基本格式:ip route del [目标网络/子网掩码]
# 示例:删除 192.168.1.0/24 网段的路由
ip route del 192.168.1.0/24
# 清空所有路由(谨慎使用,会删除所有路由规则,导致无法联网)
ip route flush all
四、核心模块 4:ip netns(网络命名空间)
ip netns 是 Linux 提供的 网络隔离工具,可创建 “独立的网络环境”(每个命名空间有自己的网卡、IP、路由、防火墙规则),常用于容器(如 Docker)、虚拟化场景的网络隔离,是进阶运维的重要功能。
1. 查看当前系统的网络命名空间
# 查看所有已创建的网络命名空间(默认无,需手动创建)
ip netns list
# 缩写命令:功能一致
ip netns
2. 创建 / 删除网络命名空间
# 创建命名空间:命名为“ns1”(可自定义名称)
ip netns add ns1
# 验证结果:查看命名空间是否创建成功
ip netns list # 输出:ns1
# 删除命名空间(删除前需确保无进程使用该命名空间)
ip netns delete ns1
3. 在命名空间内执行网络命令(核心用法)
网络命名空间是隔离的,需通过 ip netns exec 在指定命名空间内执行命令(如查看 IP、配置路由):
# 示例1:在 ns1 命名空间内查看网络接口(默认只有 lo 回环接口)
ip netns exec ns1 ip a
# 示例2:在 ns1 内启用 lo 回环接口(默认禁用)
ip netns exec ns1 ip link set dev lo up
# 示例3:在 ns1 内添加虚拟网卡并配置 IP(进阶操作,需配合 veth 设备)
# 1. 创建一对 veth 设备(veth-ns1 和 veth-main)
ip link add veth-ns1 type veth peer name veth-main
# 2. 将 veth-ns1 移入 ns1 命名空间
ip link set veth-ns1 netns ns1
# 3. 给 ns1 内的 veth-ns1 配置 IP
ip netns exec ns1 ip addr add 10.0.0.1/24 dev veth-ns1
# 4. 给主机的 veth-main 配置 IP 并启用
ip addr add 10.0.0.2/24 dev veth-main
ip link set dev veth-main up
# 5. 测试主机与 ns1 的连通性(ping 10.0.0.1)
ping -c 2 10.0.0.1
应用场景:模拟多主机网络环境、隔离容器网络(如 Docker 的 --net=none 配合自定义命名空间)、测试网络配置兼容性。
五、实战技巧:ip 命令常用组合与避坑指南
1. 快速排查网络问题的命令组合
# 1. 查看接口状态和 IP(确认接口是否启用、IP 是否正确)
ip a show dev eth0
# 2. 查看路由表(确认默认网关是否存在、目标网段路由是否正确)
ip r
# 3. 测试网关连通性(若 ping 不通网关,需检查网关配置或物理链路)
ping -c 2 $(ip r | grep default | awk '{print $3}')
# 4. 查看邻居表(对应传统 arp -a,确认网关 MAC 地址是否正常)
ip neigh # 或 ip n
2. 输出格式化:便于脚本解析
ip 命令支持输出 JSON 格式,便于脚本通过 jq 工具解析关键信息:
# 以 JSON 格式输出 eth0 的 IP 信息
ip -j a show dev eth0
# 结合 jq 提取 eth0 的 IPv4 地址(脚本常用)
ip -j a show dev eth0 | jq -r '.[0].addr_info[] | select(.family=="inet") | .local'
3. 避坑指南
- 临时配置 vs 永久配置:ip 命令的所有修改默认是 临时生效(重启网络服务或系统后消失),若需永久生效,需根据 Linux 发行版修改对应配置文件(如 Ubuntu 用 Netplan,CentOS 用 NetworkManager);
- 权限问题:修改 IP、路由、命名空间等操作需 root 权限(或 sudo),普通用户执行会报错 “Permission denied”;
- 接口名一致性:不同 Linux 发行版的接口名可能不同(如 Ubuntu 可能为 enp0s3,CentOS 可能为 eth0),需通过 ip l 确认实际接口名,避免操作错误接口。
六、总结
ip 命令是 Linux 网络管理的 “瑞士军刀”,掌握其核心模块(addr/link/route/netns)即可覆盖 90% 以上的日常网络操作。建议从 “查看信息”(ip a/ip r)入手,逐步熟悉 “修改配置”(添加 IP、设置路由),最后尝试 “进阶功能”(网络命名空间),在实践中加深理解。
对于传统 ifconfig 用户,可通过下表快速对应 ip 命令:
传统命令(ifconfig/route) | 对应的 ip 命令 |
---|---|
ifconfig eth0 | ip a show dev eth0 |
ifconfig eth0 192.168.0.1/24 | ip addr add 192.168.0.1/24 dev eth0 |
ifconfig eth0 up/down | ip link set dev eth0 up/down |
route -n | ip r |
route add -net 192.168.1.0/24 gw 192.168.0.1 | ip route add 192.168.1.0/24 via 192.168.0.1 |