---
tags: [计算机网络, 静态路由, 默认网关, 策略路由]
create time: 2026-05-18 01:00
---
# 静态路由与默认网关
## 概述
路由是数据包从源到目的地所经历的路径选择过程。Linux 内核维护着一张**路由表**,每收到一个包就查表决定下一跳。最基础也是最常用的就是静态路由和默认网关。
## Linux 路由表结构
```bash
$ ip route show
default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.100 metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 metric 100
10.0.0.0/8 via 10.0.0.1 dev eth1 proto static metric 200
172.16.0.0/12 dev eth2 scope link
```
### 关键字段含义
| 字段 | 说明 |
|------|------|
| `default` | 匹配所有目标(等价于 `0.0.0.0/0`),即**默认网关** |
| `via` | 下一跳的 IP 地址 |
| `dev` | 出口网卡 |
| `proto` | 路由来源:kernel/auto/static/dhcp |
| `scope` | 范围:link(直连)/ host(单主机)/ global(全局可路由)|
| `metric` | 优先级,值越小越优先 |
## 最长前缀匹配原则
当多条路由能匹配目标 IP 时,选择**前缀最长**的那条:
```
目标 IP: 10.0.0.5
路由表:
default via 192.168.1.1 → /0 (0 bits)
10.0.0.0/8 via 10.0.0.1 → /8 (8 bits) ✅ 选中!
10.0.0.0/24 via 10.0.0.2 → /24 (24 bits) ← 实际上这条更长,应该选它!
10.0.0.5/32 via 10.0.0.3 → /32 (32 bits) ← 最佳匹配!
结论: 最长前缀优先 → 选 /32 那条
```
```mermaid
flowchart TD
S["目标 IP: 10.0.0.5"] --> C{"/32 match?"}
C -->|"是"| R3["10.0.0.5/32
via 10.0.0.3 ✅"]
C -->|"否"--> C2{"/24 match?"}
C2 -->|"是"| R2["10.0.0.0/24
via 10.0.0.2 ✅"]
C2 -->|"否"| C8{"/8 match?"}
C8 -->|"是"| R1["10.0.0.0/8
via 10.0.0.1 ✅"]
C8 -->|"否"| D["default route
via 192.168.1.1 ✅"]
style R3 fill:#98FB98,color:#000
style R2 fill:#DDA0DD
style R1 fill:#FFD700
style D fill:#B0C4DE
```
## 默认网关
默认网关是所有未知目的地的兜底路径:
```bash
# 查看当前默认网关
$ ip route show default
default via 192.168.1.1 dev eth0 proto dhcp
# 添加默认网关
$ ip route add default via 192.168.1.1 dev eth0 metric 100
# 删除默认网关
$ ip route del default via 192.168.1.1
# 修改默认网关(先删后加)
$ ip route replace default via 192.168.1.254 dev eth0 metric 50
```
### 多默认网关(负载均衡与故障转移)
```bash
# ECMP(Equal-Cost Multi-Path)— 同开销的多条路径负载均衡
$ ip route add default via 10.0.0.1 dev eth0
$ ip route add default via 10.0.1.1 dev eth0
# 流量会自动在两条链路间负载均衡(基于哈希)
$ ip -d route show
default nexthop via 10.0.0.1 dev eth0 weight 1
nexthop via 10.0.1.1 dev eth0 weight 1
```
## 静态路由配置
### 基本语法
```bash
# 格式: ip route add <网络>/<掩码> via <下一跳IP> dev <网卡> metric <优先级>
$ sudo ip route add 172.16.0.0/12 via 192.168.1.1 dev eth0 metric 100
$ sudo ip route add 10.100.0.0/16 via 10.0.0.1 dev eth1 onlink
# onlink: 强制使用,即使下一跳不在同一子网
```
### 不同发行版的持久化方式
| 系统 | 配置文件 | 示例 |
|------|---------|------|
| Debian/Ubuntu | `/etc/network/interfaces` | `up ip route add ...` |
| RHEL/CentOS 7+ | `/etc/sysconfig/network-scripts/route-eth0` | `10.0.0.0/8 via 192.168.1.1` |
| Systemd-networkd | `.network` 文件 | `Route:` section |
| NetworkManager | `nmcli connection modify` | `ipv4.routes "..."` |
| Alpine | `/etc/network/interfaces` | `post-up ip route add ...` |
### Netplan (Ubuntu 18.04+)
```yaml
# /etc/netplan/01-netcfg.yaml
network:
version: 2
ethernets:
eth0:
dhcp4: true
routes:
- to: 10.100.0.0/16
via: 192.168.1.1
```
## 策略路由(Policy-Based Routing)
Linux 支持基于源 IP、端口、协议等条件选择不同路由表:
```bash
# 创建自定义路由表
echo "100 web-table" >> /etc/iproute2/rt_tables
echo "200 db-table" >> /etc/iproute2/rt_tables
# 为 web-table 添加路由
ip route add 10.0.0.0/8 via 10.0.0.1 dev eth1 table web-table
# 策略:来自 192.168.10.0/24 的流量走 web-table
ip rule add from 192.168.10.0/24 table web-table
# 效果:即使是同一个目的地,不同源 IP 走不同路径
```
```mermaid
flowchart LR
SrcA["192.168.10.5"] -->|"Source IP match"| Rule["ip rule policy"]
SrcB["192.168.20.5"] -->|"Source IP match"| Rule
Rule -->|"web-table → eth1"| WebRouter["Web Router
10.0.0.1"]
Rule -->|"db-table → eth2"| DBRouter["DB Router
10.1.0.1"]
style WebRouter fill:#DDA0DD,color:#000
style DBRouter fill:#98FB98,color:#000
```
## 关联笔记
- [[hhs/NETWORK/CIDR与子网划分]] — CIDR 前缀长度决定路由表的精确度
- [[hhs/NETWORK/NAT原理与应用]] — NAT 常作为默认网关的角色存在
- [[hhs/NETWORK/动态路由协议]] — OSPF/BGP 自动生成路由项,无需手动配置