Linux 原生內部虛擬網卡(TAP):Isolated Network(單機)
在使用 VMware 系列虛擬軟體的時候,我們都很習慣 VMware 虛擬軟體幫我們預設建立的三種虛擬網路架構( VMnet0、VMnet1、VMnet8 ),然後再依照虛擬電腦的用途,選擇合適的虛擬網路架構,不過,卻從來不曾對以下的兩個問題感到疑惑,那就是:
不過,可惜的是,這樣的問題,在 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 內,我們可以有以下三種方法來建構我們所需的網路架構,方法如下:
由上述已經可以知道,第一種方式,也就是手動指定參數的設定模式,難以實際運用在公司企業的內部網路,而第三種方法,則是可以讓 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 的架構如下圖所示:
先簡單的解釋上圖的圖示:
其中,要特別解釋的地方,在於 Host OS 、 Guest OS 與 tap0 之間的關係,眼尖的讀者,可能會發現怎麼 Host OS 與 Guest OS 上都有一張名稱為〝tap0〞的虛擬網路介面(卡),而且還連結(紅色實線)在一起,這是怎回事呢?簡單來說,大家可以想像這條紅色連接線,是一條連結兩台電腦的〝跳線〞,我想,這樣一說,大家就可以比較清楚的知道這連結的模式,而 tap0 雖然是由 Host OS 所建立,但卻是 Guest OS 所拿來使用的網路介面(卡),所以,我們可以知道,tap0 這張虛擬網路介面(卡),其實有兩個角色:
了解了 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 來建立虛擬網路卡,以及單機模式的使用方式。