作者: Colin Jao 饒康立 – VMware資深技術顧問,主要負責VMware NSX產品線,目前致力於網路虛擬化暨分散式安全防護技術方案的介紹與推廣。 

 

本文內,我們利用兩個例子與各位說明在使用分散式邏輯路由器時,虛擬機器間路徑的Packet Walk是怎麼樣。狀況分別是

 

  • 若兩個不同網段的VM位在同一台伺服器上
  • 若兩個不同網段的VM位在不同的伺服器上

 

另外進入本文前,亦請先參考專欄內前文:邏輯交換器的運作方式(二)內,針對位於同個邏輯交換器,但實體在不同伺服器上的兩個VM,如何進行封包交換的方式進行了解。本文內會採用到上面這篇文章內所提到的背景知識。

 

圖說:實例一、兩個VM位於同一伺服器,不同網段

 

第一個範例內,VM1與VM2是分別位於不同的邏輯交換器VXLAN 5001 / 5002上。VM1的MAC位置為MAC1,IP為192.168.20.10。VM2的MAC位置是MAC2,IP為192.168.10.10。邏輯路由器跑在vSphere Host A上,接取VXLAN 5001邏輯交換器的介面為LIF1,IP為192.168.20.1 (VM1的default gateway),MAC是vMAC。接取VXLAN 5002邏輯交換器的介面是LIF2,IP為192.168.10.1 (VM2的default gateway),MAC是vMAC。VM1往VM2進行封包傳送時的動作為

 

1.VM1往VM2送出IP封包,因為VM2與VM1位於不同網段,因此這個封包會長這樣

 

2.這個封包到達vSphere Host A,在Hypervisor內DLR Kernel Module的路由表是長這樣的

 

 

因此DLR Kernel Module接收到此封包,依據Destination IP,與路由表比對後,知道要將封包轉發至LIF2所接取的VXLAN 5002邏輯交換器上。

 

此時,vSphere Host A藉由VXLAN 5002的ARP Table,查出192.168.10.10的對應MAC (MAC2),且Host知道對應這個MAC的機器就在自己身上。

 

3.因此,由Host透過LIF2直接將封包送往VM2。此時的IP封包會長成這樣

 

上面的流程十分直覺。但可能會讓網路工程師疑惑的點是為什麼不同的VXLAN邏輯交換器上的網段,在DLR Kernel Module上的default GW MAC Address都是vMAC。這邊是與實體網路很不同的地方。實體網路裡,每一個路由器上的ethernet介面應該都有不同的MAC Address,但在虛擬Ethernet環境裡,在每個虛擬機器連結到DLR時,虛機的MAC與DLR (Hypervisor)之間的ethernet網段沒有其他的機器,不會有兩個以上的Gateway,因此DLR上的介面MAC Address都設成一樣,也沒有什麼問題。這個MAC Address叫做vMAC,其中

 

  • DLR接取不同邏輯交換器的介面MAC Address都是同樣的vMAC
  • 事實上,分佈在不同Host上的 DLR Kernel Module,提供給同一個邏輯交換器的Gateway MAC Address也都是同樣的vMAC

 

所以,當VM在不同Host的邏輯交換器上飄來飄去時 (如vMotion / DRS / HA…),不會因為身在不同的Host,由不同Host上的DLR Kernel Module處理Routing,結果Gateway的MAC Address就要一直改變。

 

第二個例子是兩個不同網段的VM位在不同的伺服器上,如下圖:

 

除了VM2是位於右邊的vSphere Host B上,狀況與第一個例子完全相同 。此時

 

1.VM1往VM2送出IP封包,因為VM2與VM1位於不同網段,因此這個封包會長這樣

 

 

2.這個封包到達vSphere Host A,在Hypervisor內DLR Kernel Module的路由表是長這樣的

 

因此DLR Kernel Module接收到此封包,依據Destination IP,與路由表比對後,知道要將封包轉發至LIF2所接取的VXLAN 5002邏輯交換器上。

 

此時,藉由於之前邏輯交換器內介紹的Packet Walk機制,包括於Host上以及NSX Controller內儲存的VTEP Table / MAC Table / ARP Table等,vSphere Host A會知道對應目的位置192.168.10.10的虛擬機器的資訊,包括

  • 此虛機的MAC Address (MAC2)
  • 在vSphere Host B上
  • 透過VXLAN 5002交換器接取

 

3.因此,由Host A透過LIF2將封包藉由VXLAN 5002送往 Host B。此時的VXLAN封包會長成這樣

 

 

而VM2接收到的Ethernet 封包長下面這樣

 

 

 

 

結束前,詢問讀者一個問題。上面的Packet Walk是VM1送往VM2,而VM2回應VM1的封包,是由Host A或是Host B的DLR Kernel Module處理呢?

 

答案是由Host B上的DLR模組進行處理。邏輯路由器的路由轉發動作,永遠由虛擬機器直接接取的Host上的Kernel Module進行。但去與回的Traffic由不同Host上的DLR Kernel Module並不會造成問題,因為透過集中的DLR Control VM以及NSX Controller控制,不同Host上DLR Kernel Module的轉發表與組態是一致的,不會因為由不同Host處理,就有不同步的問題。

 

相關閱讀:大家對邏輯路由器Packet Walk有興趣的話,可以參考下面VMware Network Virtualization官方部落格的文章做更進一步的閱讀。http://blogs.vmware.com/networkvirtualization/2013/11/distributed-virtual-and-physical-routing-in-vmware-nsx-for-vsphere.html