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