大家都知道VMWare的三種組網模式,分別為Bridge,NAT,Host-Only。VMWare認為使用這三種組網模式則可以搭建出任意的網絡拓撲了,事實上也正是如此。如果你對網絡很精通,那麼應該很容易就可以理解VMWare的網絡配置模式,然而即使如此,VMWare由於只是一個虛擬機,沒有形象的拓撲展示出來。本文簡單的給出三種組網模式的形象化的圖示,另外,VMWare的幫助文檔中也有相當詳細的介紹VMNet的章節。
顧名思義,Bridge模式就是橋接模式,虛擬機裡面的網卡直接橋接在宿主機的某一個物理網卡所在的網段。示意圖如下:
這種方式很多時候是為像我這樣的懶人提供的,然而在非DHCP的情況下,很容易造成IP地址沖突,因此如果不是非要將虛擬機配置在一個網段,就不要用Bridge模式。Bridge模式的組網拓撲如下:
所謂NAT模式就是將虛擬機網卡隱藏在了一個NAT設備之後,在外界看來,只能看到宿主機物理網卡,甚至連NAT設備都看不到,NAT設備默默地轉換著虛擬機內部出來的連接的源地址,如下圖所示:
然而,有一個細節,那就是上圖中的菱形到底是如何實現的,VMWare到底如何在不同的宿主操作系統下模擬出一個一致的NAT設備的。為了實現的一致和簡單,VMWare使用了用戶態連接代理的方式來實現NAT設備,因此NAT設備其實就是一個用戶態進程,它來執行地址轉換,如下圖所示:
所謂的地址轉換其實不是真正的IP網絡意義上的地址轉換,而是一個代理。虛擬機裡面發起的連接在宿主機的NAT進程中完全被截獲,然後NAT進程偷梁換柱代替虛擬機裡面的連接單獨向目的地發起一個連接,隨後和目的地通信,然後將數據轉發給虛擬機。我們可以通過一個簡單試驗來說明這一點:
iptables -A OUTPUT -p tcp --tcp-flags SYN SYN -j ACCEPT
iptables -A OUTPUT -j DROP
iptables -A INPUT -j DROP
telnet 74.125.128.94 80
lsof -p 271 -n
...
vmnet-nat 271 root 7u IPv4 0xffffff8017b62160 0t0 TCP 192.168.1.101:49256->74.125.128.94:http (ESTABLISHED)
...
虛擬機裡面只能發出syn包,然而宿主機裡面到74.125.128.94的連接已經建立,說明nat進程是一個用戶態的連接代理。同樣的結論還可以通過tcp抓包來觀測到,怎麼觀測呢?很簡單,查看序列號即可,虛擬機裡面抓取的數據包的序列號和確認號和宿主機上抓取的“同樣連接”(實際上不是一個連接,而是被代理的)的序列號以及確認號不是一致的,而我們知道,常規的NAT只修改五元素,不會修改序列號。
可見,由於NAT是一個代理,NAT模式可能會造成目的主機TCP連接統計的不准確,比如上述實驗中,虛擬機明明沒有連接成功目的地,然而宿主機的NAT進程卻已經建立了一個TCP連接。使用NAT模式,就需要知道它所帶來的一切副作用。最後NAT模式的組網拓撲如下:
這種模式其實是最純粹的了,虛擬機和宿主機的一塊網卡(虛擬網卡)直連,僅此而已,如下圖所示:
可是Host-Only模式的虛擬機如何連接外網呢?虛擬機可以將宿主機作為一台路由器來看待,如此一來,剩下的問題就是如何來配置這個路由器了。以下步驟是必須的:
Linux:sysctl -w net.ipv4.ip_forward=1
Mac OS:sysctl -w net.inet.ip.forwarding=1
Windows:打開Tcpip的IPEnableRouter注冊表項
Host-Only模式的組網拓撲如下所示:
VMWare在宿主機中虛擬了幾塊網卡,這些網卡實際上都是一些帶有多個port的二層或者三層網絡設備。本文到此為止沒有談到DHCP,實際上每種組網模式都可以有一台DHCP服務器插入這些虛擬設備的port,為虛擬機裡面的網卡分配IP地址。
默認情況下,VMWare提供了vmnet0/1/8三塊虛擬網卡,vmnet0外界看不到,它實際上是一個純鏈路層Bridge,該Bridge設備沒有任何三層功能,該Bridge的其中一個port就是宿主機的某一塊物理網卡。vmnet1專門給Host-Only來使用,vmnet8專門用於NAT,這兩個虛擬網卡都有三層的功能,都可以配置IP地址,實實在在是一塊宿主機上可見的網卡啊,除此之外,這兩塊網卡同時也是Bridge設備,只是該Brdige並沒有橋接任何宿主機上的任何物理網卡。