1.1 你认全了接口,而且已经用了不少 ip 命令。这章把 iproute2 这套工具系统讲清——它的四个核心子命令 link / addr / route / rule,恰好对应 Phase 0 学的几层:配接口、配地址、配路由、配"选哪张路由表"。学完这四件套,一台 Linux 的网络行为你就能徒手全盘掌控。
iproute2:Linux 现代的网络配置工具集,核心命令 ip 用统一的"对象 + 动作"语法,管接口、地址、路由、策略——取代了老旧的 ifconfig / route / netstat。
1iproute2:一个命令统管网络栈
老一套工具(net-tools)各管一摊、且已停止维护:ifconfig 管接口/地址、route 管路由、netstat 管连接、arp 管 ARP 表。新一套 iproute2 用一个 ip 全包了,功能还更全(策略路由、多路由表这些老工具根本做不了)。语法统一成:
ip [选项] 对象 动作 [参数]
# ↑link/addr/route/rule… ↑show/add/del/set…
对象就是四件套 link / addr / route / rule(还有 neigh、netns 等,0.2/0.3 你已用过 ip neigh、ip netns)。动作通常是 show / add / del / set。给知道 ifconfig 的人一张新旧对照:
| 你想做的 | 老命令(已弃) | iproute2 |
|---|---|---|
| 看接口 / 地址 | ifconfig | ip addr |
| 启用接口 | ifconfig eth0 up | ip link set eth0 up |
| 看路由表 | route -n | ip route |
| 加路由 | route add … | ip route add … |
| 看 ARP / 邻居 | arp -a | ip neigh |
| 看连接 | netstat -tn | ss -tn |
ip 后面第一个词先回答"我要操作哪一层的对象":link 是接口(二层设备),addr 是地址(三层),route 是转发表,rule 是"选表的规则"。下面就按这个顺序展开。
2ip link:接口本身
ip link 操作接口这个"设备"本身——启停、改名、改 MTU、改 MAC,不碰 IP。
ip link show # 列出接口(1.1 用过)
ip link set eth0 up # 启用 / down 禁用
ip link set eth0 mtu 1400 # 改 MTU(回想 0.2 的 1500)
ip link set eth0 address 02:11:22:33:44:55 # 改 MAC(0.2 说的可改/伪造)
ip link set eth0 down && ip link set eth0 name wan0 # 改名(需先 down)
关键:ip link 管的是"这块网卡开不开、MTU 多大、MAC 是什么、叫什么名",不涉及 IP。给它配 IP 是下一个命令的事。
1.1 造 bridge / veth / vlan,用的全是 ip link(ip link add … type bridge/veth/vlan)。netifd 在路由器上配接口,底层就是一连串 ip link 调用——先把设备建起来、配好,再交给后面的命令配地址和路由。
3ip addr:给接口配地址
ip addr 把 IP 地址(带 CIDR 前缀)绑到接口上。回想 0.3:IP + 子网掩码(/24)。这里就是把它配到接口:
ip addr show # 看所有接口地址(简写 ip a)
ip addr add 192.168.1.10/24 dev eth0 # 配一个地址(/24 就是 0.3 的掩码)
ip addr add 192.168.1.11/24 dev eth0 # 同一接口再配一个 → 一机多址
ip addr del 192.168.1.10/24 dev eth0 # 删
配地址时带 /24,内核会自动给这个接口添一条直连路由。0.3 实验里 h1 路由表那条 10.0.1.0/24 dev v-h1 proto kernel scope link,就是 ip addr add 顺手生成的——你只配了地址,内核替你把"这个网段直连可达"的路由也加上了。地址和直连路由,本就是绑在一起的。
4ip route:决定包往哪走
ip route 操作路由表——0.3 那张"目标网段 → 下一跳"的表,按 longest prefix match 选路。现在你亲手操作它:
ip route show # 看路由表(简写 ip r);0.3 读过它的输出
ip route add 10.0.2.0/24 via 192.168.1.1 # 去 10.0.2.0/24 交给网关
ip route add default via 192.168.1.1 dev eth0 # 默认路由(0.3 的 default = 0.0.0.0/0)
ip route del 10.0.2.0/24 # 删
ip route get 8.8.8.8 # 神器:问内核“这目标会怎么走”
ip route get 特别有用:你不用自己推,直接让内核告诉你某个目标 IP 会匹配哪条路由、从哪个接口出、下一跳是谁——把 0.3 的 longest prefix match 当场演示出来。还记得 0.3 实验里 ip -n h1 route add default via 10.0.1.1 吗?正是这个命令,在 namespace 里加默认路由让 h1 能出网段。
路由器的核心工作就是维护这张表。WAN 口从 DHCP / PPPoE 拿到的那条默认路由,本质就是一条 ip route add default via <ISP 网关>。但如果你想做更细的控制——某些流量走这条线、某些走那条——只靠目的 IP 不够了,就轮到下一个命令。
5ip rule:选哪张路由表(策略路由)
这是四件套里唯一的新概念(前三个 Phase 0 都铺过)。ip rule 决定"一个包该查哪张路由表"——让你能按源地址、按标记走不同的路,而不只看目的地。
默认系统只用一张主表(main),所有包都按目的 IP 查它(0.3 那套)。但有时你想:来自某个网段的流量走线路 A、其余走线路 B——这叫策略路由(policy routing),目的 IP 一样也能走不同路。机制是:可以有多张路由表(每张都是 0.3 那样一套规则);ip rule 是一串按优先级匹配的"规则",决定一个包去查哪张表。
ip rule show # 看规则(默认有 local / main / default 三条)
# 例:让来自 192.168.50.0/24 的流量,改查 100 号表
ip route add default via 10.0.0.1 table 100 # ① 在 100 号表里放一条默认路由
ip rule add from 192.168.50.0/24 table 100 # ② 加规则:这个源网段查 100 表
ip route get 8.8.8.8 from 192.168.50.1 # ③ 验证:带上源地址看它走哪条
匹配条件不止源地址,还能按入接口(iif)、防火墙标记(fwmark,标记由 nftables 打,1.3 讲)。典型用途:多 WAN 分流、VPN 分流(某些流量走 wg0、其余走默认)、DNS 分流的底层之一。
把 main 表想成默认的路由函数,ip rule 就是前置的一串 if:if 源地址匹配 → 用这张表;else → 用那张表。它在 0.3 的"查路由表"之前,先决定"查哪张路由表"。多了这一层,目的地相同的包也能被分流到不同线路。
本课程后面 2.7 的策略路由、DNS 分流、透明代理,底层全靠 ip rule + 多路由表 + fwmark(标记由 nftables 打,1.3 讲)。这也是家宽多线负载均衡、按域名/IP 分流的核心机制——OpenWRT 的相关功能,最终都落到这套内核能力上。
本章小结
- iproute2 的
ip用"对象 + 动作"统管网络栈,取代 ifconfig / route / netstat;对象即四件套。 - ip link:接口设备本身(up/down、MTU、MAC、改名、建虚拟接口);不碰 IP。
- ip addr:把带 CIDR 的 IP 绑到接口;顺带自动生成直连路由(解开 0.3 那条 scope link 之谜)。
- ip route:操作路由表(0.3),
ip route get直接看 LPM 选路结果。 - ip rule:策略路由——按源 / 标记选"查哪张表",在"查路由"之前多一层判断;多 WAN、VPN 分流的核心。
- 心智模型:link 配设备 → addr 配地址(+直连路由) → route 配转发 → rule 配选表规则。
动手练习
- 跑
ip route get 8.8.8.8和ip route get 127.0.0.1,对照输出说出:各走哪个接口、下一跳是谁、为什么(回想 0.3 的 default vs 直连)。 - 给一个接口临时加一个第二地址(
ip addr add …/24 dev …),用ip addr确认有了两个 IP;再ip route看是否多了一条直连路由;清理掉。 - 思考题:
ifconfig和ip addr都能看地址,为什么本课程一律用ip?(提示:net-tools 停维护 + 策略路由 / 多表这类功能它根本做不了。) - 进阶:用 ip rule + 一张自定义表做一个最小策略路由,让带某个
from源地址的ip route get走一条和默认不同的路由,观察from参数怎么改变结果。