Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 策略路由深度解析:多路由表、規則鏈與 RPDB 核心機制

編輯:Linux 教學

傳統路由僅依據**目的地址**查找單一路由表,無法滿足「不同來源走不同線路」、「依服務等級分流」、「成本優化」等進階需求。Linux 核心 2.2+ 引入**策略路由**,透過**多路由表**與**規則鏈**實現靈活的封包導向決策。本文系統闡述架構設計、配置工具、應用場景及核心原始碼層級的 RPDB(Routing Policy Database)實現機制。

一、核心概念:多路由表與規則

多路由表

Linux 支援最多 255 張路由表(0-254),預設內建三張:

表 ID名稱用途維護方式
255local本地介面位址、廣播位址、NAT 位址核心自動維護,管理員不可直接修改
254main主路由表,route/ip route 無指定表預設操作此表管理員管理
253default預設路由表,通常放置預設閘道管理員管理
0reserved保留-
1-252用戶自訂策略路由專用表管理員管理

規則

規則定義「什麼封包用哪張表」,包含三要素:

  • Selector(匹配條件):來源位址、目的位址、TOS、輸入介面、fwmark 等
  • Action(動作):查找指定表、NAT、丟棄、拒絕、不可達
  • Priority(優先序):數值越小優先序越高,範圍 0-32767

二、iproute2 配置實戰

傳統 route 無法操作策略路由,必須使用 iproute2 套件(ip 指令)。

1. 介面位址配置

ip addr add 192.168.0.1/24 broadcast 192.168.0.255 dev eth0 label eth0:0

2. 路由配置

# 查看指定表
ip route list table 10
# 新增路由到表 10
ip route add 192.168.3.0/24 via 192.168.0.3 table 10
# 新增預設路由到主表
ip route add default via 192.168.0.4 table main

3. 規則配置

# 查看所有規則
ip rule list
# 0: from all lookup local
# 32766: from all lookup main
# 32767: from all lookup default

# 新增規則:來源 192.168.3.112 且 TOS=0x10 使用表 2,優先序 1500
ip rule add from 192.168.3.112/32 tos 0x10 table 2 pref 1500
# 新增規則:所有封包使用表 1,優先序 32800
ip rule add from all table 1 pref 32800
# 刪除規則
ip rule del from 192.168.3.112/32 tos 0x10 table 2 pref 1500

規則匹配流程

  1. 依優先序遞增掃描規則鏈
  2. Selector 匹配成功 → 執行 Action
  3. Action 為 lookup table → 在該表查找路由
  4. 查找成功 → 回傳路由結果
  5. 查找失敗 → 繼續下一條規則
  6. 所有規則皆失敗 → 路由失敗

預設規則鏈保證**向前相容**:先查 local(本地通訊),再查 main(一般路由),最後查 default(預設閘道)。

三、四大經典應用場景

場景策略描述關鍵 Selector效益
來源位址選路VIP 用戶走 ADSL 快線,一般用戶走撥接慢線from 差異化服務、資源保障
服務品質 (QoS)VoIP/視訊走低延遲路徑,郵件/備份走高頻寬廉價路徑tos / fwmark業務優先級保障
成本優化突發大流量走按流量計費高速線路,平時走包月專線fwmark / time (搭配腳本)頻寬成本最小化
負載均衡依來源/目的 IP 雜湊分流至多條同等線路from / to (搭配統計模式)頻寬利用最大化

四、RPDB 核心原始碼深度剖析 (Linux 2.4.18)

RPDB 實現分佈於 net/ipv4/fib_*.c、net/ipv4/route.c:

核心資料結構

結構體角色定義位置
struct fib_table路由表物件,含操作函數指標、雜湊根節點include/net/ip_fib.h
struct fn_hash路由表雜湊結構,管理 zone 陣列fib_hash.c
struct fn_zoneZone 域,依前綴長度分組節點fib_hash.c
struct fib_node路由節點,實際儲存前綴與路由資訊fib_hash.c
struct fib_info路由屬性:下一跳、輸出介面、度量、快取資訊ip_fib.h
struct fib_result查找結果封裝ip_fib.h
struct fib_rule規則節點,串聯成規則鏈fib_rules.c

關鍵全域變數

struct fib_table *fib_tables[RT_TABLE_MAX+1];  // 所有路由表陣列
struct fib_rule *fib_rules;                     // 規則鏈頭指標

中心函數:fib_lookup() (route.c / fib_frontend.c)

int fib_lookup(const struct rt_key *key, struct fib_result *res) {
    read_lock(&fib_rules_lock);
    for (r = fib_rules; r; r = r->r_next) {          // 1. 依優先序掃描規則鏈
        if (selector_mismatch(key, r)) continue;     //    Selector 不符跳過
        switch (r->r_action) {                       // 2. 處理 Action
            case RTN_UNICAST:
            case RTN_NAT:
                policy = r; break;
            case RTN_UNREACHABLE: return -ENETUNREACH;
            case RTN_PROHIBIT: return -EACCES;
            case RTN_BLACKHOLE: return -EINVAL;
        }
        if (!(tb = fib_get_table(r->r_table))) continue; // 3. 取得路由表
        err = tb->tb_lookup(tb, key, res);             // 4. 在表中查找
        if (err == 0) {                                // 5. 命中回傳
            res->r = policy;
            read_unlock(&fib_rules_lock);
            return 0;
        }
        if (err < 0 && err != -EAGAIN) return err;     // 6. 硬錯誤回傳
    }
    read_unlock(&fib_rules_lock);
    return -ENETUNREACH;                               // 7. 全失敗
}

路由快取與 IP 層適配

route.c 實作 ip_route_output_key()(發送路徑)與 ip_route_input_slow()(接收路徑),邏輯一致:

  1. 先查路由快取(rt_cache),命中直接回傳
  2. 未命中呼叫 fib_lookup() 查 RPDB
  3. 結果寫入快取,回傳

快取定期由 rt_garbage_collect() 清理失效項目。

五、總結

Linux 策略路由透過 **RPDB(規則鏈 + 多路由表)** 分離「分類決策」與「路徑查找」,賦予網路管理員精細的流量控制能力。iproute2 是唯一標準配置介面,掌握 ip rule、ip route table 操作是進階網管必修課。核心層面,fib_lookup() 以極簡邏輯實現高效率的「規則→表→路由」三級查找,配合路由快取機制,滿足高效能轉發需求。

Copyright © Windows教程網 All Rights Reserved