SIMPLE
Linux策略路由詳解
概述
在Linux中,我們通常使用route 命令來做路由信息的管理。但是該命令僅僅只能用于基本路由信息的管理,面對功能更加強(qiáng)大的基于策略的路由機(jī)制,route 命令就顯得捉襟見肘。在傳統(tǒng)路由算法中,只能基于目的地址進(jìn)行路由選擇。但是如果對路由選擇有更復(fù)雜的要求,比如針對不同源地址、傳輸層端口甚至是payload進(jìn)行更細(xì)致的路由控制,傳統(tǒng)的基于目的地址的路由表就無法滿足需求了,需要使用功能更加強(qiáng)大的路由策略數(shù)據(jù)庫routeing database: RPDB 來處理。
命令安裝:
安裝很簡單,按照如下命令安裝即可。
# 查看iproute是否安裝
# 查看iproute版本
]# ip -V
ip utility, iproute2-ss170501
# 安裝
yum install iproute -y
路由策略數(shù)據(jù)庫(RPDB):
RPDB是存放策略的數(shù)據(jù)庫,被策略匹配的數(shù)據(jù)包會執(zhí)行相關(guān)的操作,可以通過ip rule 來管理。
在系統(tǒng)啟動時,內(nèi)核會配置三條默認(rèn)策略:
# 通過ip rule show可以查看當(dāng)前RPDB中的規(guī)則
]# ip rule show
0: from all lookup local # 優(yōu)先級為0,匹配任意源地址,查詢local路由表轉(zhuǎn)發(fā)
32766: from all lookup main # 優(yōu)先級為32766,匹配任意源地址,查詢main路由表轉(zhuǎn)發(fā)
32767: from all lookup default # 優(yōu)先級為32767,匹配任意源地址,查詢default路由表轉(zhuǎn)發(fā)
1. local路由表是一個特殊的路由表,包含本地地址和廣播地址的高優(yōu)先級控制路由, 例如訪問127.0.0.1就是參考的這條規(guī)則。
2. main路由表是一個通用路由表,正常通過route -n命令操作的就是這個路由表。
3. default路由表默認(rèn)是一個空表,除非有特別的要求,否則保持為空即可。
每條策略路由的規(guī)則由一個選擇器 和一個動作 組成,RPDB按照優(yōu)先級順序進(jìn)行規(guī)則匹配,優(yōu)先級數(shù)字越小越優(yōu)先。被選擇器 匹配的報文會執(zhí)行對應(yīng)的操作,操作如果成功,則根據(jù)指定的路由轉(zhuǎn)發(fā)數(shù)據(jù),之后終止RPDB匹配,如果執(zhí)行失敗,則報錯并且終止RPDB匹配。否則RPDB將繼續(xù)執(zhí)行下一條規(guī)則。
ip rule命令說明
# 執(zhí)行ip rule help可以查看幫助信息,如果需要更詳細(xì)的幫助信息,可以執(zhí)行man ip-rule
]# ip rule help
Usage: ip rule { add | del } SELECTOR ACTION
ip rule { flush | save | restore }
ip rule [ list [ SELECTOR ]]
SELECTOR := [ not ] [ from PREFIX ] [ to PREFIX ] [ tos TOS ] [ fwmark FWMARK[/MASK] ]
[ iif STRING ] [ oif STRING ] [ pref NUMBER ] [ l3mdev ]
[ uidrange NUMBER-NUMBER ]
ACTION := [ table TABLE_ID ]
[ nat ADDRESS ]
[ realms [SRCREALM/]DSTREALM ]
[ goto NUMBER ]
SUPPRESSOR
SUPPRESSOR := [ suppress_prefixlength NUMBER ]
[ suppress_ifgroup DEVGROUP ]
TABLE_ID := [ local | main | default | NUMBER ]
選擇器(SELECTOR)
from PREFIX: 根據(jù)源地址前綴匹配
to PREFIX: 根據(jù)目的地址前綴匹配
tos TOS: 根據(jù)ip包頭TOS字段的值進(jìn)行匹配
fwmark FWMARK[/MASK]: 配合iptables -t mangle 打標(biāo)記,根據(jù)標(biāo)記進(jìn)行匹配
iif STRING: 選擇要匹配的數(shù)據(jù)包的輸入接口。
oif STRING: 選擇要匹配的出接口設(shè)備。只對來自本地套接字并與設(shè)備綁定的報文有效
pref NUMBER: 規(guī)則的優(yōu)先級。這里的pref可以替換成priority或者order,效果是一樣的。
動作(ACTION)
table TABLE_ID: 在規(guī)則匹配的時候,指定使用的路由表,被匹配的數(shù)據(jù)包將按照指定的路由表進(jìn)行路由。此處的table也可以替換為lookup,效果是一樣的。
blackhole: 丟棄匹配的數(shù)據(jù)包。
unreachable: 丟棄匹配的數(shù)據(jù)包,并生成"Network is unreachable"錯誤。
prohibit: 丟棄匹配的數(shù)據(jù)包,并生成"Communication is administratively prohibited"錯誤。
查看策略:
]# ip rule show
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
添加策略:
# 來自192.168.22.3的數(shù)據(jù)包,都參考id為10的路由表進(jìn)行轉(zhuǎn)發(fā)
ip rule add from 192.168.22.3 table 10
# 設(shè)置規(guī)則的優(yōu)先級為100,發(fā)往192.168.23.0/24的數(shù)據(jù)包,都參考id為100的路由表進(jìn)行轉(zhuǎn)發(fā)
ip rule add to 192.168.23.0/24 table 20 pref 100
# 給協(xié)議是tcp,源地址是192.168.24.0/24,目的端口是80的數(shù)據(jù)包,在路由前打上1的標(biāo)記
iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 80 -s 192.168.24.0/24 -j MARK --set-mark 1
# 將標(biāo)記為1的數(shù)據(jù)包,參考id為iptables_table的路由表進(jìn)行轉(zhuǎn)發(fā)
ip rule add fwmark 1 table iptables_table
# 來自192.168.25.0/24的數(shù)據(jù)包都將丟棄
ip rule add from 192.168.25.0/24 blackhole
ip rule add from 192.168.26.0/24 unreachable
ip rule add from 192.168.27.0/24 prohibit
注意,添加動作是table TABLE_ID時,默認(rèn)情況下,只能添加數(shù)字,如果添加的是字符的話,會有如下報錯。
]# ip rule add from 192.168.22.3 table iptables_table
Error: argument "iptables_table" is wrong: invalid table ID
這就帶來一個問題,如果時間久了,就不知道自己當(dāng)時添加的這個路由表是啥意思了。所以需要有一個數(shù)字和字符的對應(yīng)關(guān)系。這個對應(yīng)關(guān)系,就保存在/etc/iproute2/rt_tables 這個文件里。
#編輯/etc/iproute2/rt_tables,添加iptables_table表的id為100
]# cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#自定義路由表
100 iptables_table
#
# local
#
#1 inr.ruhep
添加之后,就可以正常執(zhí)行ip rule add from 192.168.22.3 table iptables_table 了。并且執(zhí)行ip rule show的時候,路由表也是按照定義的字符顯示。
刪除策略:
# 根據(jù)路由表刪除
ip rule del table iptables_table
# 根據(jù)來源地址刪除
ip rule del from 192.168.22.0/24
# 根據(jù)優(yōu)先級刪除
ip rule del pref 100
# 根據(jù)標(biāo)記刪除
ip rule del fwmark 100
路由表管理:
目前看,通過ip rule命令,可以根據(jù)不同的規(guī)則,選擇不同的路由表來轉(zhuǎn)發(fā)數(shù)據(jù)。那么如何對不同的路由表做管理呢? 很簡單,只要在正常執(zhí)行的命令之后,加上table TABLE_ID 即可。
查看路由表路由條目:
# ip route show等價于ip route show table main,也就是查的是默認(rèn)的main路由表
ip route show
#查看指定目標(biāo)的路由
ip route show 192.168.22.0/24
#查看指定路由表iptables_table中的路由
ip route show table iptables_table
ip route show table 100
添加路由:
# 向iptables_table中添加默認(rèn)路由
ip route add default via 192.168.22.1 dev eth1 src 192.168.22.3 table iptables_table
]# ip route show table 100
default via 192.168.22.1 dev eth1 src 192.168.22.3
刪除路由:
# 刪除iptables_table路由表中的路由
ip route del default via 192.168.22.1 dev eth1 src 192.168.22.3 table iptables_tabl
-
Linux
+關(guān)注
關(guān)注
87文章
11207瀏覽量
208717 -
數(shù)據(jù)庫
+關(guān)注
關(guān)注
7文章
3752瀏覽量
64233 -
路由
+關(guān)注
關(guān)注
0文章
275瀏覽量
41735
原文標(biāo)題:Linux策略路由詳解
文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論