Linux 原生橋接器(Bridge)
知道了 TAP 的基本運作原理與使用方式之後,實際上,在架構虛擬電腦的時候,也並不全然都將虛擬電腦部屬在內部網路之內,例如,如果此虛擬電腦要提供網路服務的話,像是網頁伺服器,就不適合將虛擬電腦放置在內部網路,反而是要提供一組可對外聯繫的 IP ,這樣網路服務才能正常運作。而除了手動指定 IP 位址之外,利用 Bridge 的功能,一樣以可以讓虛擬電腦取得可對外聯繫的 IP 。
※ 建立 Bridge 虛擬網路裝置
那麼,該如何建立 Bridge 虛擬網路裝置呢?這邊除了會用到 TAP 來建立虛擬網路介面(卡)之外,還會用到〝brctl〞這一個指令來建立 Bridge 虛擬網路裝置,當然,預設 Linux 系統內是沒有這一個指令,需要安裝「bridge-utils」這一個套件之後,才能使用,不過,如果之前已經有安裝過 Linux KVM,則此一套件在安裝 KVM 的時候,就已經附加安裝進來,可以不需要再安裝一次。
先利用以下指令來產生兩個虛擬網路介面(卡):
$ sudo tunctl -b -u jeos(jeos 為使用者名稱,請依照實際狀況修改)
$ sudo tunctl -b -u jeos
若之前沒有利用 TAP 建立過虛擬網路介面(卡),則經由上述指令產生的虛擬網路介面(卡),應該為 tap0 與 tap1 ,接著再利用以下指令來替這兩張虛擬網路介面(卡)設定 IP 位址:
$ sudo ifconfig tap0 0.0.0.0 up
$ sudo ifcnofig tap1 0.0.0.0 up
到這邊,大家可能會感到疑惑,為何 IP 位址都是「0.0.0.0」呢?這是因為等一下會將這兩張虛擬網路介面(卡)加入橋接網路之內,所以並不需要刻意額外指定 IP 位址,而設定為「0.0.0.0」就是要讓虛擬網路介面(卡)可以接受任何封包的傳遞。
再來我們再利用以下指令來產生橋接網路介面(Bridge):
$ sudo brctl addbr br01
參數 | 說明 |
brctl | 產生橋接介面的指令 |
addbr | 產生橋接介面,後方接著為介面名稱,如 br01 |
同樣的,利用以下指令,將橋接介面(br01)的 IP 指定為「0.0.0.0」:
$ sudo ifconfig br01 0.0.0.0 up
可以利用〝ifconfig br01〞的指令來查看橋接介面的資訊:
再來利用以下指令,來查看 Bridge 的介面資訊:
$ brctl show
這邊可以注意到,br01 再「interfaces」的欄位,目前並沒有任何介面卡的資訊,這表示 br01 目前並沒有 Bridge 的功能再任何介面卡上,所以,接下來我們就將「tap0」與「tap1」給加到 br01 之內:
$ sudo brctl addif br01 tap0
$ sudo brctl addif br01 tap1
參數 | 說明 |
addif | 加入介面,後方接兩個資訊,第一個為指定的 bridge 介面名稱,第二個則為要加入的介面卡名稱 |
介面卡加入之後,再利用〝brctl show〞的指令來查看異動後的資訊:
這邊就可以清楚看到,我們已經將「tap0」與「tap1」這兩張虛擬網路介面(卡)給加入到「br01」這個橋接介面之內,這表示之後虛擬網路介面(卡)之後的網路區段,就可以藉由「br01」這個橋接介面使用 Bridge 的功能。
接著我們啟動兩台虛擬電腦(tBala Live CD),並分別使用「tap0」與「tap1」這兩張虛擬網路介面(卡),除此之外,還手動指定虛擬電腦的 MAC Address:
$ kvm -m 256 -net nic,macaddr=52:54:00:11:11:11 -net tap,ifname=tap0,script=no,downscript=no -cdrom DSL-tBala10.iso -boot d &
$ kvm -m 256 -net nic,macaddr=52:54:00:22:22:22 -net tap,ifname=tap1,script=no,downscript=no -cdrom DSL-tBala10.iso -boot d &
虛擬電腦進入桌面之後,開啟桌面上的終端機,並分別設定「172.16.1.2」與「172.16.1.3」這兩組 IP 位址,並利用〝ifconfig -a〞的指令來查看設定後的結果:
這時可以兩台虛擬電腦互相〝ping〞對方的 IP 位址,就可以發現整個內部網路是可以相互連線的。
※ Internet 連線設定
整個 Bridge 的內部網路架構暢通之後,再來就是要讓內部網路的虛擬電腦可以連結到網際網路,而首先,我們必須設定一組整個內部網路的預設閘道(Default Gateway),這樣網路封包才能有內外傳遞的窗口,而就整個 Bridge 的架構來說,「br01」就使整個內部網路的預設閘道,利用以下指令來給「br01」設定一組 IP 位址:
$ sudo ifconfig br01 172.16.1.254 up
設定完成,使用〝ifconfig br01〞來查看設定後的結果:
同樣的,若內部網路要連結到網際網路,也還是需要依靠 Host OS 利用防火牆啟用 NAT,指令如下:
$ sudo iptables -t nat -A POSTROUTING -o eth0 -s 172.16.1.0/24 -j MASQUERADE
除此之外,同樣的,Guest OS(虛擬電腦)內也還需要在路由表寫入預設閘道的資訊,指令如下:
$ route add default gateway 172.16.1.254
最後,修改 Guest OS 內「NameServer」資訊,這也就是 DNS Server 的資訊,利用任一編輯器(tBala Live CD 的終端機內只有 nano 這套編輯器),開啟「/etc/resolve.conf」的檔案,並設定 nameserver 的資訊為 168.95.1.1,這是中華電信的 DNS Server,因為筆者實際的操作環境並不存在 DNS Server,故借用中華電新的。這樣,內部網路區段內的虛擬電腦,就可以連結到網際網路上了。