路由是選擇一條數據包傳輸路徑的過程,也就是說主機怎么向目的地發送數據的過程。當TCP/IP主機發送IP數據包時,便出現了路由,且當到達IP路由器時還會再次出現。路由器是從一個物理網向另一個物理網發送數據包的裝置,路由器通常被稱為網關,它承但着分發數據包的任務。對於發送的主機和路由器而言,必須決定向哪里轉發數據包。在決定路由時,IP層查詢位於內存中的路由表,然后根據查詢規則,進行ip路由。是不是很抽象?先說如何選路:
(1)當一個主機試圖與另一個主機通信時,IP首先決定目的主機是一個內網還是外網,怎么確定?當然使用網絡號。
(2)如果是是同一內網,那就就是直接發送了,這個最簡答不過了。
(3)如果目的主機是和發送主機不在同一個內網,也就是在外網了,^_^很啰嗦,IP將查詢路由表來為外網主機或外網選擇一個路由,所以一般情況下有可能為某個外網指定特定的路由,具體問題稍后分析。
(4)若未找到明確的路由,此時在路由表中還會有默認網關,也可稱為缺省網關,IP用缺省的網關地址將一個數據傳送給下一個指定的路由器,所以網關也可能是路由器,也可能只是內網向特定路由器傳輸數據的網關。
(4)在該路由器收到數據后,它再次為遠程主機或網絡查詢路由,若還未找到路由,該數據包將發送到該路由器的缺省網關地址。
每發現一條路由,數據包被轉送下一級路由器,稱為一次“跳步”,按照同樣的方式進行轉發,並最終發送至目的主機。若未發現任何一個路由可以接受此次ip包的地址,發送主機將收到一個出錯信息,也就是說其中任何一跳出現了不可到達,最后的結果也就是報錯了。
上面只是個人的一些理解,事實上當時我們做的實驗不少,但是看看tcp/ip詳解后,就可以一目了然了,現在以linux下的路由表為例說明一下:
$ sudo route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.100.0 * 255.255.255.0 U 0 0 0 eth1
192.168.10.0 * 255.255.254.0 U 0 0 0 eth0
default 192.168.10.1 0.0.0.0 UG 0 0 0 eth0
--------------------------------------------------------------------------------------
IP路由選擇是逐跳地(hop-by-hop)進行的。從這個路由表信息可以看出,IP並不知道到達任何目的的完整路徑(當然,除了那些與主機直接相連的目的)。所有的IP路由選擇只為數據報傳輸提供下一站路由器的IP地址。它假定下一站路由器比發送數據報的主機更接近目的,而且下一站路由器與該主機是直接相連的。
IP路由選擇主要完成以下這些功能:
1)搜索路由表,尋找能與目的IP地址完全匹配的表目(網絡號和主機號都要匹配)。如果找到,則把報文發送給該表目指定的下一站路由器或直接連接的網絡接口(取決於標志字段的值)。
2) 搜索路由表,尋找能與目的網絡號相匹配的表目。如果找到,則把報文發送給該表目指定的下一站路由器或直接連接的網絡接口(取決於標志字段的值)。目的網絡上的所有主機都可以通過這個表目來處置。例如,一個以太網上的所有主機都是通過這種表目進行尋徑的。這種搜索網絡的匹配方法必須考慮可能的子網掩碼。關於這一點我們在下一節中進行討論。
3)搜索路由表,尋找標為“默認(default)”的表目。如果找到,則把報文發送給該表目指定的下一站路由器。如果上面這些步驟都沒有成功,那么該數據報就不能被傳送。如果不能傳送的數據報來自本機,那么一般會向生成數據報的應用程序返回一個“主機不可達”或 “網絡不可達”的錯誤。
完整主機地址匹配在網絡號匹配之前執行。只有當它們都失敗后才選擇默認路由。默認路由,以及下一站路由器發送的ICMP間接報文(如果我們為數據報選擇了錯誤的默認路由),是IP路由選擇機制中功能強大的特性。
freebsd上使用netstat -nr打印路由表
現在問題在如何操作路由表,因為ip的選路全靠它吃飯了,怎么為一個特定的網絡或者主機選擇一條特定的路由?如何刪除路由?這些問題對於網絡維護和系統管理也尤為重要:
還是以上面的路由表為例,建議使用前先man route查看方法,或許各個系統略有差異,下面是以debian為例,由於是測試,所以使用sudo,而不是root權限:
1、為某主機添加路由
$ sudo route add –host 192.168.10.58 dev eth1
//所有通向192.168.10.58的數據都是用eth1網卡
$ sudo route add –host 192.168.11.58 gw 192.168.10.1
//通向192.168.11.58的數據使用網關192.168.10.1
不經意間做了一個驗證實驗:由於eth1是沒有啟動的,所以添加這個路由后,192.168.10.58不可ping通
初始路由表
sudo route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.100.0 * 255.255.255.0 U 0 0 0 eth1
192.168.10.0 * 255.255.254.0 U 0 0 0 eth0
default 192.168.10.1 0.0.0.0 UG 0 0 0 eth0
---------------------------------------------------------
可以ping通192.168.10.58
$ ping 192.168.10.58
PING 192.168.10.58 (192.168.10.58) 56(84) bytes of data.
64 bytes from 192.168.10.58: icmp_seq=1 ttl=64 time=0.188 ms
----------------------------------------------------------------
添加192.168.10.58的路由
$ sudo route add -host 192.168.10.58 dev eth1
$ sudo route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.10.58 * 255.255.255.255 UH 0 0 0 eth1
192.168.100.0 * 255.255.255.0 U 0 0 0 eth1
192.168.10.0 * 255.255.254.0 U 0 0 0 eth0
default 192.168.10.1 0.0.0.0 UG 0 0 0 eth0
-----------------------------------------------------------------
由於eth0無法使用了,所以發給eth1,就等於丟入黑洞之中
$ ping 192.168.10.58
PING 192.168.10.58 (192.168.10.58) 56(84) bytes of data.
--- 192.168.10.58 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1010ms
指定給網關處理
$ sudo route add -host 192.168.10.58 gw 192.168.10.1
$ sudo route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.10.58 192.168.10.1 255.255.255.255 UGH 0 0 0 eth0
192.168.10.58 * 255.255.255.255 UH 0 0 0 eth1
192.168.100.0 * 255.255.255.0 U 0 0 0 eth1
192.168.10.0 * 255.255.254.0 U 0 0 0 eth0
default 192.168.10.1 0.0.0.0 UG 0 0 0 eth0
---------------------------------------------------------
要經過網關了,驗證了路由表的作用
$ ping 192.168.10.58
PING 192.168.10.58 (192.168.10.58) 56(84) bytes of data.
From 192.168.10.1: icmp_seq=1 Redirect Network(New nexthop: 192.168.10.58)
64 bytes from 192.168.10.58: icmp_seq=1 ttl=64 time=1.02 ms
------------------------------------------------------
廢話少說了,同理為某網路添加路由和刪除路由如下所示:經過測試有效:
2、為某網絡的添加路由
$ sudo route add –net 220.181.8.0/24 dev eth0
$ sudo route add –net 220.181.8.0/24 gw 192.168.10.1
3、添加默認網關
$ sudo route add default gw 192.168.10.1
4、刪除路由,
$ sudo route del –host 192.168.168.110 dev eth0
可能你會遇到刪除時候語法錯誤,請參看路由表的Flags,路由上面的第一條,G表示設定了網關,H表示操作了主機,所以就用$ sudo route del -host 192.168.10.58 gw 192.168.10.1刪除,更詳細的請man。
使用route 命令添加的路由,機器重啟或者網卡重啟后路由就失效了,和iptables一樣,需要永久添加的話,也是使用開機執行,所以可以用以下方法添加永久路由:
1.在/etc/rc.local里添加執行命令,進行開機執行,因為是root權限,所以不用sudo了:
route add –net 220.181.8.0/24 dev eth0
route add –net 220.181.9.0/24 gw 192.168.10.1
2.在/etc/sysconfig/network里添加到末尾
方法:GATEWAY=gw-ip 或者 GATEWAY=gw-dev
3./etc/sysconfig/static-router :
any net x.x.x.x/24 gw y.y.y.y