天天看點

用IP位址的用途了解Loopback接口

IP位址到底是屬于主機的還是屬于網卡的?這個問題有點太學院派了,現實中,隻要懂得IP位址的概念以及IP路由,基本上沒有問題。IP作為一個網絡層協定,它更多的意義在于尋址而不是辨別主機,是以你可以認為IP是屬于網卡的。

然而不同的人對于IP位址有不同的看法,程式員看來,IP位址是屬于主機的,因為他們總是用一個套接字來表示一個服務,套接字中的IP位址表示一台主機,協定和端口号表示了該主機上的一個特定程序;對于網絡工程師而言,他們會認為IP位址是屬于一個網段的,也就是編寫于網卡上的,如果一台主機有多塊網卡,那麼它的每塊網卡都可以有多個IP位址,IP位址在網絡工程師看來,更多的是為了根據IP路由結果将資料包發往下一跳。

每一台實作了TCP/IP的主機都有一張Local路由表,雖然實作方式不一定一樣。所謂的Local路由表,就是标示到達所有本機所有網卡的IP位址的路由,包括實體網卡和虛拟網卡,當然也包括咯opback網卡,這些路由的下一跳就是最後一跳,其實就是本機,也就是本地接收!後文會提到,在任意一塊網卡上配置一個IP位址,核心都會自動增加一個Local表的路由項。

是以,隻要是在Local表中配置一條路由,資料包就會被本地三層接收,至于能否接收成功,就看第四層以及更高層了。

IP位址在TCP/IP網絡上身兼兩職,既标示主機,又負責尋址。IP是無狀态無連接配接的,資料包是一跳一跳逐漸接近目的地的,其重要作用的是IP路由,每個中間裝置都會有一張路由表,資料包到達該中間裝置的時候,根據最長掩碼比對原則(不考慮有類IP尋址),找到下一跳的IP位址,然後進行“下一跳解析”(比如arp)将尋址落實在鍊路層,然後将資料包發往下一跳。

IP位址在TCP/IP網絡上身兼兩職,既負責尋址,又标示主機。由于二進制對立,标示主機的IP位址當然就不能配置在任何實體網卡上,也不會依賴實體網卡的up和down,隻要主機本身沒有down掉(崩潰或者掉電等),任何一塊實體網卡的down掉就不妨礙該主機繼續提供服務,但是前提是資料包可以從另一塊網卡到達該主機。

配置在實體網卡上IP位址都可以标示主機,因為該實體網卡上配置IP的時候,會對路由表産生影響,第一個影響是會生成一條直連路由,另一個影響就是會生成一條Local路由,隻要生成了Local路由就能标示主機,但是實體網卡IP标示主機的前提是該實體網卡是up狀态,但是這合理嗎?實體網卡的up狀态保持依賴于很多的外部條件,甚至依賴該網卡對端裝置的up狀态,是以這種标示法是不合理的,正常情況下,不應該用實體網卡的IP位址來标示主機,實體網卡的IP位址應該隻負責尋址!

IP位址由主機位和網絡位組成,主機位的位數描述了網絡的規模,規劃網絡的時候,網絡中可容納的網卡位址數量為主機位容量減去2,是以隻要規劃一個網絡就會浪費掉兩個位址,避免廣播位址和網絡位址的方式就是使用32位字首,由于32位字首的IP位址不再表示一個網絡,是以也就不可能擁有所謂的同網段直連路由(即鍊路層路由),那麼使用32位字首IP位址的代價就是手工添加一條明确的路由指向32位IP位址的目标作為最後一跳。

至此,我将IP位址分成了兩種用途,第一種用途用來标示主機,我使用32位字首的位址,第二種用途我用來尋址,執行标準的IP路由。依照前文的描述,标示主機的IP位址不能配置在實體網卡上,那麼配置在哪裡呢?答案就是Loopback接口。

Loopback接口是一個特殊的虛拟網卡,很多人都認為它的位址是127.0.0.1,用于測試協定棧是否有故障,然而事情不是大多數人想當然的這麼簡單。

首先,我可以肯定地說,配置在Loopback接口上的IP是屬于主機的,而配置在實體網卡上的IP位址在不同層面可以認為屬于主機和屬于網卡。另外,這種Loopback不依賴任何實體鍊路狀态和鍊路層協定,永遠不會down掉,隻要有一塊網卡是up狀态并且路由可達,該Loopback接口上配置的标示該主機的IP位址就可達。

到此,我将IP位址的兩類用途徹底分離了,用于尋址的不用來标示主機,用于标示主機的不負責尋址,也就是說,當綁定套結字的時候,不再使用實體接口的IP位址,而是使用Loopback口的32位字首的IP位址。然而分久必合,IP位址兩類用途之間還是有關聯的,這種關鍵展現在資料包發出時的源位址選擇上,按照IP路由邏輯,在沒有bind位址的情況下,源位址選擇将和下一跳網關執行最長掩碼比對算法來選擇。我們不能指望上層都會bind源位址,是以就需要在IP層影響源位址選擇算法,否則Loopback接口的位址将永遠不會被選中,因為它沒有鍊路層路由,和任何位址都不處在“同一網段”,故而你不能在“該網段”去尋找下一跳。

是以,配置路由指定源位址很重要,幸運的是Linux系統使用iproute2可以實作,而Windows系統通過一種變通的方式也能做到(但是Windows系統需要安裝額外的Loopback驅動用以導出該虛拟接口)。

我添加一個32位掩碼的IP位址到Loopback接口:

ip addr add dev lo 33.33.33.33/32

再添加兩條路由

ip route add 0.0.0.0/0 via 1.1.1.2 metric 10 src 33.33.33.33

ip route add 0.0.0.0/0 via 2.2.2.2 metric 20 src 33.33.33.33

然後在其網卡1直連的機器1上配置一條路由:

route add -host 33.33.33.33 gw 1.1.1.1 (1.1.1.1是網卡1的IP位址)

然後在其網卡2直連的機器2上配置一條路由:

route add -host 33.33.33.33 gw 2.2.2.1 (2.2.2.1是網卡2的IP位址)

效果是什麼?效果就是網卡1或者網卡2由于某種原因down掉了,隻要另一個還up,33.33.33.33這個位址就是可達的,同時33.33.33.33也是提供服務的位址。在這個例子中,網卡上配置的1.1.1.1,2.2.2.1這兩個IP位址完全是用于IP路由尋址的,而标示主機的33.33.33.33則配置在Loopback接口上。Loopback接口的IP位址被認為隻能是最後一跳,因為不能将它用于尋址。

既然标示主機的IP位址可以全部配置在loopback上,那麼為何不把所有的IP位址都配置在loopback上呢?即實體網卡上不再配置任何IP位址,然後配置arp,使得可以回複本應該配置在實體網卡的但是實際上卻配置在loopback上的IP位址的ARP請求,另外直連路由需要從loopback删除,并重新手工添加在相應的實體網卡上。

Loopback實際上是個hole,但是如果它不是一個hole,它确實可以做一些事,類似Cisco的NVI那樣...

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1304512