okacl's blog

私的なメモ置き場になるヨカーン

User Mode Linux の設定 3

引き続きメモ

  • ゲストOS間のネットワーク
  • ゲストOS間のネットワーク(L2スイッチ)
  • スイッチでパケットフィルタリングする

環境: Ubuntu 12.04 32bit on VMware (Windows7 64bit)


ゲストOS間のネットワーク

ゲストOS間では、socketファイルを介して通信する。
socketファイルの作成には、uml_switchコマンドを使用する。
(なぜか、バックグラウンドでは動作しないので、新しいターミナルを起動して実行する。
daemonオプションつけても期待通りの動作しないし。他の方法ないかな)

HostOS$ uml_switch -unix ./socket0.ctrl

uml_switchコマンドには他にhubオプションやtapオプションがあるけど、
あまり使ったことはないので説明は割愛。

ネットワークへの接続方法は、UMLの起動時(①)と起動後(②)の2パターンある。
いずれも、以下の引数を与える。

eth<n>=daemon,<ethernet address>,<socket type>,<control socket>,<data socket>

daemon以外は自動的に割り当てられるが、control socketに作成したsocketファイルを指定することで、socketファイルごとのネットワークに割り当てられる。


UMLの起動時に接続する

起動時のパラメータに先程の引数を加える。

HostOS$ linux-3.3.8 umid=root0 ubda=root0.cow,fs_root eth0=daemon,,,./sock0.ctrl


UMLの起動後に接続する

まず、UMLを起動する。

HostOS$ linux-3.3.8 umid=root1 ubda=root1.cow,fs_root

起動後、HostOSのターミナルからuml_mconsoleコマンドを実行する。
uml_mconsoleコマンドの次の引数は起動時にumidで指定した文字列)

HostOS$ uml_mconsole root1 config eth0=daemon,,,./sock0.ctrl
OK

OKが表示されたら成功。ERRの場合は失敗している。


起動した2つのUMLにネットワークの設定を行う。
(起動したゲストOSは、root0とroot1)

まず、eth0が作成されているか確認する。

root0:~# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 92:a2:af:c0:69:6d  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:5 
root1:~# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr aa:a6:aa:21:d3:8d  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:5


IPアドレスを設定しインターフェイスを有効にする。

root0:~# ifconfig eth0 192.168.0.1
root0:~# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 92:a2:af:c0:69:6d  
          inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:5
root1:~# ifconfig eth0 192.168.0.2
root1:~# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr aa:a6:aa:21:d3:8d  
          inet addr:192.168.0.2  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:5


設定が完了したので、root0からroot1へpingする。

root0:~# ping -c 3 192.168.0.2        
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.591 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.368 ms
64 bytes from 192.168.0.2: icmp_seq=3 ttl=64 time=0.333 ms

--- 192.168.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 0.333/0.430/0.591/0.116 ms


成功。


ゲストOS間のネットワーク(L2スイッチ)

UMLで仮想的なスイッチを作ってネットワークを構成する。
以下がネットワーク図。

f:id:okacl:20120917184711p:plain

ホストの構成
ファイルシステム名:fs_host
追加パッケージ:hping3

スイッチの構成
ファイルシステム名:fs_switch
追加パッケージ:bridge-utils, vlan

使用するカーネルイメージでは以下をビルドインしておく。
・802.1d Ethernet Bridging
・802.1Q VLAN Support
・Network packet filtering framework (Netfilter)


socketファイルを用意する。

HostOS$ uml_switch -unix ./sock0.ctrl
HostOS$ uml_switch -unix ./sock1.ctrl

後の設定で、
sock0.ctrlには、Host0のeth0とSwitch0のeth0を接続する。
sock1.ctrlには、Host1のeth0とSwitch0のeth1を接続する。


Host0とHost1を起動する。

HostOS$ linux-3.3.8 umid=host0 ubda=host0.cow,fs_host eth0=daemon,,,./sock0.ctrl
HostOS$ linux-3.3.8 umid=host1 ubda=host1.cow,fs_host eth0=daemon,,,./sock1.ctrl


Switch0を起動する。

HostOS$ linux-3.3.8 umid=switch0 ubd0=switch0.cow,fs_switch eth0=daemon,,,./sock0.ctrl eth1=daemon,,,./sock1.ctrl


Host0とHost1のネットワークを設定する。

host0:~# ifconfig eth0 192.168.0.1
host1:~# ifconfig eth0 192.168.0.2


Switch0のネットワークを設定する。

switch0:~# brctl addbr br0
switch0:~# brctl addif br0 eth0
device eth0 entered promiscuous mode
switch0:~# brctl addif br0 eth1
device eth1 entered promiscuous mode
switch0:~# ifconfig eth0 up;ifconfig eth1 up
br0: port 1(eth0) entered forwarding state
br0: port 1(eth0) entered forwarding state
br0: port 2(eth1) entered forwarding state
br0: port 2(eth1) entered forwarding state
switch0:~# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.966259506d17	no		eth0
							eth1


Host0からHost1へpingする

host0:~# ping -c 3 192.168.0.2     
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.916 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.368 ms
64 bytes from 192.168.0.2: icmp_seq=3 ttl=64 time=0.366 ms

--- 192.168.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2010ms
rtt min/avg/max/mdev = 0.366/0.550/0.916/0.258 ms


成功。

今回は、bridge-utilsを使用してL2スイッチを作成したが、
ゲストOSにQuaggaを組み込むと、ルータとして動作させることもできる。
(Vyattaは未確認)


スイッチでパケットフィルタリングする

前節で作成したネットワークを使って、パケットフィルタリングを試してみる。


Switch0でiptablesを設定する。
宛先ポートが72のパケットをドロップする。

switch0:~# iptables -A FORWARD -p tcp --dport 72 -j DROP
switch0:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  anywhere             anywhere            tcp dpt:72 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         


Host0からHost1へhping3を使用してフィルタリングのチェックをする。

host0:~# hping3 -c 5 -S -p ++70  192.168.0.2
HPING 192.168.0.2 (eth0 192.168.0.2): S set, 40 headers + 0 data bytes
len=40 ip=192.168.0.2 ttl=64 DF id=0 sport=70 flags=RA seq=0 win=0 rtt=0.7 ms
len=40 ip=192.168.0.2 ttl=64 DF id=0 sport=71 flags=RA seq=1 win=0 rtt=0.5 ms
len=40 ip=192.168.0.2 ttl=64 DF id=0 sport=73 flags=RA seq=3 win=0 rtt=1.8 ms
len=40 ip=192.168.0.2 ttl=64 DF id=0 sport=74 flags=RA seq=4 win=0 rtt=0.4 ms

--- 192.168.0.2 hping statistic ---
5 packets transmitted, 4 packets received, 20% packet loss
round-trip min/avg/max = 0.4/0.9/1.8 ms


72番ポートへの通信がフィルタリングされたことがわかる。