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で仮想的なスイッチを作ってネットワークを構成する。
以下がネットワーク図。
ホストの構成
ファイルシステム名: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番ポートへの通信がフィルタリングされたことがわかる。