Files
cs-note/hhs/NETWORK/03-网络层/06-静态路由与默认网关.md
T
2026-05-24 11:42:38 +08:00

167 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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<br/>via 10.0.0.3 ✅"]
C -->|"否"--> C2{"/24 match?"}
C2 -->|"是"| R2["10.0.0.0/24<br/>via 10.0.0.2 ✅"]
C2 -->|"否"| C8{"/8 match?"}
C8 -->|"是"| R1["10.0.0.0/8<br/>via 10.0.0.1 ✅"]
C8 -->|"否"| D["default route<br/>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<br/>10.0.0.1"]
Rule -->|"db-table → eth2"| DBRouter["DB Router<br/>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 自动生成路由项,无需手动配置