早期在管理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
一、管理策略數據庫
在Linux下,基於策略路由的策略數據庫是由ip命令來管理的,下面討論“管理”的幾個方面:
1、查看策略數據庫
要查看策略數據庫的內容,可以使用ip rule show命令,或者可以使用ip rule ls。如下是命令執行后所得到的輸出結果,在這些數據中,可以看到系統的三條默認規則,而這三條規則默認分別對應於local、mail及default三個路由表。
[root@localhost /]# ip rule show 0: from all lookup local 32766: from all lookup main 32767: from all lookup default
2、添加規則
在添加規則時,必須先確定好“條件”、“優先級別”及“路由表ID”,此后才可以執行添加規則的操作。
條件
條件是用來決定哪類數據包可以符合這項規則,而可用來匹配的字段為Source IP、Destination IP、Type of Service、fwmark及dev等,這些字段的使用方式如下:
Source IP
根據來源端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 IP
根據目的端IP來決定數據包參考哪個路由表發送出去。以下兩個示例分別指出,如果數據包的目的端IP是168.95.1.1,就參考路由表10;如果目的端IP是168.95.0.0/24網段的IP,就參考路由表20。
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
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開始遞減,如32765、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轉換成名稱。
4、刪除規則
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
二、路由表管理
由於route -n命令已經完全不適合在基於策略的路由使用,因此,route命令僅能操作一個特定的路由表,但在基於策略的路由中,會同時存在多個路由表,請放棄這個路由管理工具,取而代之的依然是ip命令。接下來將討論如何使用ip命令來管理路由表。
1、查看路由表內容
在查看路由表之前,首先使用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
2、添加路由
添加路由在此還是一樣采用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
3、刪除路由
可以使用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
三、測試
本機操作系統:
[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