Search Google

Tuesday, June 23, 2009

Linux Container (Network Namespaces) + 802.1q (vconfig) + screen

今天要作筆記的對象是Virtual VLAN interface,虛擬化已經從最早的虛擬電腦(Vmware/Virtual PC/Qemu/Virtual box/Xen/KVM...etc)演進到虛擬switch(Virtual route forwarding enabled switch),虛擬的的Network interface其實也存在好一陣子(eg. IP alias),不過虛擬的VLAN interface倒是很少見。
雖然在2004年有人寫了個linux-vrf的patch,讓我們在Linux下可以透過chvrf這個工具指定某個process要透過哪張虛擬的VLAN interface對外丟封包,只不過該patch只支援到2.6.8版的Linux kernel(等同於Fedora Core2時代),那麼新版的Linux用戶該怎麼辦呢?沒關係,待我細細道來。
首先要先介紹Linux Container&802.1q support in Linux kernel。
簡單來說Linux Container是用來讓每個process有獨立的作業空間,這裡我們只用到獨立network interface的功能,802.1q support in Linux kernel則是讓使用者有能力創建支援VLAN tag的network interface,因此把這兩個功能相加之後便可以達到虛擬VLAN interface的功能,下面兩個連結有更詳盡的說明與tutorial:
Linux Container
Linux Container configuration guide中所提到的ns_exec工具可以用下面指令取得:
git clone git://git.sr71.net/~hallyn/cr_tests.git
802.1q support in Linux kernel


看完上面兩個連結之後,我們知道怎麼為各作業空間建立獨立的virtual network interface,也知道怎麼建立能夠發出帶有VLAN tag封包的virtual network interface,但是,如果我們想要用一台主機跟多個VLAN裡面的設備溝通時該怎麼辦呢?
答案就是在建立完veth之後再用vconfig在veth上面另外長個VLAN tag enabled network interface!
設定可以參考下面的script,這個例子用到screen來達到完全自動化(while-loop裡面可以再改進),在一般bash shell下執行script,而script中使用screen -X下達指令的對象為另一個bash shell中的screen,而兩個bash shell都必須使用root登入:



echo 1 > /proc/sys/net/ipv4/ip_forward

echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp

ip link add type veth

ifconfig veth0 192.168.0.101/24 up

route add -host 192.168.0.102 dev veth0

echo 1 > /proc/sys/net/ipv4/conf/veth0/proxy_arp



screen -X stuff './ns_exec -nm -- /bin/bash'

screen -X eval 'stuff "\015"'

sleep 1

screen -X stuff 'echo $$ >> pid'

screen -X eval 'stuff "\015"'



val=1;

while read line

do

echo $val $line;

veth=veth$val;

ip link set $veth netns $line;

#cmd='ifconfig veth1 192.168.0.102/24 up';

#echo $cmd;

#screen -X stuff $cmd;

screen -X stuff 'ifconfig veth1 192.168.0.102/24 up';

screen -X eval 'stuff "\015"'

screen -X stuff 'vconfig add veth1 11';

screen -X eval 'stuff "\015"'

screen -X stuff 'ifconfig veth1.11 10.0.0.1/24 up';

screen -X eval 'stuff "\015"'

screen -X stuff 'ip route add default via 192.168.0.102 dev veth1';

screen -X eval 'stuff "\015"'

val=`expr $val + 2`;

done < "pid"



echo finish startup




No comments: