程式扎記: [ Big Data 研究 ] 04 管理 Linux Container 虛擬網路 - Part2

標籤

2015年8月30日 星期日

[ Big Data 研究 ] 04 管理 Linux Container 虛擬網路 - Part2

使用自訂的虛擬橋接器 (Bridge) 
雖然 Linux 系統提供了功能完整的虛擬網路元件, 讓 LXC 虛擬主機不僅能連結內部網路, 甚至可以連接到外部網路. 但在某些實際狀況下, 我們需要封閉的網路架構來做應用系統的測試, 這時候就需要產生一個自訂的虛擬橋接器, 將測試用的虛擬主機全部連結到自訂虛擬橋接器的網路區段內, 以達到我們的需求

手動建立虛擬橋接器 
要產生自訂的虛擬橋接器, 需要使用 "brctl" 這個指令. 但在使用此指令前, 必須安裝 "bridge-utils" 套件. 而該套件在安裝 LXC 核心模組時, 就已經順便安裝道系統內了. 接著請使用下面命令產生一個名為 "br01" 的自訂虛擬橋接器: 
# brctl addbr br01
# brctl show br01
bridge name bridge id STP enabled interfaces
br01 8000.000000000000 no

目前並沒有任何一台 LXC 虛擬主機連接到 br01 上, 所以 "interface" 欄位上面是空白的. 在使用 br01 虛擬橋接器之前, 必須先使用下面指令啟動之: 
# ifconfig br01 up
# ip addr show br01
42: br01: UP
,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether b6:ff:78:b5:3e:6e brd ff:ff:ff:ff:ff:ff
inet6 fe80::b4ff:78ff:feb5:3e6e/64 scope link
valid_lft forever preferred_lft forever
使用自訂虛擬橋接器 
修改 "虛擬主機組態設定檔" 是為了修改 LXC 虛擬主機預設使用的虛擬橋接器, 而該設定檔可以使用 "tree" 指令查看 LXC 虛擬主機的檔案結構得知: 
 

確認存放位址後, 接著就來修改此檔案, 以 myUS14 虛擬主機作為示範: 
# vi /var/lib/lxc/myUS14/config

修改後, myUS14 虛擬主機就會從預設的 "lxcbr0", 改為連結到 "br01" 的虛擬橋接器上. 

橋街內外部網路 
在前面的步驟中, 我們手動產生了 "br01" 虛擬橋接器. 藉由此虛擬橋接器, 可以建構出實際應用上所需要的封閉網路區段, 不過單單只有內部網路可以溝通, 對於系統測試來說可能還不夠, 如果能讓 br01 虛擬橋接器連結實體主機所使用的網路卡, 就可以讓此網路區段內的虛擬主機, 可以透過實體網路卡連接外部網路. 

接下來我們要讓 br01 虛擬橋接器連接實體主機的 eth0 網路卡, 並把 myUS14 和 ubuntu14 虛擬主機連結到此虛擬橋接器上, 再分別以不同方式設定, 取得 IP 位址. 首先使用以下命令讓 br01 虛擬橋接器連結 eth0 實體網路卡 (如果你的實體主機也是虛擬主機的話如 VMWare workstation, 此步會造成 putty 連線中斷!): 
# brctl addif br01 eth0
# brctl show
bridge name bridge id STP enabled interfaces
br01 8000.000c297488fb no eth0

而你可以使用下面命令將 eth0 從虛擬橋接器 br01 中移除: 
# brctl delif br01 eth0

如果從虛擬橋接器 br01 移除 eth0, 此時該橋接器便是一個 isolated 的環境. 為了讓連接到該橋接器上的虛擬主機能夠收到 DHCP 的 IP, 我們另外啟動了一個 dnsmasq 服務: 
# dnsmasq -u lxc-dnsmasq --strict-order --bind-interfaces --pid-file=/run/lxc/dnsmasq_br01.pid --conf-file= --listen-address 10.1.100.1 --dhcp-range 10.1.100.200,10.1.100.250 --dhcp-lease-max=10 --dhcp-no-override --except-interface=lo --interface=br01 --dhcp-leasefile=/var/lib/misc/dnsmasq.br01.leases --dhcp-authoritative 

這時候啟動 myUS14 虛擬主機應該能拿到 10.1.100.x 的 IP 位址: 
# lxc-start -n myUS14 -d // 啟動虛擬主機 myUS14 到背景中
# lxc-console -n myUS14 // 登入虛擬主機
ubuntu@myUS14:~$ ip addr show eth0
47: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:65:9b:85 brd ff:ff:ff:ff:ff:ff
inet 10.1.100.239/24 brd 10.1.100.255 scope global eth0

接下來我們要分別修改 myUS14 和 ubuntu14 的虛擬主機網路卡設定檔, 將前者設定為 DHCP Client, 後者則使用手動固定的方式取得 IP 位址. 首先是 myUS14
# vi /var/lib/lxc/myUS14/rootfs/etc/network/interfaces


