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

標籤

2015年8月26日 星期三

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

預設虛擬網路架構
對於虛擬系統來說, 網路架構是否正確, 連線功能是否正常, 是攸關整個虛擬系統能否發揮功能的重要關鍵, 即使是 LXC 核心模組也不例外. 但早期的網路系統, 大多利用網路硬體裝置, 如實體的 Router, Switch 等, 來串接各個網路區段的主機, 或是公司內部網路的連結, 除了建置成本昂貴外, 還需要投入不少人力在維護網路硬體設備的運作. 這對於一般中小企業來說, 若要架設一個公司專屬的私有雲, 在經費與人力上, 都是相當沉重的負擔.

若能利用 Linux 原生的虛擬網路, 就可以達到大部分內部私有雲所需要的網路架構. 這不只可以大大減省網路硬體設備的支出, 更可以利用現有 Linux 系統的管理人員, 直接管控系統與網路的運作, 讓架構公司內部的私有雲, 成為一種可能, 且不管是那一套虛擬系統, 只要是運作在 Linux 系統下, 大多會使用 Linux 原生的虛擬網路架構, 當然 Linux Container 也不例外.

Linux 原生的虛擬網路架構, 其實是由 Linux 系統早已存在的虛擬網路元件所組成. 而這些元件包含了 "TUN/TAP 虛擬網路卡", "虛擬 Bridge", "iptables" 與 "dnsmasq". 各個元件在 Linux 原生虛擬網路架構中, 扮演不同的角色, 且每個元件都可以獨立運作, 也可以互相搭配為我們所需的網路架構.

LXC 虛擬網路橋接器及 TUN/TAP 虛擬網路卡
虛擬網路構成元件中的 "虛擬橋接器", 主要負責連接不同的網路系統, "TUN" 和 "TAP" 是以軟體來模擬虛擬網路卡, 就功能來說, "TUN" 是屬於 OSI 的第三層, 也就是網路層, 主要處理 IP 與 Route 封包的傳遞; 而 "TAB" 則是屬於 OSI 網路通訊協定的第二層, 也就是資料連結層, 主要負責實體網路封包的傳遞, 總結一句話 "TUN/TAP" 就是 Ethernet 虛擬網路卡!

雖然在 Linux 系統內要建立 Bridge 網路連線模式看似有些複雜, 但幸運的是 LXC 核心模組已經將這些繁瑣的步驟一次處理完畢, 只需要裝好 LXC 核心模組, 在 Linux 系統中, 就會產生一個 "虛擬橋接器" 了, 這個橋接器可以透過命令 brctl 檢視:


上圖可以觀察到 "lxcbr0" 這個名稱, 這就是安裝好 LXC 核心模組後所產生的 "虛擬橋接器". 而 vethxxx 就是連接到此橋接器的 TUN/TAP 虛擬網路卡. 此虛擬橋接器同時也是 "核心網路卡名稱", 我們可以使用 ip 指令查看 lxcbr0 橋接器的 "網路卡" 資訊:
# ip addr show
...
3: lxcbr0: mtu 1500 qdisc noqueue state UP group default
link/ether fe:3a:9d:76:76:04 brd ff:ff:ff:ff:ff:ff
inet 10.0.3.1/24 brd 10.0.3.255 scope global lxcbr0
valid_lft forever preferred_lft forever
inet6 fe80::3c31:baff:fe76:f07c/64 scope link
valid_lft forever preferred_lft forever
...

LXC 預設 NAT 轉址功能 (iptables)
NAT (Network Address Translation) 轉址功能, 是 iptables (IP 過濾器) 的規則之一, 當 IP 封包往外送時, 會將來源 IP 位址偽裝的一種網路技術. 輸入以下指令來查看 iptables 中的 NAT 規則:
// -t nat: iptables 至少有三個預設的 table (filter, nat, mangle), 這邊指定的 table nat
// -L: 此參數用來列出指定 table 的規則
// -n: 此參數表示不進行 IP 與 Hostname 的反查, 可以提升顯示速度

# iptables -t nat -L -n

從上面訊可以發現實體主機上的 iptables 加入了一筆 "10.0.3.0/24" 的資訊, 而這筆資訊就是透過 iptables 啟動了 NAT 轉址功能, 只要是從 "source" 欄位的 IP 位址等於 "10.0.3.0/24" 發送出去的封包, 都會透過 NAT 轉址的功能, 將虛擬主機的私有 IP 偽裝成外部連結網路的 IP 位址; 而 "destination" 代表的是目的 IP 位址, 此欄位設定值 "! 10.0.3.0/24" 中的驚嘆號, 代表除了 "10.0.3.0/24" 這個 Network ID 之外, 其餘連結外部網路的 IP位址, 都可以透過 NAT 轉址功能順利溝通.
Note.
"MASQUERADE" 的功用是 IP 位址偽裝 (IP Masquerading), 將虛擬主機的私有 IP 偽裝成連結外部網路的 IP 位址.

LXC 預設 DHCP Server 與 DNS Cache Server (dnsmasq)
虛擬網路構成元件中的 "dnsmasq" 是一個輕量級的 "DHCP Server" 及 "DNS Cache Server". 其中 "DHCP Server" 的功能是負責分派 IP 位址; 而 "DNS Cache Server" 則是網域名稱解析伺服器, 負責儲存 Client 端曾經拜訪的網域名稱, 並提供名稱解析的快取功能, 方便 Client 端再次查詢時可以快速回覆網域名稱.

