--- 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
via 10.0.0.3 ✅"] C -->|"否"--> C2{"/24 match?"} C2 -->|"是"| R2["10.0.0.0/24
via 10.0.0.2 ✅"] C2 -->|"否"| C8{"/8 match?"} C8 -->|"是"| R1["10.0.0.0/8
via 10.0.0.1 ✅"] C8 -->|"否"| D["default route
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
10.0.0.1"] Rule -->|"db-table → eth2"| DBRouter["DB Router
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 自动生成路由项,无需手动配置