王奧OX 2015年12月18日發佈html
通常在多網卡的網絡訪問關係中咱們一般根據目標IP地址段來添加靜態路由表,在主機系統配置層面這個需求通常都比較簡單也不須要使用很是複雜的命令,說實話若是不是由於開發測試中心同事 @謝恆 的亂入啓發,我也不會發現還有策略路由這樣一種靈活通用的配置方法來實現Linux多網卡多路由的設定,灰常感謝。node
rt_tables 是一種更加簡單靈活的策略路由實現方法。linux
2015年12月18日 - 修正動態路由爲策略路由描述,完善內容,感謝@extreme
2015年12月17日 - 初稿git
閱讀原文 - http://wsgzao.github.io/post/iproute2/github
擴展閱讀算法
Routing Tables - http://linux-ip.net/html/routing-tables.htmlsegmentfault
linux配置靜態路由 - http://www.361way.com/linux-define-static-route/4053.html服務器
Linux策略性路由應用及分析(iproute2) - http://tilt.lib.tsinghua.edu.cn/node/408網絡
Linux Advanced Routing & Traffic Control - http://lartc.org/工具
一般咱們維護靜態路由表會手工填寫全部IP地址段的路由規則,使用命令或者寫入配置文件永久生效,先以Windows/Linux/AIX經常使用方法爲例
#Windows靜態路由 --鍵入 route -p add [目標] [mask <網絡掩碼>] [網關] [metric <度量值>] [if <接口>] route print route delete route -p add 172.16.19.0 mask 255.255.255.0 198.15.0.1 #RHEL靜態路由 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靜態路由 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靜態路由 smitty mkroute 172.20.14.0/24 gw 172.23.14.254
這種辦法針對少許的規則還能夠輕鬆應對,但規則一旦增長麻煩也就接踵而至,網段地址不斷變化就必須及時更新路由表,不然其餘用戶就沒法訪問。若是能夠根據用戶訪問進來的路徑設定策略路由就會方便不少,而rt_tables就是爲此而生。
rt_tables 簡單來講就是經過給表的命名使得管理簡單化。
大部分人習慣直接將路由表優先級號碼直接做爲表的名稱來使用,這樣作的好處是很是直觀和簡明的表達了表所在優先級的位置,可是當表的優先級結構出現變更時,咱們對巨大的路由表的修改就顯得很煩瑣和費事了。
在/etc/iproute2/目錄下,有這麼一個文件rt_tables,只要對它進行改動,咱們將很容易的完成路由表優先級結構的變更。(數值越小優先級別越高)
當路由表的優先級發生變化的時候,咱們只須要編輯/etc/iproute2/rt_tables這個文件就能夠直接改變路由表的優先級次序。
cat /etc/iproute2/rt_tables # # reserved values # 255 local 254 main 253 default 0 unspec # # local # #1 inr.ruhep
Linux最多能夠支持255張路由表,其中有3張表是內置的:
表255 本地路由表(Local table) 本地接口地址,廣播地址,已及NAT地址都放在這個表。該路由表由系統自動維護,管理員不能直接修改。
表254 主路由表(Main table) 若是沒有指明路由所屬的表,全部的路由都默認都放在這個表裏,通常來講,舊的路由工具(如route)所添加的路由都會加到這個表。通常是普通的路由。
表253 默認路由表 (Default table) 通常來講默認的路由都放在這張表,可是若是特別指明放的也能夠是全部的網關路由。
表 0 保留。
策略性是指對於IP包的路由是以網絡管理員根據須要定下的一些策略爲主要依據進行路由的。例如咱們能夠有這樣的策略:「全部來直自網A的包,選擇X路徑;其餘選擇Y路徑」,或者是「全部TOS爲A的包選擇路徑F;其餘選者路徑K」。
Cisco 的網絡操做系統 (Cisco IOS) 從11.0開始就採用新的策略性路由機制。而Linux是在內核2.1開始採用策略性路由機制的。策略性路由機制與傳統的路由算法相比主要是引入了多路由表以及規則的概念。
傳統的路由算法是僅使用一張路由表的。可是在有些情形底下,咱們是須要使用多路由表的。例如一個子網經過一個路由器與外界相連,路由器與外界有兩條線路相連,其中一條的速度比較快,一條的速度比較慢。對於子網內的大多數用戶來講對速度並無特殊的要求,因此可讓他們用比較慢的路由;可是子網內有一些特殊的用戶倒是對速度的要求比較苛刻,因此他們須要使用速度比較快的路由。若是使用一張路由表上述要求是沒法實現的,而若是根據源地址或其它參數,對不一樣的用戶使用不一樣的路由表,這樣就能夠大大提升路由器的性能。
規則是策略性的關鍵性的新的概念。咱們能夠用天然語言這樣描述規則,例如我門能夠指定這樣的規則:
規則一:「全部來自192.16.152.24的IP包,使用路由表10, 本規則的優先級別是1500」
規則二:「全部的包,使用路由表253,本規則的優先級別是32767」
咱們能夠看到,規則包含3個要素:
什麼樣的包,將應用本規則(所謂的SELECTOR,多是filter更能反映其做用);
符合本規則的包將對其採起什麼動做(ACTION),例如用那個表;
本規則的優先級別。優先級別越高的規則越先匹配(數值越小優先級別越高)。
服務器A和B爲雙網卡,操做系統爲 rhel_7.1_64
網卡顯示名稱 | IP地址 | 子網掩碼 | 網關 | 備註 |
---|---|---|---|---|
ens4f0 | 172.31.192.201 | 255.255.255.0 | 172.31.192.254 | 服務器A |
ens9f0 | 172.31.196.1 | 255.255.255.0 | 172.31.196.254 | 服務器A |
ens4f0 | 172.31.192.202 | 255.255.255.0 | 172.31.192.254 | 服務器B |
ens9f0 | 172.31.196.2 | 255.255.255.0 | 172.31.196.254 | 服務器B |
/ | 172.25.168.44 | 255.255.255.0 | 172.25.168.254 | 接入測試 |
網絡配置,以服務器A爲例,注意註釋默認網關
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 # 添加一個路由規則到 net_192 表,這條規則是 net_192 這個路由表中數據包默認使用源 IP 172.31.192.201 經過 ens4f0 走網關 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 的數據包,使用 net_192 路由表的路由規則 ip rule add from 172.31.192.201 table net_192 #清空net_196路由表 ip route flush table net_196 #添加一個路由規則到 net_196 表,這條規則是 net_196 這個路由表中數據包默認使用源 IP 172.31.196.1 經過 ens9f0 走網關 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 的數據包,使用 net_196 路由表的路由規則 ip rule add from 172.31.196.1 table net_196 #添加默認網關 route add default gw 172.31.192.254 #若是須要自啓動生效能夠寫進配置文件也能夠加入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 #在接入測試服務器上驗證連通性 ping 172.31.192.201 ping 172.31.196.1