qemuで-user-netでない接続をする
qemuは-user-netというモードを持っていて、何も考えずに起動するとこのモードが使われる。-user-netモードでは、qemuがNATルータとDHCPサーバ機能とDNSリゾルバ機能を提供してくれる。
http://www15.big.or.jp/~yamamori/sun/qemu/net.html
これを使うと、普通の通信は何の問題もなく使えるんだけど、あんまり頭の良いNATでないらしく、NATと相性の悪いアプリケーションでは不具合が出る。pingが打てなかったりもするし、何より他の機器からゲストOSへのアクセスが非常にやりにくい。
自分の場合はゲストOSから外のホストへのIPSecトンネリングで不具合。接続は確立するが、トンネル相手のネットワークへの通信がうまくいかない。
そこで、TAP/TUN接続を試すことにした。使うのはお手軽に使えるTUN接続。L3接続だから、ルーティングの事も考えなきゃいけません。
TUN接続は、非常に簡単。ホストOSはWhite Box Linux 3.0で、ゲストOSはWindows 2000で、NAT RouterはADSL接続サービスでついてきた小さいルータだよ。
┏━━━━━┓ ┃Internet ┃ ┗┳━━━━┛ │ ┃ Global Network ┏┻━━━━┓──┘ ┃NAT Router┃ ┗┳ 1━━━┛──┐ ┃ 192.168.0.0/24 ┏┻ 5━━━┓──┘ ┃ホストOS ┃ ┗┳ 1━━━┛──┐ ┃ 192.168.1.0/24 ┏┻ 2━━━┓──┘ ┃ゲストOS ┃ ┗━━━━━┛
こういう構成になる。
ホストOS:
eth0: 192.168.0.5/24 tun0: 192.168.1.1/24 DefaultGW: 192.168.0.1(NAT Router)
ゲストOS:
eth0: 192.168.1.2/24 DefaultGW: 192.168.1.1(ホストOSのtun0)
こういうことにすると、ゲストOSから192.168.0.0/24ネットワークへ通信するには、192.168.0.0/24ネットワーク上のホストが192.168.1.0/24の経路を知らないといけない。自宅内でダイナミックルーティングを回すほどホストはいないので、192.168.0.0/24上のLinuxサーバには
# route add -net 192.168.1.0/24 gw 192.168.0.5 # echo 'any net 192.168.1.0 netmask 255.255.255.0 gw 192.168.0.5 dev eth0' >> /etc/sysconfig/static-routes
これで完了。NAT Router(箱物)には上記と同等のスタティックルートを記述。
これで外に出ていけるようになり、ゲストOSが便利に使えるようになった。満足。
最後になるのもどうかと思うけど、ホストOS上のTUNデバイスを設定してゲストOSと繋ぐには、以下のとおりの/etc/qemu-ifupファイルを準備してあげるだけで良い。お手軽すぎる。
sudo /sbin/ifconfig "$1" \ inet 192.168.1.1 \ netmask 255.255.255.0 \ broadcast 192.168.1.244 up
sudo がパスワードを聞いてきても実は入力する隙がないので、visudoコマンドを叩いて/etc/sudoersを更新。
inu myhostname=(ALL) NOPASSWD:ALL
こんな設定入れちゃった。あはは。これはセキュリティ上問題があります。問題の内容を理解しないまま設定を真似るのは御遠慮下さい。