🔍搜索⌘K

Linux ip 命令完全指南:从基础操作到网络配置实战

概述

在 Linux 里管网络,ip 命令是现在新一代的配置工具,用来顶替老一套的 ifconfig、route、arp 这些命令(有些发行版已经默认不带 ifconfig 了)。它比老工具更猛、支持的网络特性也更全(像网络命名空间、VLAN、隧道这些),能一站式搞定”IP 地址管理、链路状态控制、路由配置、网络隔离”这些核心活,是搞 Linux 运维、开发的人的标配。

ip 命令最大的几个好处:

  1. 功能一把抓:把地址、链路、路由、邻居、命名空间这些网络管理模块全整合了,不用在好几个命令之间来回切;
  2. 支持现代网络特性:对 VLAN、Bridge、Open vSwitch、网络命名空间这类虚拟化 / 隔离技术支持得更到位;
  3. 输出规整:结果好解析(还能用 -j 输出 JSON 格式),写脚本自动化很方便;
  4. 系统自带:属于 iproute2 工具集(大多数发行版都预装了),不用额外装。

一、核心模块 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 命令所有的改动默认都是临时生效(重启网络服务或者系统就丢了),想永久生效,得按发行版去改对应的配置文件(比如 Ubuntu 用 Netplan,CentOS 用 NetworkManager);
  • 权限问题:改 IP、路由、命名空间这些操作都得要 root 权限(或者 sudo),普通用户跑会报 “Permission denied”;
  • 接口名别搞错:不同发行版的网卡名可能不一样(比如 Ubuntu 可能是 enp0s3,CentOS 可能是 eth0),动手前先用 ip l 确认实际的接口名,别操作错网卡。

六、总结

ip 命令就是 Linux 网络管理里的”多面手”,把它的核心模块(addr/link/route/netns)摸熟,日常九成以上的网络操作都够用了。建议先从”看信息”(ip a/ip r)上手,慢慢熟悉”改配置”(加 IP、设路由),最后再碰”进阶功能”(网络命名空间),在实操里加深理解。

对于传统 ifconfig 用户,可通过下表快速对应 ip 命令:

传统命令(ifconfig/route)对应的 ip 命令
ifconfig eth0ip a show dev eth0
ifconfig eth0 192.168.0.1/24ip addr add 192.168.0.1/24 dev eth0
ifconfig eth0 up/downip link set dev eth0 up/down
route -nip r
route add -net 192.168.1.0/24 gw 192.168.0.1ip route add 192.168.1.0/24 via 192.168.0.1