預設 LXC 虛擬主機預設就是透過 DHCP Server 的道派發的 IP 位址, 所以上面我們並未作任何修改而是保留設定. 而因為目前 br0 虛擬橋接器已經連結了實體主機的網路卡, 這意味此時myUS14 是透過與實體主機相同的 DHCP 拿到相同網段的 IP 位址. 接著要來設定 ubuntu14 虛擬主機的 固定IP 位址 : 
# vi /var/lib/lxc/ubuntu14/config // 修改預設虛擬橋接器為 br01
# vi /var/lib/lxc/ubuntu14/rootfs/etc/network/interfaces // 設定固定 IP 10.1.100.245/24
  1. # This file describes the network interfaces available on your system  
  2. # and how to activate them. For more information, see interfaces(5).  
  3.   
  4. # The loopback network interface  
  5. auto lo  
  6. iface lo inet loopback  
  7.   
  8. auto eth0  
  9. iface eth0 inet static  
  10. address 10.1.100.245  
  11. netmask 255.255.255.0  
  12. gateway 10.1.100.1  
  13. dns-nameservers 168.95.1.1  

上面的 gateway, ip 與 netmask 請依據主機上的網路設定給適當的值 (此時 myUS14 上面的 IP 是 10.1.254.239). 接著兩個虛擬主機應該能透過虛擬橋接器 br01 互通: (可以透過 'Ctrl+a' then 'q' 來離開虛擬主機的 Console
# lxc-start -n ubuntu14 -d // 啟動虛擬主機 ubuntu14 到背景中
# lxc-console -n ubuntu14 // 登入虛擬主機
ubuntu@ubuntu14:~$ ip addr show eth0
49: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:49:de:a3 brd ff:ff:ff:ff:ff:ff
inet 10.1.100.245/24 brd 10.1.100.255 scope global eth0
...

ubuntu@ubuntu14:~$ ping -c 3 10.1.100.239 // 確認可以連接到虛擬主機 myUS14
PING 10.1.100.239 (10.1.100.239) 56(84) bytes of data.
64 bytes from 10.1.100.239: icmp_seq=1 ttl=64 time=0.091 ms
...

連接網際網路 
上面剛建立好的 br01 虛擬橋接器並未提供 NAT 轉址功能, 沒辦法讓連結到 br01 上的 LXC 虛擬主機透過轉址的方式, 與外部網路溝通. 而在 Linux 系統內要實現 NAT 轉址功能, 就需要命令 iptables 才行. 請在實體主機上輸入以下命令: 
// -A: 新增規則
// -o: 指定封包由哪張網卡出去
// -s: 設定封包的來源
// -j: 後續的動作為 'MASQUERADE'

# iptables -t nat -A POSTROUTING -o eth0 -s 10.1.100.0/24 -j MASQUERADE
# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination

Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 10.0.3.0/24 !10.0.3.0/24
MASQUERADE all -- 10.0.100.0/24 !10.0.100.0/24
MASQUERADE all -- 10.1.100.0/24 0.0.0.0/0

此時登入虛擬主機 myUS14 確認外部網路連接: 
# lxc-console -n myUS14 // 連結虛擬主機 myUS14
ubuntu@myUS14:~$ ping -c 3 www.google.com.tw
PING www.google.com.tw (64.233.189.94) 56(84) bytes of data.
64 bytes from tl-in-f94.1e100.net (64.233.189.94): icmp_seq=1 ttl=127 time=37.9 ms
...

LXC 虛擬主機獨佔實體網路卡 
LXC 核心模組預設的 'lxcbr0' 虛擬橋接器透過 'dnsmasq' 這個套件讓 lxcbr0 可以提供 DHCP 與 DNS Cache Server 服務, 也因為命另 iptables 的協助, 虛擬主機可以提供 NAT 轉址方式來連接到 Internet. 然而在實際的應用面上, 虛擬主機可並不只是單單用來測試系統開發, 或者當作重要網路服務, 應用系統的備援, 而是有可能會直接取代正在線上運作的實體主來提供各項服務. 因此虛擬主機的網路效能就變得非常重要! 因此 LXC 核心模組提供功能讓 LXC 虛擬主機能直接使用實體網路卡與外部網路溝通! 

要讓 LXC 虛擬主機獨佔主機上的網路卡前, 我們需先確定主機上的網路資源, 畢竟要有兩張以上的實體網路卡, 才能讓 LXC 虛擬主機獨佔其中一張. 架設你的實體主機上有兩張實體網路卡 eth0 與 eth1, 並打算讓虛擬主機獨佔 eth1, 則你可以可修改虛擬主機組態設定檔如下 (以虛擬主機 myUS14 為例): 
# vi /var/lib/lxc/myUS14/config
  1. # Template used to create this container: /usr/share/lxc/templates/lxc-ubuntu  
  2. # Parameters passed to the template:  
  3. # For additional config options, please look at lxc.container.conf(5)  
  4.   
  5. # Common configuration  
  6. lxc.include = /usr/share/lxc/config/ubuntu.common.conf  
  7.   
  8. # Container specific configuration  
  9. lxc.rootfs = /var/lib/lxc/myUS14/rootfs  
  10. lxc.mount = /var/lib/lxc/myUS14/fstab  
  11. lxc.utsname = myUS14  
  12. lxc.arch = amd64  
  13.   
  14. # Network configuration  
  15. #lxc.network.type = veth  
  16. #lxc.network.flags = up  
  17. #lxc.network.link = lxcbr0  
  18. #lxc.network.link = br01  
  19. #lxc.network.hwaddr = 00:16:3e:65:9b:85  
  20.   
  21. lxc.network.type = phys  
  22. lxc.network.link = eth1  

完成之後, 重新啟動虛擬主機以讓設定生效. 

Supplement 
Linux BRIDGE-STP-HOWTO: About The Linux Modular Bridge And STP

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!