Linux 原生內部虛擬網卡(TAP):Isolated Network(單機)

在使用 VMware 系列虛擬軟體的時候,我們都很習慣 VMware 虛擬軟體幫我們預設建立的三種虛擬網路架構( VMnet0、VMnet1、VMnet8 ),然後再依照虛擬電腦的用途,選擇合適的虛擬網路架構,不過,卻從來不曾對以下的兩個問題感到疑惑,那就是:

  1. VMware 是怎樣產生(建立)這些虛擬網路架構的?
  2. VMware 是如何替這些虛擬網路架構,設定不同的網路連線模式( Bridge、NAT、Host-Only )?

不過,可惜的是,這樣的問題,在 Windows 的系統內,實在不容易得到解答,因為沒有合適的方式,來解析虛擬網路架構的產生與運作方式,然而,在接觸 Linux KVM( Linux核心虛擬系統)之後,讓我們有了一個很好的機會,來實際了解,虛擬網路架構的運作原理,以及虛擬電腦是怎樣利用這些虛擬網路架構,來達到預期的網路連線模式。

※ Linux 原生虛擬網路:TAP/TUN

我們知道,Linux KVM 實際上是由 KVM 與 QEMU 這兩個套件所組成,前者主要是用來控制 CPU 與記憶體的運作(偵測與啟用 CPU 虛擬化技術),後者則是用來操控所有周邊裝置的套件,當然,也包含網路裝置。

而 QEMU 原生的虛擬網路架構( Virtual LANs,預設為 VLAN0,預設使用 user mode 的連線模式),一次只能提供一台虛擬電腦來使用,若再產生另外一台虛擬電腦,則會有另外一組 VLAN,而有趣的是,所有藉由 QEMU 所產生的 VLAN,網路架構全都一模一樣,連賦予給虛擬電腦的 IP 位置,也都相同,可以想像,這樣的網路結構,都只能單機運作,獨立對外連線,所有的虛擬電腦都無法相互溝通,簡單來說,就是內部網路的結構是不存在的,當然,QEMU 可以透過其他的連線模式(參數,如 Socket),來打通所有 VLAN 的連線通道,不過,這樣的設定模式,事實上並無法實際的應用在任何公司的內部網路之上(測試使用除外)。

而在 Linux KVM 內,我們可以有以下三種方法來建構我們所需的網路架構,方法如下:

  1. 手動指定參數設定 Linux KVM 原生網路
  2. 利用 Linux 原生虛擬網路架構( TAP/TUN )
  3. 使用 Libvirt 管理函式庫

由上述已經可以知道,第一種方式,也就是手動指定參數的設定模式,難以實際運用在公司企業的內部網路,而第三種方法,則是可以讓 Linux KVM 發揮全部效能的管理函式庫,當然,也包含了虛擬網路設定的功能,這讓我們在使用上,能達到與 VMware 預設建立的虛擬網路架構有相同的效果。

而第二種方法呢?其實,說穿了,TAP/TUN 原先就是 Linux 系統內的套件(預設系統並不見得有安裝),在虛擬系統發展的早期,就是一些 IT 人員用來測試網路的虛擬網路套件,只是因為虛擬系統發展之後,就漸漸被大家所遺忘了,另外,libvirt 所建立的虛擬網路,底層也是透過 TAP/TUN 來完成的,所以,了解 TAP/TUN 的運作原理與使用方式,可是有助於我們更加了解虛擬網路的運作模式喔!

那什麼是 TAP/TUN 呢?TAP 與 TUN 是以軟體來模擬硬體的虛擬網路設備,且能夠達到跟網路硬體相同的功能,而就功能性來說,TAP 是屬於 OSI 網路通訊協定的第二層,也就是資料連結 層,主要在負責實體層(也就是實體網路卡)與網路層(也就是所謂的 IP )之間資料轉換的動作,而 TUN 則是屬於 OSI 的第三層,也就是網路層,主要是處理 IP 與 Route(路由)的結構與通訊,也因為如此,所以 Linux KVM 才能夠過 TAP/TUN 來建立虛擬網路卡、虛擬 Hub 與 Bridge 的網路介面。

