5.0 KiB
5.0 KiB
tags, create time
| tags | create time | ||||
|---|---|---|---|---|---|
|
2026-05-18 01:00 |
静态路由与默认网关
概述
路由是数据包从源到目的地所经历的路径选择过程。Linux 内核维护着一张路由表,每收到一个包就查表决定下一跳。最基础也是最常用的就是静态路由和默认网关。
Linux 路由表结构
$ 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 那条
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
默认网关
默认网关是所有未知目的地的兜底路径:
# 查看当前默认网关
$ 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
多默认网关(负载均衡与故障转移)
# 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
静态路由配置
基本语法
# 格式: 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+)
# /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、端口、协议等条件选择不同路由表:
# 创建自定义路由表
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 走不同路径
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 自动生成路由项,无需手动配置