天天看點

linux同一台機器上的兩塊網卡設定同一段的P

今天我的一個朋友問了我這樣一個問題,我給同一台機器上的兩塊網卡設定同一段的 IP,怎麼出現了很多的問題? 我們先來看下他是如何操作的:     拓撲圖很簡單:  

linux同一台機器上的兩塊網卡設定同一段的P

  伺服器為RHEL5 雙網卡,eth0為234,eth1為233,我本地客戶機為172。

RHEL: ifconfig如下:

[[email protected] ~]# ifconfig

eth0      Link encap:Ethernet HWaddr  00:0C:29:A5:D5:A3 

          inet addr: 60.232.83.233 Bcast:60.232.83.255 Mask:255.255.255.128

略。。。。。。。

eth1      Link encap:Ethernet HWaddr  00:0C:29:A5:D5:AD 

          inet addr :60.232.83.234 Bcast:60.232.83.255 Mask:255.255.255.128

          略。。。。。。。。。

lo        Link encap:Local Loopback 

          inet addr:127.0.0.1 Mask:255.0.0.0

          略。。。。。。。。。

在客戶機XP上ping兩個位址,都是通的。

C:\ >ping 60.232.83.233

Pinging 60.232.83.233 with 32 bytes of data:

Reply from 60.232.83.233: bytes=32 time=9ms TTL=64

Reply from 60.232.83.233: bytes=32 time<1ms TTL=64

C:\ >ping 60.232.83.234

Pinging 60.232.83.234 with 32 bytes of data:

Reply from 60.232.83.234: bytes=32 time<1ms TTL=64

Reply from 60.232.83.234: bytes=32 time<1ms TTL=64

此時用arp –a在本地檢視

C:\ >arp -a

Interface: 60.232.83.172 --- 0x20005

Internet Address      Physical Address      Type

60.232.83.129         00-04-96-1a-ca-60     dynamic

60.232.83.233         00-0c-29-a5-d5-a3     dynamic

60.232.83.234         00-0c-29-a5-d5-a3     dynamic

發現兩個網卡的MAC位址一樣,也就是eth0的mac位址。

現在我們[[email protected] ~]# ifconfig eth1 down

來禁止eth1,結果ping 233和234的位址都是通的。

這裡可以這樣了解,arp –a看到本地解析到得兩塊網卡mac位址是一樣的,區域網路是通過2層尋址的不可能涉及到ip這樣的3層協定,是以mac位址相同ping哪個都應該是通的,但是為什麼本地會出現不同的IP相同的mac位址呢?在Linux上看到的明明是不同的MAC位址00:0C:29:A5:D5:A3,00:0C:29:A5:D5:AD

繼續測試,現在把eth0禁止。

[[email protected] ~]# ifconfig eth0 down 

[[email protected] ~]# ifconfig

eth1      Link encap:Ethernet HWaddr 00:0C:29:A5:D5:AD 

          inet addr:60.232.83.234 Bcast:60.232.83.255 Mask:255.255.255.128

          inet6 addr: fe80::20c:29ff:fea5:d5ad/64 Scope:Link

          略。。。。。

lo        Link encap:Local Loopback 

          inet addr:127.0.0.1 Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          略。。。。

本地先arp –d清除一下緩存。然後再ping兩塊網卡的IP位址,依然可以ping通兩個位址。

Arp –a後發現: C:\>arp -a

Interface: 60.232.83.172 --- 0x20005

Internet Address      Physical Address      Type

60.232.83.129         00-04-96-1a-ca-60     dynamic

60.232.83.233         00-0c-29-a5-d5-ad     dynamic

60.232.83.234         00-0c-29-a5-d5-ad     dynamic

Mac位址成為另一塊也就是eth1的mac位址。

然後開啟eth0,然後再ping測試一下。結果如下:

C:\>arp -a

Interface: 60.232.83.172 --- 0x20005

Internet Address      Physical Address      Type

