2012年4月22日日曜日

Virtual boxのNAT経由の外部接続について

かなり久しぶりの更新です。



私物のMacでWebアプリケーションの開発を行うことが多いのですが、MacにLAMP環境をいれたりすることに抵抗があるので、なるべくVirtual Boxを上で開発を行うようにしています。

Virtual Boxを使う際ですが、ネットワーク環境がかわっても接続できるように以下のような設定をしています。

 外部接続用  NATアダプタ
   内部接続用  host-onlyアダプタ

他にBridge接続というゲストOSにIPアドレスを割り当てる方法があるのですが、これを使う2つのIPアドレスを取得することになり、モバイルルーターなどで外で使う場合かなり不便します。特に一旦ブラウザで認証するような公衆無線Lan環境下ではゲストOS内でブラウザをたちあげる必要があり、x windowなどいれていないsever版などではかなり難儀したので使用を封印し、外部アクセスはNAT経由のみにしています。

NAT経由でもポートフォワードの設定をいれることで、ssh接続は設定すれば可能なのですがその設定が面倒なのとmysqlなどの接続時にわざわざポートフォワードするはめになり不便なので、ホストOSとゲストOSの通信はhost-onlyアダプタを利用しています。


NAT使って接続する 場合、本来であれば、家からオフィスに移動してもホストOSをルータに接続しにいくので、外部接続はゲストOSのネットワーク設定さえ切り替わっていればそのままつながるはずですが、時々つながらないことがありました。ネットワークを再起動すると名前解決できるようになるのですが、これではNATを使っている意味がありません。


面倒だなーと放置していたのですが、ちょっと調べてみると名前解決だけうまくいっていないことがわかりました。
/etc/resolvedをみたところ、ルータのアドレスを参照するようになっていました。


ホストOSが参照しているネームサーバーになっていたので、linuxのネームサーバをgoogle public DNSに変えたところ、名前解決できるようになりました。

わーい!


と思ったのつかのま再起動したらまたつながくなりました。


確認したところ、/etc/resolvedの記述が再びルータのアドレスになっていました。どうやらVMがホストOSが参照しているネームサーバに勝手に書き換えてしまうようです。


ホストOSのネットワーク設定も、ネームサーバをネットワークに依存しないものにしておく必要があるようです。(プロバイダからもらったネームサーバをちゃんと登録している方は、こんなことにはまらないかもしれません。)

というわけで、ホストOSのネームサーバをgoogle dnsに変更することにしました。


これで、VM再起動後も無事ネットワークが変わっても外にでれるようになりました。


同様の現象がおきている人は、ゲストOSのネームサーバーにGoogle Public DNSを足すと幸せになります。