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

5.0 KiB
Raw Blame History

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

关联笔记