前言
一般在多網(wǎng)卡的網(wǎng)絡(luò)訪問關(guān)系中我們通常根據(jù)目標(biāo)IP地址段來添加靜態(tài)路由表籍茧,在主機(jī)系統(tǒng)配置層面這個(gè)需求一般都比較簡(jiǎn)單也不需要使用非常復(fù)雜的命令皱炉,說實(shí)話如果不是因?yàn)殚_發(fā)測(cè)試中心同事@謝恒的亂入啟發(fā)嘱蛋,我也不會(huì)發(fā)現(xiàn)還有策略路由這樣一種靈活通用的配置方法來實(shí)現(xiàn)Linux多網(wǎng)卡多路由的設(shè)定修陡,灰常感謝邀桑。
rt_tables是一種更加簡(jiǎn)單靈活的策略路由實(shí)現(xiàn)方法
更新記錄
2015年12月18日 - 修正動(dòng)態(tài)路由為策略路由描述祟蚀,完善內(nèi)容工窍,感謝@extreme
2015年12月17日 - 初稿
閱讀原文 - http://wsgzao.github.io/post/iproute2/
擴(kuò)展閱讀
- Routing Tables - http://linux-ip.net/html/routing-tables.html
- linux配置靜態(tài)路由 - http://www.361way.com/linux-define-static-route/4053.html
- Linux策略性路由應(yīng)用及分析(iproute2) - http://tilt.lib.tsinghua.edu.cn/node/408
- Linux Advanced Routing & Traffic Control - http://lartc.org/
靜態(tài)路由表和策略路由的區(qū)別
通常我們維護(hù)靜態(tài)路由表會(huì)手工填寫所有IP地址段的路由規(guī)則,使用命令或者寫入配置文件永久生效暂题,先以Windows/Linux/AIX常用方法為例
#Windows靜態(tài)路由
--鍵入 route -p add [目標(biāo)] [mask <網(wǎng)絡(luò)掩碼>] [網(wǎng)關(guān)] [metric <度量值>] [if <接口>]
route print
route delete
route -p add 172.16.19.0 mask 255.255.255.0 198.15.0.1
#RHEL靜態(tài)路由
vi /etc/sysconfig/network
default via 192.168.3.1 dev eth0
10.211.6.0/24 via 192.168.3.1 dev eth0
10.0.0.0/8 via 10.212.52.1 dev eth1
#SuSE靜態(tài)路由
vi /etc/sysconfig/network/routes
default 192.168.3.1 - -
10.211.6.0 192.168.3.1 255.255.255.0 eth0
10.0.0.0 10.212.52.1 255.0.0.0 eth1
#AIX靜態(tài)路由
smitty mkroute
172.20.14.0/24 gw 172.23.14.254
這種辦法針對(duì)少量的規(guī)則還可以輕松應(yīng)對(duì)移剪,但規(guī)則一旦增加麻煩也就接踵而至,網(wǎng)段地址不斷變化就必須及時(shí)更新路由表薪者,否則其他用戶就無法訪問。如果可以根據(jù)用戶訪問進(jìn)來的路徑設(shè)定策略路由就會(huì)方便很多剿涮,而rt_tables就是為此而生言津。
rt_tables
rt_tables簡(jiǎn)單來說就是通過給表的命名使得管理簡(jiǎn)單化
大部分人習(xí)慣直接將路由表優(yōu)先級(jí)號(hào)碼直接作為表的名稱來使用,這樣做的好處是非常直觀和簡(jiǎn)明的表達(dá)了表所在優(yōu)先級(jí)的位置取试,但是當(dāng)表的優(yōu)先級(jí)結(jié)構(gòu)出現(xiàn)變動(dòng)時(shí)悬槽,我們對(duì)巨大的路由表的修改就顯得很煩瑣和費(fèi)事了。
在/etc/iproute2/目錄下,有這么一個(gè)文件rt_tables,只要對(duì)它進(jìn)行改動(dòng)瞬浓,我們將很容易的完成路由表優(yōu)先級(jí)結(jié)構(gòu)的變動(dòng)初婆。(數(shù)值越小優(yōu)先級(jí)別越高)
當(dāng)路由表的優(yōu)先級(jí)發(fā)生變化的時(shí)候,我們只需要編輯/etc/iproute2/rt_tables這個(gè)文件就可以直接改變路由表的優(yōu)先級(jí)次序猿棉。
cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
Linux最多可以支持255張路由表磅叛,其中有3張表是內(nèi)置的:
表255 本地路由表(Local table) 本地接口地址,廣播地址萨赁,已及NAT地址都放在這個(gè)表弊琴。該路由表由系統(tǒng)自動(dòng)維護(hù),管理員不能直接修改杖爽。
表254 主路由表(Main table) 如果沒有指明路由所屬的表敲董,所有的路由都默認(rèn)都放在這個(gè)表里紫皇,一般來說,舊的路由工具(如route)所添加的路由都會(huì)加到這個(gè)表腋寨。一般是普通的路由聪铺。
表253 默認(rèn)路由表 (Default table) 一般來說默認(rèn)的路由都放在這張表,但是如果特別指明放的也可以是所有的網(wǎng)關(guān)路由萄窜。
表 0 保留
策略性路由應(yīng)用及分析(iproute2)
策略性路由
策略性是指對(duì)于IP包的路由是以網(wǎng)絡(luò)管理員根據(jù)需要定下的一些策略為主要依據(jù)進(jìn)行路由的计寇。例如我們可以有這樣的策略:“所有來直自網(wǎng)A的包,選擇X路徑脂倦;其他選擇Y路徑”番宁,或者是“所有TOS為A的包選擇路徑F;其他選者路徑K”赖阻。
Cisco 的網(wǎng)絡(luò)操作系統(tǒng) (Cisco IOS) 從11.0開始就采用新的策略性路由機(jī)制蝶押。而Linux是在內(nèi)核2.1開始采用策略性路由機(jī)制的。策略性路由機(jī)制與傳統(tǒng)的路由算法相比主要是引入了多路由表以及規(guī)則的概念火欧。
多路由表(multiple Routing Tables)
傳統(tǒng)的路由算法是僅使用一張路由表的棋电。但是在有些情形底下,我們是需要使用多路由表的苇侵。例如一個(gè)子網(wǎng)通過一個(gè)路由器與外界相連赶盔,路由器與外界有兩條線路相連,其中一條的速度比較快榆浓,一條的速度比較慢于未。對(duì)于子網(wǎng)內(nèi)的大多數(shù)用戶來說對(duì)速度并沒有特殊的要求,所以可以讓他們用比較慢的路由陡鹃;但是子網(wǎng)內(nèi)有一些特殊的用戶卻是對(duì)速度的要求比較苛刻烘浦,所以他們需要使用速度比較快的路由。如果使用一張路由表上述要求是無法實(shí)現(xiàn)的萍鲸,而如果根據(jù)源地址或其它參數(shù)闷叉,對(duì)不同的用戶使用不同的路由表,這樣就可以大大提高路由器的性能脊阴。
規(guī)則(rule)
規(guī)則是策略性的關(guān)鍵性的新的概念握侧。我們可以用自然語言這樣描述規(guī)則,例如我門可以指定這樣的規(guī)則:
規(guī)則一:“所有來自192.16.152.24的IP包嘿期,使用路由表10品擎, 本規(guī)則的優(yōu)先級(jí)別是1500”
規(guī)則二:“所有的包,使用路由表253秽五,本規(guī)則的優(yōu)先級(jí)別是32767”
我們可以看到孽查,規(guī)則包含3個(gè)要素:
什么樣的包,將應(yīng)用本規(guī)則(所謂的SELECTOR坦喘,可能是filter更能反映其作用)盲再;
符合本規(guī)則的包將對(duì)其采取什么動(dòng)作(ACTION)西设,例如用那個(gè)表;
本規(guī)則的優(yōu)先級(jí)別答朋。優(yōu)先級(jí)別越高的規(guī)則越先匹配(數(shù)值越小優(yōu)先級(jí)別越高)贷揽。
環(huán)境配置
服務(wù)器A和B為雙網(wǎng)卡,操作系統(tǒng)為rhel_7.1_64
網(wǎng)卡顯示名稱 | IP地址 | 子網(wǎng)掩碼 | 網(wǎng)關(guān) | 備注 |
---|---|---|---|---|
ens4f0 | 172.31.192.201 | 255.255.255.0 | 172.31.192.254 | 服務(wù)器A |
ens9f0 | 172.31.196.1 | 255.255.255.0 | 172.31.196.254 | 服務(wù)器A |
ens4f0 | 172.31.192.202 | 255.255.255.0 | 172.31.192.254 | 服務(wù)器B |
ens9f0 | 172.31.196.2 | 255.255.255.0 | 172.31.196.254 | 服務(wù)器B |
/ | 172.25.168.44 | 255.255.255.0 | 172.25.168.254 | 接入測(cè)試 |
網(wǎng)絡(luò)配置梦碗,以服務(wù)器A為例禽绪,注意注釋默認(rèn)網(wǎng)關(guān)
cat /etc/sysconfig/network-scripts/ifcfg-ens4f0
DEVICE=ens4f0
ONBOOT=yes
BOOTPROTO=static
TYPE=Ethernet
IPADDR=172.31.192.201
NETMASK=255.255.255.0
#GATEWAY=172.31.192.254
cat /etc/sysconfig/network-scripts/ifcfg-ens9f0
DEVICE=ens9f0
ONBOOT=yes
BOOTPROTO=static
TYPE=Ethernet
IPADDR=172.31.196.1
NETMASK=255.255.255.0
#GATEWAY=172.31.196.254
策略路由配置
注意配置名稱一定要吻合
#編輯rt_tables
echo "192 net_192 " >> /etc/iproute2/rt_tables
echo "196 net_196 " >> /etc/iproute2/rt_tables
#清空net_192路由表
ip route flush table net_192
# 添加一個(gè)路由規(guī)則到 net_192 表,這條規(guī)則是 net_192 這個(gè)路由表中數(shù)據(jù)包默認(rèn)使用源 IP 172.31.192.201 通過 ens4f0 走網(wǎng)關(guān) 172.31.192.254
ip route add default via 172.31.192.254 dev ens4f0 src 172.31.192.201 table net_192
#來自 172.31.192.201 的數(shù)據(jù)包洪规,使用 net_192 路由表的路由規(guī)則
ip rule add from 172.31.192.201 table net_192
#清空net_196路由表
ip route flush table net_196
#添加一個(gè)路由規(guī)則到 net_196 表印屁,這條規(guī)則是 net_196 這個(gè)路由表中數(shù)據(jù)包默認(rèn)使用源 IP 172.31.196.1 通過 ens9f0 走網(wǎng)關(guān) 172.31.196.254
ip route add default via 172.31.196.254 dev ens9f0 src 172.31.196.1 table net_196
#來自 172.31.196.1 的數(shù)據(jù)包,使用 net_196 路由表的路由規(guī)則
ip rule add from 172.31.196.1 table net_196
#添加默認(rèn)網(wǎng)關(guān)
route add default gw 172.31.192.254
#如果需要自啟動(dòng)生效可以寫進(jìn)配置文件也可以加入rc.local
vi /etc/rc.local
ip route flush table net_192
ip route add default via 172.31.192.254 dev ens4f0 src 172.31.192.201 table net_192
ip rule add from 172.31.192.201 table net_192
ip route flush table net_196
ip route add default via 172.31.196.254 dev ens9f0 src 172.31.196.1 table net_196
ip rule add from 172.31.196.1 table net_196
route add default gw 172.31.192.254
#查看路由表
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
169.254.0.0 0.0.0.0 255.255.0.0 U 1006 0 0 ens9f0
169.254.0.0 0.0.0.0 255.255.0.0 U 1008 0 0 ens4f0
169.254.0.0 0.0.0.0 255.255.0.0 U 1014 0 0 br-ex
169.254.0.0 0.0.0.0 255.255.0.0 U 1015 0 0 br-int
172.31.192.0 0.0.0.0 255.255.255.0 U 0 0 0 ens4f0
172.31.196.0 0.0.0.0 255.255.255.0 U 0 0 0 ens9f0
#在接入測(cè)試服務(wù)器上驗(yàn)證連通性
ping 172.31.192.201
ping 172.31.196.1