qemu networking (2)

記憶を失いかけている時点で復習してみるのも良いですね。参考にさせて頂いたのは以下エントリです。

このエントリにある /etc/qemu-if{up,down} が以下。

$ cat /etc/qemu-ifup
#qemu-ifup
/sbin/ifconfig eth1 down
/sbin/ifconfig eth1 0.0.0.0 promisc up
openvpn --mktun --dev tap0
ifconfig tap 0 0.0.0.0 up
brctl addbr br0
brctl addif br0 eth1
brctl addif br0 tap0
brctl stp br0 off
ifconfig br0 10.10.10.2 netmask 255.255.255.0
$ cat /etc/qemu-ifdown
#qemu-ifdown
ifconfig eth1 down
ifconfig eth1 -promisc
ifup eth1
ifconfig br0 down
brctl delbr br0
openvpn --rmtun --dev tap0
$

手持ちのマシンでは eth1 なデバイスが無いので未使用の eth0 を使う方向でスクリプトを修正してます。で、手順としては /etc/qemu-ifup を実行して qemu 起動ということで以下。

$ sudo /etc/qemu-ifup
Sun Aug 12 17:26:10 2012 TUN/TAP device tap0 opened
Sun Aug 12 17:26:10 2012 Persist state set to: ON
$ sudo qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.32-5-versatile \
-initrd initrd.img-2.6.32-5-versatile -hda hda.img.qcow2 \
-append "root=/dev/sda1" -net nic -net tap,ifname=tap0,script=no

起動待ちの間に ifconfig -a してみたら以下な br0 と

br0       Link encap:Ethernet  HWaddr 60:eb:69:b6:75:29  
          inet addr:10.10.10.2  Bcast:10.10.10.255  Mask:255.255.255.0
          inet6 addr: fe80::62eb:69ff:feb6:7529/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:2735 (2.7 KB)

以下な tap0 ができてました。

tap0      Link encap:Ethernet  HWaddr 7a:a0:34:64:ce:3e  
          inet6 addr: fe80::78a0:34ff:fe64:ce3e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:2 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:0 (0.0 B)  TX bytes:781 (781.0 B)

eth0 な出力は以下なカンジ。

eth0      Link encap:Ethernet  HWaddr 60:eb:69:b6:75:29  
          UP BROADCAST PROMISC 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:41 Base address:0xa000 

プロミスキャスモードになってますね。この状態で起動したら qemu の中のホストな i/f に適切な IP アドレスを付与してあげれば通信可能になったはず。つうか dhcp でなんちゃらとかできんのかな。手動は色々な意味で微妙。

# ifconfig eth0 10.10.10.100 netmask 255.255.255.0

しかも route -n 見てみたら default route がありませんな。いちおうホスト側とゲスト側で ping の返事が戻ってきてるのは確認できました。つーことはこの状態で

  • ゲスト側 default GW の設定盛り込み
  • ホスト側でポート転送設定盛り込み

で、iptables の FORWARD な先頭の設定を削除すれば良いのかどうなのか。このあたりは確認の必要がありますね。i/f down および i/f 削除が必要なのかどうか。

盛り込み

ゲスト側で以下。

# route add default gw 10.10.10.2 eth0

また、ホスト側で以下。

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

で、とりあえず iptables の設定のみ変更してみます (ホスト側)。

# iptables -D FORWARD 1

で、ゲスト側で www.google.co.jp に ping を投げてみましたが名前解決できてない。

# ping www.google.co.jp
ping: unknown host www.google.co.jp
#

む。/etc/resolv.conf 見てみたら

nameserver 8.8.8.8

になってます。やっぱ virbr0 な i/f の down および削除が必要らしいのか。

# ifconfig virbr0 down
# brctl delbr virbr0

しても駄目。あらら、何が悪いのやら。これでゲストを再起動してみるか。というか、ここまでの設定を盛り込んだ上でゲストを起動しないと駄目なのかな。

再起動してみた

う、再起動しても駄目じゃん。名前解決ができてません。で、色々もごもご確認してたんですが masquerade なナニが足りてなかった模様。
ホスト側で以下が必要だったらしい。

# iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o wlan0 -j MASQUERADE

とりあえず

ホスト側も再起動してこの手順が正しいかどうかを確認してみます。

再確認

とりあえず手順としては以下?

  • /etc/qemu-ifup 実行 (superuser
  • echo 1 > /proc/sys/net/ipv4/ip_forward (superuser
  • iptables -D FORWARD 1 (superuser
  • iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o wlan0 -j MASQUERADE (superuser

した上で qemu なゲストを起動させて以下なカンジの i/f 設定盛り込みおよび経路の設定の盛り込み

  • ifconfig eth0 10.10.10.100 netmask 255.255.255.0
  • route add default gw 10.10.10.2 eth0

これで OK なのかどうなのか。つかゲスト側は dhcp でなんとかなりそげですね。

結果

OK でした。課題としては

  • script 化
  • dhcp で云々

あたりかと。