60.232.83.129         00-04-96-1a-ca-60     dynamic

60.232.83.233         00-0c-29-a5-d5-a3     dynamic

60.232.83.234         00-0c-29-a5-d5-ad     dynamic

這才是一張正常的位址表。

這時候再關閉eth0,結果就ping不通了,因為這時候緩存裡的233的mac位址已經關閉。

Arp –d之後就可以ping通了,此時eth0依然處于關閉狀态,隻是清楚了一下緩存表,這樣再起ping233位址,可以ping通了,得出的結果是234的mac位址。

C:\>arp -a

Interface: 60.232.83.172 --- 0x20005

Internet Address      Physical Address      Type

60.232.83.129         00-04-96-1a-ca-60     dynamic

60.232.83.233         00-0c-29-a5-d5-ad     dynamic

60.232.83.234         00-0c-29-a5-d5-ad     dynamic

此時開啟eth0,現在本地緩存中的兩個IP依然對應的還是234的mac位址。Arp –d清除一下,這次先ping 234再ping 233,結果兩個都是233的既eth0的mac位址。

實驗做到這裡腦子有點亂,把這台Linux伺服器換成Windows Server 2003,就沒有這問題出現。

C:\Documents and Settings\Administrator>ipconfig /all

Windows IP Configuration

   Host Name . . . . . . . . . . . . : newxyz-yz5l2clv

   Primary Dns Suffix . . . . . . . :

   Node Type . . . . . . . . . . . . : Unknown

   IP Routing Enabled. . . . . . . . : No

   WINS Proxy Enabled. . . . . . . . : No

Ethernet adapter 本地連接配接 3:

   Connection-specific DNS Suffix . :

   Description . . . . . . . . . . . : VMware Accelerated AMD PCNet Adapter #2

   Physical Address. . . . . . . . . : 00-0C-29-68-03-AF

   DHCP Enabled. . . . . . . . . . . : No

   IP Address. . . . . . . . . . . . : 60.232.83.251

   Subnet Mask . . . . . . . . . . . : 255.255.255.128

   Default Gateway . . . . . . . . . :

Ethernet adapter 本地連接配接 2:

   Connection-specific DNS Suffix . :

   Description . . . . . . . . . . . : VMware Accelerated AMD PCNet Adapter

   Physical Address. . . . . . . . . : 00-0C-29-68-03-A5

   DHCP Enabled. . . . . . . . . . . : No

   IP Address. . . . . . . . . . . . : 60.232.83.250

   Subnet Mask . . . . . . . . . . . : 255.255.255.128

   Default Gateway . . . . . . . . . :

本地ping兩塊網卡之後顯示如下:

C:\Documents and Settings\Administrator>arp -a

Interface: 60.232.83.198 --- 0x10005

Internet Address      Physical Address      Type

60.232.83.129         00-04-96-1a-ca-60     dynamic

60.232.83.250         00-0c-29-68-03-a5     dynamic

60.232.83.251         00-0c-29-68-03-af     dynamic

關閉任何一個網卡都是無法ping的。 我給他的答案是:

  是以在Linux下網卡可能采用一些機制,比如說,首先,問題屬于雙網卡同一網段linux系統網卡自動路由的問題。 

2、如果系統有兩個獨立網卡,并且這兩個網卡的IP屬于同一個子網,那麼後面這個網卡的IP将自動路由到前面一個網卡上。 

也就是說資料将自動路由到前面的那個網卡上。在不加任何設定的情況下,如果前面的網卡斷線或者故障了(拔掉網線或者網卡指壞了),必須用指令down調後 面的網卡然後再up,這時後面的網卡才能啟用。此時兩個IP又同時路由到後面的網卡上,也就是說後面的網卡又具有兩個IP位址。

當然兩塊網卡設定成同一網段是不合理的。

結論: 這種現象正常。我們将其了解為在Linux系統下雙網卡設定同樣網段沒有正确更新路由表的能力。是以會造成上述情況出現。

