167 lines
5.0 KiB
Markdown
167 lines
5.0 KiB
Markdown
|
|
---
|
|||
|
|
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 自动生成路由项,无需手动配置
|