簡單來說,TAP 的架構如下圖所示:

先簡單的解釋上圖的圖示:

  1. Host OS 表示實體主機,而 Guest OS 則為虛擬電腦
  2. eth0 為實體主機對外連線的網路介面(卡)
  3. tap0 則為利用 TAP 所產生的虛擬網路介面(卡)
  4. Virtual Network 表示實體主機所產生的虛擬網路介面(卡),其中,虛線圈圈只是用來表示可以產生的虛擬網路介面(卡),不只一張
  5. NAT 的位置,並伴隨著防火牆的圖示,這表示虛擬網路介面(卡),若是要連結到網際網路,則需要透過實體主機的防火牆,開啟 NAT 的功能

其中,要特別解釋的地方,在於 Host OS 、 Guest OS 與 tap0 之間的關係,眼尖的讀者,可能會發現怎麼 Host OS 與 Guest OS 上都有一張名稱為〝tap0〞的虛擬網路介面(卡),而且還連結(紅色實線)在一起,這是怎回事呢?簡單來說,大家可以想像這條紅色連接線,是一條連結兩台電腦的〝跳線〞,我想,這樣一說,大家就可以比較清楚的知道這連結的模式,而 tap0 雖然是由 Host OS 所建立,但卻是 Guest OS 所拿來使用的網路介面(卡),所以,我們可以知道,tap0 這張虛擬網路介面(卡),其實有兩個角色:

  1. Guest OS 對外聯繫溝通的網路介面(卡)
  2. Host OS 與 Guest OS 溝通的橋樑

了解了 TAP 的架構與原理之後,對於後續的操作,就會比較清楚知道每個步驟的意義了。

※ 產生虛擬網路卡:TAP

前面提到,TAP 原本就是 Linux 系統內的套件,只是預設並不是每套 Linux 的發行版本都有安裝,以 Ubuntu 10.04 LTS 來說,預設就沒有安裝 TAP 的相關套件,所以要使用 TAP 建立虛擬網路卡之前,需要安裝 TAP 套件。

TAP 的套件名稱為〝uml-utilities〞,所以可以利用以下指令來安裝套件:

$ sudo apt-get install uml-utilities

按下 Enter 鍵之後,若系統提示要輸入密碼,請輸入使用者密碼,接著系統會提示所需要異動的套件名稱,如下圖:

按下〝y〞讓安裝程式繼續進行,安裝過程中,若看到下圖框起來的訊息,就表示 TAP 已經安裝完成,且已經可以開始運作與接受設定了:

TAP 套件安裝完成,接著就要實際來產生虛擬網路卡,在終端機內,輸入以下指令:

$ sudo tunctl -b -u jeos

參數

說明

-b

產生虛擬網路卡的參數

-u

設定此虛擬網路卡的使用者

輸入 Enter 鍵之後,系統會回覆虛擬網路卡的名稱:

利用 tunctl 產生的虛擬網路卡,都是以〝tap〞為虛擬網路卡為名稱的開頭,後方的編號,則由〝0〞開始,依此類推。

接著使用以下指令來查看虛擬網路卡的基本資訊:

$ ifconfig tap0

新增的虛擬網路卡,預設並沒有啟動,也沒有 IP 位址,但卻有 MAC Address,這部份可是很重要的,而關於此 MAC Address 的文章,則留到後面再來介紹。

而要讓虛擬網路卡可以正常運作,除了要啟動這張虛擬網路卡之外,當然,也還需要賦予一組專屬的 IP 位址,這樣虛擬網路卡能有功用;可以直接利用以下指令來賦予 IP 與啟動虛擬網路卡:

$ sudo ifconfig tap0 172.16.1.1 netmask 255.255.255.0 up

按下 Enter 鍵之後,可以再使用〝ifconfig tap0〞來查看虛擬網路卡異動後的資訊:

