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

こんな設定入れちゃった。あはは。これはセキュリティ上問題があります。問題の内容を理解しないまま設定を真似るのは御遠慮下さい。