Linux系列—策略路由、ip rule、ip route

早期在管理Linux系統的網絡時,常使用ifconfig及route之類的命令,不過若是你準備開始使用Linux強大的基於策略的路由機制,那麼,就請不要使用這類工具了,由於這類工具根本沒法用於功能強大的基於策略的路由機制,取而代之的工具是iproute。iproute這個軟件在RedHat系列的Linux系統中是默認安裝的,所以,你一般能夠找到這個工具。若是真由於某些緣由找不到這個軟件,只要在使用Fedora或CentOS Linux時,在聯網的狀況下,用yum install iproute命令便可順利安裝;或者也可使用ip -V命令來檢查iproute軟件是否已經安裝,再次請注意,-V參數爲大寫的英語字母:數據庫

[root@localhost /]# ip -V  
ip utility, iproute2-ss091226 

1、管理策略數據庫

在Linux下,基於策略路由的策略數據庫是由ip命令來管理的,下面討論「管理」的幾個方面:網絡

一、查看策略數據庫

要查看策略數據庫的內容,可使用ip rule show命令,或者可使用ip rule ls。以下是命令執行後所獲得的輸出結果,在這些數據中,能夠看到系統的三條默認規則,而這三條規則默認分別對應於local、mail及default三個路由表。ssh

[root@localhost /]# ip rule show  
0: from all lookup local  
32766: from all lookup main  
32767: from all lookup default 

二、添加規則

在添加規則時,必須先肯定好「條件」、「優先級別」及「路由表ID」,此後才能夠執行添加規則的操做。tcp

條件工具

條件是用來決定哪類數據包能夠符合這項規則,而可用來匹配的字段爲Source IP、Destination IP、Type of Service、fwmark及dev等,這些字段的使用方式以下:測試

Source IPspa

根據來源端IP來決定數據包參考哪一個路由表發送出去。如下兩個示例分別指出,若是數據包的來源端IP是192.168.1.10,就參考路由表10;若是來源端IP爲192.168.2.0/24網段的IP,就參考路由表20。操作系統

ip rule add from 192.168.1.10 table 10  
ip rule add from 192.168.2.0/24 table 20 

Destination IPcode

根據目的端IP來決定數據包參考哪一個路由表發送出去。如下兩個示例分別指出,若是數據包的目的端IP是168.95.1.1,就參考路由表10;若是目的端IP是168.95.0.0/24網段的IP,就參考路由表20。blog

ip rule add to 168.95.1.1 table 10  
ip rule add to 168.96.0.0/24 table 20

fwmark

將fwmark做爲匹配條件時,必須搭配Netfilter一塊兒使用, 這看起來很麻煩, 倒是最靈活的匹配條件。如圖10-8所示,某公司對外有三條ADSL,咱們但願全部HT T P 協議經由第一條ADS L ,SMTP及POP3經由第二條ADSL,其他流量則經由第三條ADSL。可使用以下的命令組合來達到這樣的目的:

 

 

iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 80 -j MARK --set-mark 1  
iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 25 -j MARK --set-mark 2  
iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 110 -j MARK --set-mark 2  
iptables -t mangle -A FORWARD -i eth3 -j MARK --set-mark 3  
ip rule add fwmark 1 table 1  
ip rule add fwmark 2 table 2  
ip rule add fwmark 3 table 3

首先使用Netfilter的managle機制針對特定的數據包設置MARK值,在此將HTTP數據包的MARK值設置爲1,SMTP及POP3數據包的MARK值設置爲2,其他數據包則設置MARK值爲3。接着,再根據fwmark條件來判斷數據包的MARK值,若是MARK值爲1,則參考路由表1將數據包送出;MAKR值爲2時,則參考路由表2將數據包送出;最後,MARK值爲3的數據包則參考路由表3送出。

以上示例只是一個概念而已,若是真要完總體現出這個示例的全部功能,還須要注意許多細節,稍後將使用詳細的示例講解這部份內容,在此只要首先了解fwmark與Netfilter結合使用的概念便可。

