基于策略的路由比傳統(tǒng)路由在功能上更強大,使用更靈活,它使網(wǎng)絡管理員不僅能夠根據(jù)目的地址而且能夠根據(jù)報文大小、應用或IP源地址等屬性來選擇轉發(fā)路徑。
Usage: ip rule [ list | add | del ] SELECTOR ACTION (add 添加;del 刪除; llist 列表)
SELECTOR := [ from PREFIX 數(shù)據(jù)包源地址] [ to PREFIX 數(shù)據(jù)包目的地址] [ tos TOS 服務類型][ dev STRING 物理接口] [ pref NUMBER ] [fwmark MARK iptables 標簽]
ACTION := [ table TABLE_ID 指定所使用的路由表] [ nat ADDRESS 網(wǎng)絡地址轉換][ prohibit 丟棄該表| reject 拒絕該包| unreachable 丟棄該包]
[ flowid CLASSID ]
TABLE_ID := [ local | main | default | new | NUMBER ]
例子:
ip rule add from 192.203.80/24 table inr.ruhep prio 220 通過路由表 inr.ruhep 路由來自源地址為192.203.80/24的數(shù)據(jù)包
ip rule add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320 把源地址為193.233.7.83的數(shù)據(jù)報的源地址轉換為192.203.80.144,并通過表1進行路由
在 Linux 系統(tǒng)啟動時,內核會為路由策略數(shù)據(jù)庫配置三條缺省的規(guī)則:
0 匹配任何條件 查詢路由表local(ID 255) 路由表local是一個特殊的路由表,包含對于本地和廣播地址的高優(yōu)先級控制路由。rule 0非常特殊,不能被刪除或者覆蓋。
32766 匹配任何條件 查詢路由表main(ID 254) 路由表main(ID 254)是一個通常的表,包含所有的無策略路由。系統(tǒng)管理員可以刪除或者使用另外的規(guī)則覆蓋這條規(guī)則。
32767 匹配任何條件 查詢路由表default(ID 253) 路由表default(ID 253)是一個空表,它是為一些后續(xù)處理保留的。對于前面的缺省策略沒有匹配到的數(shù)據(jù)包,系統(tǒng)使用這個策略進行處理。這個規(guī)則也可以刪除。
不要混淆路由表和策略:規(guī)則指向路由表,多個規(guī)則可以引用一個路由表,而且某些路由表可以沒有策略指向它。如果系統(tǒng)管理員刪除了指向某個路由表的所有規(guī)則,這個表就沒有用了,但是仍然存在,直到里面的所有路由都被刪除,它才會消失。
(資料來源)
所謂路由表,指的是路由器或者其他互聯(lián)網(wǎng)網(wǎng)絡設備上存儲的表,該表中存有到達特定網(wǎng)絡終端的路徑,在某些情況下,還有一些與這些路徑相關的度量。路由器的主要工作就是為經過路由器的每個數(shù)據(jù)包尋找一條最佳的傳輸路徑,并將該數(shù)據(jù)有效地傳送到目的站點。由此可見,選擇最佳路徑的策略即路由算法是路由器的關鍵所在。為了完成這項工作,在路由器中保存著各種傳輸路徑的相關數(shù)據(jù)——路由表(Routing Table),供路由選擇時使用,表中包含的信息決定了數(shù)據(jù)轉發(fā)的策略。打個比方,路由表就像我們平時使用的地圖一樣,標識著各種路線,路由表中保存著子網(wǎng)的標志信息、網(wǎng)上路由器的個數(shù)和下一個路由器的名字等內容。路由表根據(jù)其建立的方法,可以分為動態(tài)路由表和靜態(tài)路由表。
linux 系統(tǒng)中,可以自定義從 1-252個路由表,其中,linux系統(tǒng)維護了4個路由表:
0#表: 系統(tǒng)保留表
253#表: defulte table 沒特別指定的默認路由都放在改表
254#表: main table 沒指明路由表的所有路由放在該表
255#表: locale table 保存本地接口地址,廣播地址、NAT地址 由系統(tǒng)維護,用戶不得更改
路由表的查看可有以下二種方法:
ip route list table table_number
ip route list table table_name
路由表序號和表名的對應關系在 /etc/iproute2/rt_tables 文件中,可手動編輯。路由表添加完畢即時生效,下面為實例:
ip route add default via 192.168.1.1 table 1 在一號表中添加默認路由為192.168.1.1
ip route add 192.168.0.0/24 via 192.168.1.2 table 1 在一號表中添加一條到192.168.0.0網(wǎng)段的路由為192.168.1.2
以下面的路由表為例:
Destination Netmask Gateway Interface Metric0.0.0.0 0.0.0.0 192.168.123.254 192.168.123.88 1 #缺省路由,目的地址不在本路由表中的數(shù)據(jù)包,經過本機的 192.168.123.88 接口發(fā)到下一個路由器 192.168.123.254127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1 #發(fā)給本機的網(wǎng)絡包192.168.123.0 255.255.255.0 192.168.123.68 192.168.123.68 1 #直連路由。目的地址為 192.168.123.0/24 的包發(fā)到本機 192.168.123.88 接口192.168.123.88 255.255.255.255 127.0.0.1 127.0.0.1 1 #目的地址為 192.168.123.88的包是發(fā)給本機的包192.168.123.255 255.255.255.255 192.168.123.88 192.168.123.88 1 #廣播包的網(wǎng)段是 192.168.123.0/24,經過 192.168.123.88 接口發(fā)出去224.0.0.0 224.0.0.0 192.168.123.88 192.168.123.88 1 #多播包,經過 192.168.123.88 接口發(fā)出去255.255.255.255 255.255.255.255 192.168.123.68 192.168.123.68 1 #全網(wǎng)廣播包Default Gateway: 192.168.123.254
各字段說明:
destination:目的網(wǎng)段
mask:與網(wǎng)絡目標地址相關聯(lián)的網(wǎng)掩碼(又稱之為子網(wǎng)掩碼)。子網(wǎng)掩碼對于 IP 網(wǎng)絡地址可以是一適當?shù)淖泳W(wǎng)掩碼,對于主機路由是 255.255.255.255 ,對于默認路由是 0.0.0.0。如果忽略,則使用子網(wǎng)掩碼 255.255.255.255。定義路由時由于目標地址和子網(wǎng)掩碼之間的關系,目標地址不能比它對應的子網(wǎng)掩碼更為詳細。換句話說,如果子網(wǎng)掩碼的一位是 0,則目標地址中的對應位就不能設置為 1。
interface:到達該目的地的本路由器的出口ip
gateway: 下一跳路由器入口的 ip,路由器通過 interface 和 gateway 定義一調到下一個路由器的鏈路。通常情況下,interface 和 gateway 是同一網(wǎng)段的metric 跳數(shù),該條路由記錄的質量,一般情況下,如果有多條到達相同目的地的路由記錄,路由器會采用metric值小的那條路由
根據(jù)子網(wǎng)掩碼,可以將路由分為三種類型:
主機路由:機路由是路由選擇表中指向單個IP地址或主機名的路由記錄。主機路由的Flags字段為H。
Destination Gateway Genmask Flags Metric Ref Use Iface----------- ------- ------- ----- ------ --- --- -----10.0.0.10 192.168.1.1 255.255.255.255 UH 0 0 0 eth0
網(wǎng)絡路由:網(wǎng)絡路由是代表主機可以到達的網(wǎng)絡。網(wǎng)絡路由的Flags字段為N。例如,在下面的示例中,本地主機將發(fā)送到網(wǎng)絡192.19.12的數(shù)據(jù)包轉發(fā)到IP地址為192.168.1.1的路由器。
Destination Gateway Genmask Flags Metric Ref Use Iface----------- ------- ------- ----- ----- --- --- -----192.19.12 192.168.1.1 255.255.255.0 UN 0 0 0 eth0
默認路由:當主機不能在路由表中查找到目標主機的IP地址或網(wǎng)絡路由時,數(shù)據(jù)包就被發(fā)送到默認路由(默認網(wǎng)關)上。默認路由的Flags字段為G。
Destination Gateway Genmask Flags Metric Ref Use Iface----------- ------- ------- ----- ------ --- --- -----default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
設置和查看路由表都可以用 route 命令,設置內核路由表的命令格式是:route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]
其中:
add : 添加一條路由規(guī)則,del : 刪除一條路由規(guī)則,-net : 目的地址是一個網(wǎng)絡,-host : 目的地址是一個主機,target : 目的網(wǎng)絡或主機
netmask : 目的地址的網(wǎng)絡掩碼,gw : 路由數(shù)據(jù)包通過的網(wǎng)關,dev : 為路由指定的網(wǎng)絡接口
比如:
route add 0.0.0.0 mask 0.0.0.0 192.168.12.1
route add 10.41.0.0 mask 255.255.0.0 10.27.0.1 metric 7
關于 src 屬性:
當一個主機有多個網(wǎng)卡配置了多個 IP 的時候,對于它產生的網(wǎng)絡包,可以在路由選擇時設置源 IP 地址。比如:
ip route add 78.22.45.0/24 via 10.45.22.1 src 10.45.22.12 (發(fā)到 78.22.45.0/24 網(wǎng)段的網(wǎng)絡包,下一跳的路由器 IP 是 10.45.22.1,包的源IP地址設為10.45.22.12)。
要注意的是,src 選項只會影響該 host 上產生的網(wǎng)絡包。如果是一個被路由的外來包,明顯地它已經帶有了一個源 IP 地址,這時候,src 參數(shù)的配置對它沒有任何影響,除非你使用 NAT 來改變它。對 Neutron 來說,qrouter 和 qif namespace 中的路由表中的 src 都沒有實際意義,因為它們只會處理外來的網(wǎng)絡包。
靜態(tài)路由是指由用戶或網(wǎng)絡管理員手工配置的路由信息。當網(wǎng)絡的拓撲結構或鏈路的狀態(tài)發(fā)生變化時,網(wǎng)絡管理員需要手工去修改路由表中相關的靜態(tài)路由信息。靜態(tài)路由信息在缺省情況下是私有的,不會傳遞給其他的路由器。當然,網(wǎng)管員也可以通過對路由器進行設置使之成為共享的。靜態(tài)路由一般適用于比較簡單的網(wǎng)絡環(huán)境,在這樣的環(huán)境中,網(wǎng)絡管理員易于清楚地了解網(wǎng)絡的拓撲結構,便于設置正確的路由信息。
以上面的拓撲結構為例,在沒有配置路由的情況下,計算機1 和 2 無法互相通信,因為 1 發(fā)給 2 的包在到達路由器 A 后,它不知道怎么轉發(fā)它。B 也同樣。管理員可以配置如下的靜態(tài)路由來實現(xiàn) 1 和 2 之間的通信:
計算機配置默認網(wǎng)關:
計算機1 上:route add default gw 192.168.1.1
計算機2 上:route add default gw 192.168.3.1
路由器配置:
R1 上:ip route 192.168.3.0 255.255.255.0 f0/1 (意思為:目標網(wǎng)絡地址為 192.168.3.0/24 的數(shù)據(jù)包,經過 f0/1 端口發(fā)出)
R2 上:ip route 192.168.1.0 255.255.255.0 f0/1 (意思為:目標網(wǎng)絡地址為 192.168.1.0/24 的數(shù)據(jù)包,經過 f0/1 端口發(fā)出)
或者
R1 上:ip route 192.168.3.0 255.255.255.0 192.168.2.2 (意思為:要去 192.168.3.0/24 的數(shù)據(jù)包,下一路由器 IP 地址為 192.168.2.2)
R2 上:ip route 192.168.1.0 255.255.255.0 192.168.2.1
(來源:http://baike.baidu.com/view/911.htm)
動態(tài)路由是指路由器能夠自動地建立自己的路由表,并且能夠根據(jù)實際情況的變化適時地進行調整。它是與靜態(tài)路由相對的一個概念,指路由器能夠根據(jù)路由器之間的交換的特定路由信息自動地建立自己的路由表,并且能夠根據(jù)鏈路和節(jié)點的變化適時地進行自動調整。當網(wǎng)絡中節(jié)點或節(jié)點間的鏈路發(fā)生故障,或存在其它可用路由時,動態(tài)路由可以自行選擇最佳的可用路由并繼續(xù)轉發(fā)報文。
常見的動態(tài)路由協(xié)議有以下幾個:路由信息協(xié)議(RIP)、OSPF(Open Shortest Path First開放式最短路徑優(yōu)先)、IS-IS(Intermediate System-to-Intermediate System,中間系統(tǒng)到中間系統(tǒng))、邊界網(wǎng)關協(xié)議(BGP)是運行于 TCP 上的一種自治系統(tǒng)的路由協(xié)議。
(來源:http://baike.baidu.com/view/897.htm)
以一例子來說明:公司內網(wǎng)要求192.168.0.100 以內的使用 10.0.0.1 網(wǎng)關上網(wǎng) (電信),其他IP使用 20.0.0.1 (網(wǎng)通)上網(wǎng)。
首先要在網(wǎng)關服務器上添加一個默認路由,當然這個指向是絕大多數(shù)的IP的出口網(wǎng)關:ip route add default gw 20.0.0.1
之后通過 ip route 添加一個路由表:ip route add table 3 via 10.0.0.1 dev ethX (ethx 是 10.0.0.1 所在的網(wǎng)卡, 3 是路由表的編號)
之后添加 ip rule 規(guī)則:ip rule add fwmark 3 table 3 (fwmark 3 是標記,table 3 是路由表3 上邊。 意思就是凡事標記了 3 的數(shù)據(jù)使用 table3 路由表)
之后使用 iptables 給相應的數(shù)據(jù)打上標記:iptables -A PREROUTING -t mangle -i eth0 -s 192.168.0.1 - 192.168.0.100 -j MARK --set-mark 3
因為 mangle 的處理是優(yōu)先于 nat 和 fiter 表的,所以在數(shù)據(jù)包到達之后先打上標記,之后再通過 ip rule 規(guī)則,對應的數(shù)據(jù)包使用相應的路由表進行路由,最后讀取路由表信息,將數(shù)據(jù)包送出網(wǎng)關。
(來源:使用 ip route , ip rule , iptables 配置策略路由。這里 有一個更詳細的例子)
這里可以看出 Netfilter 處理網(wǎng)絡包的先后順序:接收網(wǎng)絡包,先 DNAT,然后查路由策略,查路由策略指定的路由表做路由,然后 SNAT,再發(fā)出網(wǎng)絡包。
我們在 linux 機器上,使用 traceroute 來獲知從你的計算機到互聯(lián)網(wǎng)另一端的主機是走的什么路徑。當然每次數(shù)據(jù)包由某一同樣的出發(fā)點(source)到達某一同樣的目的地(destination)走的路徑可能會不一樣,但基本上來說大部分時候所走的路由是相同的。在 MS Windows 中該工具為 tracert。 在大多數(shù)情況下,我們會在linux主機系統(tǒng)下,直接執(zhí)行命令行:traceroute hostname;而在Windows系統(tǒng)下是執(zhí)行tracert的命令: tracert hostname。
命令格式:traceroute [參數(shù)] [主機]
命令功能:traceroute 指令讓你追蹤網(wǎng)絡數(shù)據(jù)包的路由途徑,預設數(shù)據(jù)包大小是 40Bytes,用戶可另行設置。
具體參數(shù)格式:traceroute [-dFlnrvx][-f<存活數(shù)值>][-g<網(wǎng)關>...][-i<網(wǎng)絡界面>][-m<存活數(shù)值>][-p<通信端口>][-s<來源地址>][-t<服務類型>][-w<超時秒數(shù)>][主機名稱或IP地址][數(shù)據(jù)包大小]
命令參數(shù):
-d 使用Socket層級的排錯功能,-f 設置第一個檢測數(shù)據(jù)包的存活數(shù)值TTL的大小,-F 設置勿離斷位,-g 設置來源路由網(wǎng)關,最多可設置8個,-i 使用指定的網(wǎng)絡界面送出數(shù)據(jù)包,-I 使用ICMP回應取代UDP資料信息,-m 設置檢測數(shù)據(jù)包的最大存活數(shù)值TTL的大小,-n 直接使用IP地址而非主機名稱。
-p 設置UDP傳輸協(xié)議的通信端口,-r 忽略普通的Routing Table,直接將數(shù)據(jù)包送到遠端主機上,-s 設置本地主機送出數(shù)據(jù)包的IP地址,-t 設置檢測數(shù)據(jù)包的TOS數(shù)值。
-v 詳細顯示指令的執(zhí)行過程,-w 設置等待遠端主機回報的時間,-x 開啟或關閉數(shù)據(jù)包的正確性檢驗。
(1)例子
[root@localhost ~]# traceroute www.baidu.comtraceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets1 192.168.74.2 (192.168.74.2) 2.606 ms 2.771 ms 2.950 ms2 211.151.56.57 (211.151.56.57) 0.596 ms 0.598 ms 0.591 ms3 211.151.227.206 (211.151.227.206) 0.546 ms 0.544 ms 0.538 ms4 210.77.139.145 (210.77.139.145) 0.710 ms 0.748 ms 0.801 ms5 202.106.42.101 (202.106.42.101) 6.759 ms 6.945 ms 7.107 ms6 61.148.154.97 (61.148.154.97) 718.908 ms * bt-228-025.bta.net.cn (202.106.228.25) 5.177 ms7 124.65.58.213 (124.65.58.213) 4.343 ms 4.336 ms 4.367 ms8 202.106.35.190 (202.106.35.190) 1.795 ms 61.148.156.138 (61.148.156.138) 1.899 ms 1.951 ms9 * * *30 * * *
說明:
記錄按序列號從1開始,每個紀錄就是一跳 ,每跳表示一個網(wǎng)關,我們看到每行有三個時間,單位是 ms,其實就是 -q 的默認參數(shù)。
探測數(shù)據(jù)包向每個網(wǎng)關發(fā)送三個數(shù)據(jù)包后,網(wǎng)關響應后返回的時間;如果您用 traceroute -q 4 www.58.com ,表示向每個網(wǎng)關發(fā)送4個數(shù)據(jù)包。
有時我們 traceroute 一臺主機時,會看到有一些行是以星號表示的。出現(xiàn)這樣的情況,可能是防火墻封掉了ICMP 的返回信息,所以我們得不到什么相關的數(shù)據(jù)包返回數(shù)據(jù)。
有時我們在某一網(wǎng)關處延時比較長,有可能是某臺網(wǎng)關比較阻塞,也可能是物理設備本身的原因。當然如果某臺 DNS 出現(xiàn)問題時,不能解析主機名、域名時,也會 有延時長的現(xiàn)象;您可以加-n 參數(shù)來避免DNS解析,以IP格式輸出數(shù)據(jù)。
如果在局域網(wǎng)中的不同網(wǎng)段之間,我們可以通過 traceroute 來排查問題所在,是主機的問題還是網(wǎng)關的問題。如果我們通過遠程來訪問某臺服務器遇到問題時,我們用到traceroute 追蹤數(shù)據(jù)包所經過的網(wǎng)關,提交IDC服務商,也有助于解決問題;但目前看來在國內解決這樣的問題是比較困難的,就是我們發(fā)現(xiàn)問題所在,IDC服務商也不可能幫助我們解決。
(2)原理
Traceroute 程序的設計是利用 ICMP 及 IP header 的 TTL(Time To Live)欄位(field)。
首先,traceroute 送出一個 TTL 是 1 的 IP datagram(其實,每次送出的為3個40字節(jié)的包,包括源地址,目的地址和包發(fā)出的時間標簽)到目的地,當路徑上的第一個路由器(router)收到這個datagram 時,它將TTL減1。此時,TTL變?yōu)?了,所以該路由器會將此 datagram 丟掉,并送回一個「ICMP time exceeded」消息(包括發(fā)IP包的源地址,IP包的所有內容及路由器的IP地址),traceroute 收到這個消息后,便知道這個路由器存在于這個路徑上。
接著,traceroute 再送出另一個TTL 是 2 的datagram,發(fā)現(xiàn)第2 個路由器......
然后,traceroute 每次將送出的 datagram 的 TTL 加1來發(fā)現(xiàn)另一個路由器,這個重復的動作一直持續(xù)到某個datagram 抵達目的地。當datagram到達目的地后,該主機并不會送回ICMP time exceeded消息,因為它已是目的地了,那么traceroute如何得知目的地到達了呢?
Traceroute 在送出 UDP datagrams 到目的地時,它所選擇送達的 port number 是一個一般應用程序都不會用的號碼(30000 以上),所以當此 UDP datagram 到達目的地后該主機會送回一個「ICMP port unreachable」的消息,而當traceroute 收到這個消息時,便知道目的地已經到達了。所以traceroute 在Server端也是沒有所謂的Daemon 程式。Traceroute提取發(fā) ICMP TTL 到期消息設備的 IP 地址并作域名解析。每次 ,Traceroute 都打印出一系列數(shù)據(jù),包括所經過的路由設備的域名及 IP地址,三個包每次來回所花時間。
(以上資料來自互聯(lián)網(wǎng))