是以最好的方法是避免這樣操作。   ################################################################################ 其實同一台機器上的雙網卡未必不能設定同一段的 IP 位址,如果想做到這一點那我們就要用到雙網卡綁定的技術 那什麼是雙網卡的綁定我感覺還是有必要再啰嗦一下:  顧名思義雙網卡的 bonding 就是将兩塊網卡綁定在一起實作網卡的流量負載和主備的功能。Bonding 是通過一個虛拟的網絡配置檔案對外提供 IP 位址。Linux雙網卡綁定實作就是使用兩塊網卡虛拟成為一塊網卡,這個聚合起來的裝置看起來是一個單獨的以太網接口裝置,通俗點講就是兩塊網卡具有相同的IP位址而并行連結聚合成一個邏輯鍊路工作。其實這項 技術在Sun和Cisco中早已存在,被稱為Trunking和Etherchannel技術,在Linux的2.4.x的核心中也采用這這種技術,被稱為bonding。bonding技術的最早應用是在叢集——beowulf上,為了提高叢集節點間的資料傳輸而設計的。下面我們讨論一下bonding 的原理,什麼是bonding需要從網卡的混雜(promisc)模式說起。我們知道,在正常情況下,網卡隻接收目的硬體位址(MAC Address)是自身Mac的以太網幀,對于别的資料幀都濾掉,以減輕驅動程式的負擔。但是網卡也支援另外一種被稱為混雜promisc的模式,可以接收網絡上所有的幀,比如說tcpdump,就是運作在這個模式下。bonding也運作在這個模式下,而且修改了驅動程式中的mac位址,将兩塊網卡的Mac位址改成相同,可以接收特定mac的資料幀。然後把相應的資料幀傳送給bond驅動程式處理。 首先要看linux是否支援bonding,RHEL4已經預設支援了.(大部分發行版都支援) # modinfo bonding filename:       /lib/modules/2.6.18-8.el5/kernel/drivers/net/bonding/bonding.ko

author:         Thomas Davis, [email protected] and many others

description:    Ethernet Channel Bonding Driver, v3.0.3

version:        3.0.3

license:        GPL

srcversion:     2547D22885C2FDF28EF7D98   以下是簡單的手動實作bonding的配置。 1.      建立虛拟網絡配置檔案ifcfg-bond0 :

linux同一台機器上的兩塊網卡設定同一段的P

    3.修改/etc/modprobe.conf,在最後面加入以下兩行,讓系統啟動的時候在動加載 bonding 子產品,對外的虛拟的網絡接口為 bond0: alias bond0 bonding options bond0 miimon=100 mode=1

linux同一台機器上的兩塊網卡設定同一段的P

或者是 # vi /etc/rc.d/rc.local  

加入  

ifenslave bond0 eth0 eth1  5.    加載 bonding 子產品

linux同一台機器上的兩塊網卡設定同一段的P

  設定完成後必須要重新啟動系統。     此時不管是斷開那一塊網卡網絡也可以通訊。 7.可以通過 /proc/net/bonding/bond0 檢視網卡的主備狀态

linux同一台機器上的兩塊網卡設定同一段的P

      從原理分析一下(bond運作在mode 0下):

mode 0下bond所綁定的網卡的IP都被修改成一樣的mac位址,如果這些網卡都被接在同一個交換機,那麼交換機的arp表裡這個mac位址對應的端口就有多個,那麼交換機接受到發往這個mac位址的包應該往哪個端口轉發呢?正常情況下mac位址是全球唯一的,一個mac位址對應多個端口肯定使交換機迷惑了。

是以mode0下的bond如果連接配接到交換機,交換機這幾個端口應該采取聚合方式(cisco稱為ethernetchannel,foundry稱為portgroup),因為交換機做了聚合後,聚合下的幾個端口也被捆綁成一個mac位址

繼續閱讀