dev

最後,還可使用數據包輸入的接口來做爲判斷依據,如圖10-9所示,咱們但願凡是由eth2接口送入的數據包都由eth0接口轉發出去,由eth3接口送入的數據包都由eth1接口轉發出去。如下命令組合將能知足咱們的要求:

ip rule add dev eth2 table 1  
ip rule add dev eth3 table 3 

三、優先級別

前面介紹了規則中「條件」的使用方式,接下來要討論的是優先級別。優先級別用數字來表示,其範圍可由0~4億多,堪稱天文數字,咱們實際上不可能在一臺PC上設置如此龐大的路由機制。

[root@localhost ~]# ip rule show  
0: from all lookup local  
32766: from all lookup main  
32767: from all lookup default  
[root@localhost ~]#  
[root@localhost ~]# ip rule add from 192.168.1.0/24 table 1  
[root@localhost ~]# ip rule add from 192.168.2.0/24 table 2  
[root@localhost ~]#  
[root@localhost ~]# ip rule show  
0: from all lookup local  
32764: from 192.168.2.0/24 lookup 2  
32765: from 192.168.1.0/24 lookup 1  
32766: from all lookup main  
32767: from all lookup default 

如以上示例,咱們執行ip rule show命令所顯示內容的第一個字段就是優先級別,數字越小,表明優先級別越高,也表明這條規則能夠排得越靠前,如此數據包在進行條件匹配時,就會越早匹配到這條規則,從輸出的數據中,默認優先級別0、32766及32767已被佔用,所以,在添加規則時,若是沒有特別設置優先級別,那麼,優先級別默認會從32766開始遞減,如3276五、32764……,若是咱們須要特別設置優先級別,能夠在ip rule add命令的最後加上prio XXX參數。以下例所示:

[root@localhost ~]# ip rule show  
0: from all lookup local  
32766: from all lookup main  
32767: from all lookup default  
[root@localhost ~]#  
[root@localhost ~]# ip rule add from 192.168.1.0/24 table 1 prio 10  
[root@localhost ~]# ip rule add from 192.168.2.0/24 table 2 prio 20  
[root@localhost ~]#  
[root@localhost ~]# ip rule show  
0: from all lookup local  
10: from 192.168.1.0/24 lookup 1  
20: from 192.168.2.0/24 lookup 2  
32766: from all lookup main  
32767: from all lookup default 

路由表ID

在Linux的基於策略的路由中,路由表用ID來表示,但若有必要,還能夠用ID與名稱對照表將ID轉換成名稱。

四、刪除規則

ip命令提供的刪除規則的方式十分靈活,例如,要刪除下列第2條規則,能夠分別使用「優先級別」、「條件」及「路由表」當中任何一個惟一的值來設置所需刪除的規則,以下:

ip rule del prio 10
ip rule del from 192.168.1.0/24
ip rule del table 1
ip rule del from 192.168.1.0/24 table 1 prio 10
[root@localhost ~]# ip rule show  
0: from all lookup local  
10: from 192.168.1.0/24 lookup 1  
20: from 192.168.2.0/24 lookup 2  
32766: from all lookup main  
32767: from all lookup default  

2、路由表管理

因爲route -n命令已經徹底不適合在基於策略的路由使用,所以,route命令僅能操做一個特定的路由表,但在基於策略的路由中,會同時存在多個路由表,請放棄這個路由管理工具,取而代之的依然是ip命令。接下來將討論如何使用ip命令來管理路由表。

一、查看路由表內容

在查看路由表以前,首先使用ip rule show命令來查看目前使用了哪些路由表,接着,再使用ip route show [table id | name]命令來查看路由表的內容。例如,可使用ip route showtable main來查看路由表main的內容,若是省略路由表名稱(如ip route show),會默認地查看路由表main的內容。

