歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

Linux技術:用IP地址的用途理解Loopback接口

1.問題

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

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

2.Local路由表

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

因此,只要是在Local表中配置一條路由,數據包就會被本地三層接收,至於能否接收成功,就看第四層以及更高層了。

3.負責尋址的IP地址

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

4.標示主機本身的IP地址

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

5.配置在物理網卡上的IP地址標示主機

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

6.IP地址規劃

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

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

7.Loopback接口

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

首先,我可以肯定地說,配置在Loopback接口上的IP是屬於主機的,而配置在物理網卡上的IP地址在不同層面可以認為屬於主機和屬於網卡。另外,這種Loopback不依賴任何物理鏈路狀態和鏈路層協議,永遠不會down掉,只要有一塊網卡是up狀態並且路由可達,該Loopback接口上配置的標示該主機的IP地址就可達。

8.配置路由指定源地址很重要

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

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

9.一個實際例子

我添加一個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地址被認為只能是最後一跳,因為不能將它用於尋址。

10.另一個方案

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

11.續

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

 

Copyright © Linux教程網 All Rights Reserved