Init
This commit is contained in:
@@ -0,0 +1,166 @@
|
||||
---
|
||||
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 自动生成路由项,无需手动配置
|
||||
Reference in New Issue
Block a user