這樣,就完成了虛擬網路卡的建立與基本設定。

※ 使用虛擬網路卡:連線設定(Host OS 與 Guest OS)

新增了虛擬網路卡,接下來,當然就是要利用虛擬電腦來測試虛擬網路卡的功能,不過,為了節省時間,在這邊筆者就不再一步一步的建立虛擬電腦,而是利用〝tBala Live CD〞來測試虛擬網路卡,直接以 Linux KVM 的原生命令( kvm )來啟動此 tBala Live CD(tBala Live CD 的下載位置,請參考 tBala Live CD 的網站: http://tbala.net/joomla/ ):

$ kvm -m 256 -net nic -net tap,ifname=tap0,script=no,downscript=no -cdrom DSL-tBala10.iso -boot d &

參數

說明

-net tap

指定使用 TAP 的虛擬網路卡

ifname=tap0

指定使用 TAP 虛擬網路卡的名稱

script=no

啟動 Guest 系統時,不執行 /etc/qemu-ifup 的程式

downscript=no

啟動 Guest 系統時,不執行 /etc/qemu-ifdown 的程式

虛擬電腦( tBala Live CD )啟動進入桌面系統之後,開啟桌面的終端機圖示,並在終端機內,手動設定網路卡的 IP 位址,指令如下:

$ ifconfig eth0 172.16.1.2 netmask 255.255.255.0 up

按下 Enter 鍵之後,接著利用〝ifconfig eth0〞的指令,來查看設定的結果:

虛擬電腦( Guest OS )網路設定完成之後,嘗試讓 Host OS 與 Guest OS 兩者互 ping,來確認內部網路是否可以連線:

由以上兩圖,可以知道內部網路是可以相互連線的,這表示利用所建立的 TAP 虛擬網路卡是可以正常連線使用的。

※ 使用虛擬網路卡:Internet 連線

既然我們可以讓 Host OS 與 Guest OS 在 TAP 的輔助下相互連線,那 Guest OS 是否可以連結到網際網路呢?其實是可以的,只是需要在 Host OS 與 Guest OS 上,分別做一些設定就可以。

首先,要先幫 Guest OS 設定 Gateway,在 Guest OS 的終端機內,利用〝route -n〞的指令,先來查詢目前 routing table 的設定值:

在上圖,可以清楚的看到,Guest OS 並沒有設定 Gateway,而我們知道,Guest OS 是透過 tap0 來與 Host OS 做溝通,所以要以 tap0 來當做 Guest OS 的 Gatewaay,設定指令如下:

$ route add default gw 172.16.1.1

按下 Enter 鍵之後,可以再利用〝route -n〞的指令,來查詢異動後 routing table 的設定值:

接著,還需要幫 Guest OS 設定 DNS,在終端機內利用以下指令來開啟設定檔案:

$ nano /etc/resolv.conf (因為 tBala Live CD 並沒有安裝 vim ,只有 nano 這套編輯器)

輸入內容與格式如下圖:

因為筆者的環境實際上並沒有架設 DNS Server,故以中華電信的 DNS 來代替(tBala Live CD 內定預設已經設定好)。

搞定 Guest OS 之後,接著回到 Host OS,因為前述設定的 172.16.1.0 的網段,為內部私有網路區段,所以並無法實際連結到網際網路,因此,在 Host OS 上面,我們必須利用 iptables 來啟動 NAT 的功能,這樣才能讓 172.16.1.0 網路區段的封包可以送到到網際網路,設定方式如下(在 Host OS 的終端機內設定):

$ sudo iptables -t nat -A POSTROUTING -o eth0 -s 172.16.1.0/24 -j MASQUERADE

再來利用以下指令來查看設定結果:

$ sudo iptable -t nat -L -n

最後,在 Guest OS 的終端機內,我們嘗試 ping 外部 IP 與網址,可以發現都可以正常連結到網際網路:

而利用瀏覽器,也可以正確的連結到網際網路的網頁:

這就是利用 TAP 來建立虛擬網路卡,以及單機模式的使用方式。