天天看點

vmware的vmnet-了解全景後解答兩個問題

問題一:虛拟機中增加兩塊網卡eth0和eth1,均為bridge模式,兩塊網卡的ip位址配置到和真實機器真實網卡的同一網段,兩塊虛拟機網卡的arp_ignore均設定為1,然後真實機器上ping 虛拟機的eth0,在虛拟機的兩塊網卡上同時抓包,可以看出,eth0回複的arp回應也能被eth1收到,這是因為當在eth0和eth1上同時抓包時,兩個網卡都将成為PROMISC(混雜)模式,而這兩塊網卡是由真實機器的兩個userif的卡口代理的,可以在/proc/vmnet中看出,hub0.0由bridge,即實體真實網卡連接配接,而hub0.1由userif9(或者别的數字)連接配接,它即是虛拟機eth0的真實機器代理,hub0.2由userif10(或者别的數字)連接配接,它即是虛拟機eth1的代理,它們都在一個虛拟交換機上,是以當arp回應通過userif9進入虛拟交換機的時候,虛拟交換機将在各個卡口調用其receive例程,而eth1的userif10此時已經是混雜模式,是以雖然這個arp是單點傳播給真實機器的真實網卡的,userif10也能收到,進而虛拟機的eth1也就收到了,具體在userif的receive例程中的比較目的mac位址的判斷中:

Bool VNetPacketMatch(uint8   *destAddr, // IN: destination MAC

                uint8   *ifAddr,   // IN: MAC of interface

        uint8   *ladrf,    // IN: multicast filter

                uint32   flags)    // IN: filter flags

{

   static const uint8 broadcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};

   return ((flags & IFF_PROMISC) || MAC_EQ(destAddr, ifAddr) ||  //混雜模式的網卡完全接收

       ((flags & IFF_BROADCAST) && MAC_EQ(destAddr, broadcast)) || 

       ((destAddr[0] & 0x1) && (flags & IFF_ALLMULTI || 

         (flags & IFF_MULTICAST && 

          VNetMulticastFilter(destAddr, ladrf)))));

}

是以雖然這個虛拟交換機名字是交換機(Virtual Switch),然而它真實的身份卻是一個hub,在源代碼中,它真的沒有命名為switch.c而是hub.c。

問題二:對于host-only模式的虛拟機網卡,如何通路外網? 

辦法就是将虛拟機的預設網關設到真實機器的vmnet1的ip位址,然後在真實機器上将ip_forward打開,并且配置一條snat規則在真實的網卡上,對于從host-only網絡來的資料包,全部進行nat。此種辦法對于殺掉vmnet-natd但是使用nat模式的虛拟機網卡同樣有效,要知道nat模式和host-only模式的差別就在于host-only模式少一個vmnet-natd這個程序。

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

繼續閱讀