背景
一般情況下的路由算法僅僅使用目的地址做出路由決策,在Linux操作系統提供了一種根據其他字段(源地址,協議,端口等等)進行路由決策的方案,成為“策略路由”,策略路由下,進入系統的數據先匹配策略表選擇一個路由表,然后基於目的地址的路由系統(最長匹配規則)
在Linux啟動時內核為策略路由數據庫(RPDB)默認配置三個策略表
- 優先級:0,選擇器:匹配任何內容,查找本地表local(ID 255),本地表是一種特殊的路由表,包含本地和廣播地址的高優先級控制路由,該表不能被刪除或者覆蓋
- 優先級:32766,選擇器:匹配任何內容,操作:查找路由表main(ID 254)。主表是包含所有非策略路由的常規路由表。此規則可以被刪除和/或由其他規則覆蓋管理員
- 優先級:32767,選擇器:匹配任何內容,操作:查找路由表默認值(ID253)。默認表為空。如果沒有先前的默認規則選擇數據包,則它將保留用於某些后處理。這條規則也可能將被刪除。
ip rule命令
ip rule的命令格式
Usage: ip rule { add | del } SELECTOR ACTION prio NUMBER
ip rule { flush }
ip rule [ list ]
SELECTOR := [ not ] [ from PREFIX ] [ to PREFIX ] [ tos TOS ]
[ fwmark FWMARK[/MASK] ]
[ iif STRING ] [ oif STRING ] [ pref NUMBER ]
ACTION := [ table TABLE_ID ]
[ nat ADDRESS ]
[ realms [SRCREALM/]DSTREALM ]
[ goto NUMBER ]
TABLE_ID := [ local | main | default | NUMBER ]
一些常用的選項
- type TYPE (default):規則類型
- from PREFIX:選擇要匹配的源前綴
- to PREFIX:選擇要匹配的目的前綴
- iif NAME:選擇要匹配的傳入設備。如果接口是環回,則該規則僅匹配源自此主機的數據包。這意味着您可以為轉發的數據包和本地數據包創建單獨的路由表,從而完全隔離它們。
- oif NAME:選擇要匹配的傳出設備。傳出接口僅適用於來自綁定到設備的本地套接字的數據包
- tos TOS/dsfield TOS:選擇要匹配的TOS值
- fwmark MARK:選擇要匹配的標記值
- priority PREFERENCE:此規則的優先級。每個規則都應該有一個顯式設置的唯一優先級值
- table TABLEID:如果規則選擇器匹配,則要查找的路由表標識符。也可以使用查找而不是表格
一開始學的時候經常分不清楚ip rule和ip route的區別,首先ip rule和ip route都是新型的IP配置命令,用於替換原來的ifconfig,route,arp等命令,下面是一個例子
在命令行下輸入ip rule,如下:
最左邊的數字是系統內策略數據庫的三個表,數字最小優先級最高,在進行路由決策時,如果策略數據庫匹配則會根據最右端的路由表進行路由查找
增加一個策略
ip rule add
如下圖是創建一個策略表的例子
如圖所述命令的意思是,創建一個策略表,規則是源地址為192.168.88/24網,如果一個數據包匹配這個策略表則查找路由表23進行路由處理,可以看到220的優先級大於main(在/etc/iproute2/rt_tables定義)路由表所在的優先級,如果路由表23里面有符合的路由規則可直接進行路由,
如果沒有prio參數,系統會自動指定一個優先級,需要強調的是如果prio沖突仍然會添加成功。
刪除一個策略
ip rule del proi
刷新路由規則
ip rule flush
列出路由規則
ip rule list
ip route命令
ip route用於替換route命令,參考ip rule我們知道,系統可以維護1-252個路由表,而route命令只能操作main路由表,如下圖