Search Google

Tuesday, June 30, 2009

山不轉路轉

上一篇寫到要如何用Network Namespaces + Vconfig來做到只用一台電腦與一張PCI網卡就可以監控使用相同IP網段的多個VLAN,結果發現從獨立namespace發出帶有VLAN ID的封包始終無法成功的送到網路上,經過整整一個星期的思考,在iptables & ip route之間穿梭,卻找不到一個可以把封包丟出去的方法。。。
在我勤奮不懈的努力之下,洗澡的時候忽然有個"Multiple routing table"的想法閃過腦中,於是踏出浴室之後馬上google Linux是否有這種東西&要怎麼用,話說天救自救者,就這樣給我試出來了,哇哈哈哈!

有興趣的人可以用下面的script試一下:

+--NS2:------------------------------------------------



./ns_exec -nm -- /bin/bash
echo $$


+------------------------------------------------------

+--NS3:------------------------------------------------


./ns_exec -nm -- /bin/bash
echo $$


+------------------------------------------------------

+--NS1:------------------------------------------------


ip link add type veth
ip link add type veth

ip link set veth1 netns 1691
ip link set veth3 netns 1704

ifconfig veth0 192.168.0.1/24 up
ifconfig veth2 192.168.2.1/24 up

vconfig add eth0 11
vconfig add eth0 33

ifconfig eth0.11 10.0.0.11/24 up
ifconfig eth0.33 10.0.0.33/24 up

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

ip rule add from 192.168.0.2 lookup 102
ip rule add from 192.168.2.2 lookup 122

ip route add default via 10.0.0.11 dev eth0.11 table 102
ip route add default via 10.0.0.33 dev eth0.33 table 122


+------------------------------------------------------

+--NS2:------------------------------------------------


ifconfig veth1 192.168.0.2/24 up
ip route add default via 192.168.0.1 dev veth1


+------------------------------------------------------

+--NS3:------------------------------------------------


ifconfig veth3 192.168.2.2/24 up
ip route add default via 192.168.2.1 dev veth3


+------------------------------------------------------

+--NS1:------------------------------------------------


tcpdump -ne -i eth0 not port 22


+------------------------------------------------------

tcpdump擷取到的封包資訊:


[root@vmf11 ~]# tcpdump -ne -i eth0 not port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
10:51:41.882589 00:0c:29:56:fb:d3 > Broadcast, ethertype 802.1Q (0x8100), length 46: vlan 11, p 0, ethertype ARP, arp who-has 10.0.0.10 tell 10.0.0.11
10:51:42.326170 00:0c:29:56:fb:d3 > Broadcast, ethertype 802.1Q (0x8100), length 46: vlan 33, p 0, ethertype ARP, arp who-has 10.0.0.10 tell 10.0.0.33




看到了嗎?
問相同IP地址的封包被加上不同的VLAN ID了!

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




Saturday, June 13, 2009

Update一下

很久沒寫blog了,所以想說來字好了。
晚上在看HBO播放的Across the universe時忽然有種"現在的台灣 = 越戰時的美國"的感覺。。。

BTW,今天發現開發Xoops module其實很簡單! :-)