輸入以下指令查看 "dnsmasq" 的設定:
# ps aux | grep dnsmasq
lxc-dns+ 1303 0.0 0.1 28212 2276 ? S Aug23 0:00 dnsmasq -u lxc-dnsmasq --strict-order --bind-interfaces --pid-file=/run/lxc/dnsmasq.pid --conf-file= --listen-address 10.0.3.1 --dhcp-range 10.0.3.2,10.0.3.254 --dhcp-lease-max=253 --dhcp-no-override --except-interface=lo --interface=lxcbr0 --dhcp-leasefile=/var/lib/misc/dnsmasq.lxcbr0.leases --dhcp-authoritative

上面可以觀察到 "dnsmasq" 再啟動時就分別了 "DHCP Server" 與 "DNS Cache Server" 的功能. 設定 "--listen-address 10.0.3.1" 就是 "DHCP Server" 的 IP 位址; 設定 "--dhcp-range 10.0.3.2,10.0.3.254" 說明 DHCP 可以派發的 IP 位址的範圍. 更多的設定說明可以參考 "dnsmasq" 的 man page.

修改預設虛擬網路架構

修改 LXC 核心模組網路設定檔 (lxc-net)
由前面觀察到的預設 LXC 網路架構, 可以透過編輯檔案 /etc/default/lxc-net 進行變更:
# vi /etc/default/lxc-net

接著我們進行如下的修改:
  1. LXC_BRIDGE="lxcbr0"  
  2. LXC_ADDR="10.0.100.1"  
  3. LXC_NETMASK="255.255.255.0"  
  4. LXC_NETWORK="10.0.100.0/24"  
  5. LXC_DHCP_RANGE="10.0.100.200,10.0.100.250"  
  6. LXC_DHCP_MAX="10"  
  7.   
  8. LXC_SHUTDOWN_TIMEOUT=120  
接著停止所有運行的虛擬機, 並使用下面指令重啟 LXC 網路設定:
# service lxc-net restart
lxc-net stop/waiting
lxc-net start/running

# ip addr show lxcbr0
37: lxcbr0: mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether 8a:50:2d:0f:23:08 brd ff:ff:ff:ff:ff:ff
inet 10.0.100.1/24 brd 10.0.100.255 scope global lxcbr0

從上面的輸出可以確認核心網卡的 IP 位址已經修改為我們剛剛設定的 "10.0.100.1/24", 接著可以再確認 dnsmasq 的設定:
# ps aux | grep dnsmasq
lxc-dns+ 27239 0.0 0.1 28212 2320 ? S 07:02 0:00 dnsmasq -u lxc-dnsmasq --strict-order --bind-interfaces --pid-file=/run/lxc/dnsmasq.pid --conf-file= --listen-address 10.0.100.1 --dhcp-range 10.0.100.200,10.0.100.250 --dhcp-lease-max=10 --dhcp-no-override --except-interface=lo --interface=lxcbr0 --dhcp-leasefile=/var/lib/misc/dnsmasq.lxcbr0.leases --dhcp-authoritative
root 27502 0.0 0.1 15944 2124 pts/17 S+ 07:44 0:00 grep --color=auto dnsmasq

使用異動後的虛擬網路架構
雖然可以利用指令讓 LXC 虛擬主機連結到新的網路架構上, 但是虛擬主機是不是真的能夠在異動後的網路架構中運作? 這裡使用 myUS14 虛擬主機作為示範:
# lxc-start -n myUS14 -d // 啟動虛擬主機 
# lxc-console -n myUS14 // 連接虛擬主機

Connected to tty 1
Type to exit the console, to enter Ctrl+a itself
...
myUS14 login:
 ubuntu
Password: ubuntu
Last login: Sun Aug 23 03:29:03 PDT 2015 on lxc/tty1
Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.19.0-25-generic x86_64)

* Documentation: https://help.ubuntu.com/

ubuntu@myUS14:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 00:16:3e:65:9b:85
inet addr:10.0.100.239 Bcast:10.0.100.255 Mask:255.255.255.0

由上面輸出可以知道變更後的網路架構生效, 接著我們要建立新的虛擬主機 "ubuntu14" 來確認其網路架構:
# lxc-create -t ubuntu -n ubuntu14
Checking cache download in /var/cache/lxc/trusty/rootfs-amd64 ...
Copy /var/cache/lxc/trusty/rootfs-amd64 to /var/lib/lxc/ubuntu14/rootfs ...
Copying rootfs to /var/lib/lxc/ubuntu14/rootfs ...
...
##
The default user is 'ubuntu' with password 'ubuntu'!
# Use the 'sudo' command to run tasks as root in the container.
##
...

# lxc-start -n ubuntu14 -d
# lxc-console -n ubuntu14

Connected to tty 1
Type to exit the console, to enter Ctrl+a itself

Ubuntu 14.04.3 LTS ubuntu14 tty1

ubuntu14 login:
 ubuntu
Password:
Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.19.0-25-generic x86_64)


$ ip addr show eth0 // 現在在虛擬主機內了, 接著來檢設 eth0 的網路設定
40: 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.0.100.235/24 brd 10.0.100.255 scope global eth0

由上面可以確認派發的 IP 落在設定的範圍 "10.0.100.200~10.0.100.250" 內. 接著來檢視一下網路連線狀況:
$ ping -c 3 www.google.com.tw // 檢視是否可以連到 Internet
PING www.google.com.tw (173.194.72.94) 56(84) bytes of data.
64 bytes from tf-in-f94.1e100.net (173.194.72.94): icmp_seq=1 ttl=127 time=34.2 ms
...

$ ping -c 3 10.0.100.239 // 檢視是否可以連接到虛擬主機 myUS14
PING 10.0.100.239 (10.0.100.239) 56(84) bytes of data.
64 bytes from 10.0.100.239: icmp_seq=1 ttl=64 time=0.084 ms
...


沒有留言:

張貼留言

網誌存檔

關於我自己

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