[root@localhost /]# ip rule show  
0: from all lookup local  
32766: from all lookup main  
32767: from all lookup default  
[root@localhost /]#  
[root@localhost /]# ip route show table main  
10.10.15.0/25 dev eth0 proto kernel scope link src 10.10.15.46  
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.10  
default via 10.10.15.1 dev eth0

在默認狀況下,系統有三個路由表,這三個路由表的功能以下:

local:路由表local包含本機路由及廣播信息。例如,在本機上執行ssh 127.0.0.1時,就會參考這份路由表的內容,在正常狀況下,只要配置好網卡的網絡設置,就會自動生成local路由表的內容,咱們應該也沒必要修改其內容。

main:使用傳統命令route -n所看到的路由表就是main的內容。Linux系統在默認狀況下使用這份路由表的內容來傳輸數據包,所以,其內容極爲重要,在正常狀況下,只要配置好網卡的網絡設置,就會自動生成main路由表的內容。

default:最後是default路由表,這個路由表在默認狀況下內容爲空;除非有特別的要求,不然保持其內容爲空便可。

在此使用路由表main的內容進行解釋,如下是圖10-10路由表main的內容,由於在主機上有eth0及eth1兩塊網卡,且爲其設置的IP分別是10.10.15.46/25及192.168.1.10/24,所以,路由表內的第.行便是告訴系統,若是有數據包要送到10.10.15.0/25這個網段,就直接將數據包由eth0接口送出便可,而本機臨近這個網段的IP是10.10.15.46,第.行則是設置到192.168.1.0/24的路由,其含義與第.行徹底相同;以上這兩行是隻要將計算機網卡上的IP設置好,並在網絡服務重啓以後,默認就會生成的路由,無需特別的設置。最後一行.則指:若是數據包不是送往10.10.15.0/25及192.168.1.0/24網段,那麼數據包將統一轉發給10.10.15.1主機去處理,而10.10.15.1就是咱們在網絡配置中所設置的「默認網關」。

[root@localhost /]# ip route show table main  
10.10.15.0/25 dev eth0 proto kernel scope link src 10.10.15.46 
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.10   
default via 10.10.15.1 dev eth0 

二、添加路由

添加路由在此仍是同樣採用ip命令而不是route命令,下例首先使用ip route show.命令顯示路由表main的內容,接着再使用ip route add命令將所需的路由添加到路由表main中.,最後再次使用ip route show命令將路由表main的內容打印出來,此時就能夠在路由表main之中看到剛纔添加的路由了。

[root@localhost /]# ip route show table main  
10.10.15.0/25 dev eth0 proto kernel scope link src 10.10.15.46  
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.10  
default via 10.10.15.1 dev eth0  
[root@localhost /]#  
[root@localhost /]# ip route add 192.168.2.0/24 via 10.10.15.50 table main  
[root@localhost /]#  
[root@localhost /]# ip route show table main   
10.10.15.0/25 dev eth0 proto kernel scope link src 10.10.15.46  
192.168.2.0/24 via 10.10.15.50 dev eth0  
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.10  
default via 10.10.15.1 dev eth0 

若是要添加的路由並未出如今現有的路由表中,又該如何處理呢?在此請先有一個概念,單純添加路由表並沒有意義,由於新增出來的路由表,系統默認是不會去使用的,若是要將路由添加到main之外的路由表,只有先添加「規則」才能肯定新的路由表名稱(Table ID),有了新的路由表以後,纔會把路由添加到新的路由表中。

咱們使用下列示例來講明這個過程。首先使用ip rule show.來查詢RPDB的當前狀態,能夠看到目前只有三條默認規則,接着,再使用ip rule add命令來添加一條規則.,此時系統內就多了一個有用的路由表,其路由表ID爲10,咱們能夠當即使用ip route show命令來查看這個新的路由表.,其內容默認爲空,接着能夠在這個新路由表中添加路由,在此使用iproute add命令來添加路由,咱們決定凡是來自於192.168.2.0/24網段的數據包,都從eth1接口將數據包送離本機,所以,必須完整編寫eth1接口的路由。首先將臨近eth1接口的路由填入.,告訴系統本機與192.168.1.0/24網段的通訊都經過eth1接口來處理,接着填入這個路由表的默認路由.,最後使用ip route show命令顯示路由表10的內容。

[root@localhost ~]# ip rule show   
0: from all lookup local  
32766: from all lookup main  
32767: from all lookup default  
[root@localhost ~]#  
[root@localhost ~]# ip rule add from 192.168.2.0/24 table 10   
[root@localhost ~]#  
[root@localhost ~]# ip route show table 10   
[root@localhost ~]#  
[root@localhost ~]# ip route add 192.168.1.0/24 dev eth1 table 10   
[root@localhost ~]# ip route add default via 192.168.1.254 table 10   
[root@localhost ~]#  
[root@localhost ~]# ip route show table 10   
192.168.1.0/24 dev eth1 scope link  
default via 192.168.1.254 dev eth1 

三、刪除路由

可使用ip命令來方便地刪除路由,咱們使用如下示例來講明如何刪除路由。首先將路由表10的內容顯示出來.,能夠看到路由表10中當前有兩條路由,接着使用ip route del命令刪除默認路由.,在此別忘了指定咱們所要刪除的是路由表10,不然默認會刪除路由表main的默認路由,接着再使用ip route show 命令查看路由表10.,此時路由表10的默認路由已經不存在了,再次使用ip route del命令刪除192.168.122.0/24的路由.,最後能夠看到路由表10中已經沒有任何路由了。

[root@localhost ~]# ip route show table 10   
192.168.1.0/24 dev virbr0 scope link  
default via 192.168.1.254 dev eth1  
[root@localhost ~]#  
[root@localhost ~]# ip route del default table 10   
[root@localhost ~]#  
[root@localhost ~]# ip route show table 10   
192.168.1.0/24 dev virbr0 scope link  
[root@localhost ~]#  
[root@localhost ~]# ip route del 192.168.1.0/24 table 10   
[root@localhost ~]#  
[root@localhost ~]# ip route show table 10

 

 

 3、測試

本機操做系統:

[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core)

 

 一共2張網卡,IP地址分別爲:

192.168.10.100/24

192.168.3.100/24

 

 其中192.168.10.100在配置網卡過程當中已經配置了默認網關

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160 
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
NAME=ens160
DEVICE=ens160
ONBOOT=yes
IPADDR=192.168.10.100
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
DNS1=218.2.135.1

 

 192.168.3.100沒有配置默認網關(不能配置,由於在同一張路由表中不能存在2條默認路由)

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens192 
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
NAME=ens192
DEVICE=ens192
ONBOOT=yes
IPADDR=192.168.3.100
NETMASK=255.255.255.0

 

如今我只能使用192.168.10.100進行遠程,我想實現也能夠經過192.168.3.100進行跨網段遠程。考慮使用策略路由

 

ip rule add from 192.168.3.0/24 table 10
ip route add default via 192.168.3.1 table 10


說明:
    第一條表示來自192.168.3.0/24網關的走路由表10.
    第二條表示給路由表10設置默認網關爲192.168.3.1

 上面只是臨時添加,系統重啓會配置失效

下面使用永久添加辦法:

# 正常的作法是臨時添加和永久添加都作,這樣既不須要重啓機器生效,重啓後也生效

echo "252 storage" >> /etc/iproute2/rt_tables


ip rule add from 192.168.3.0/24 table storage
ip route add default via 192.168.3.1 table storage




echo "ip rule add from 192.168.3.0/24 table storage" >> /etc/rc.local
echo "ip route add default via 192.168.3.1 table storage" >> /etc/rc.local
chmod +x /etc/rc.d/rc.local
相關文章
相關標籤/搜索