tech memorandom

Webに関して調査したことや、メディアアート系(Max,Processing)で調査したことなどを書いていきます。

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

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


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

Virtual Boxは無料のVMなのですが、制限なく使えるし、Windowsも動作します。動作もわりと軽いのでかなり重宝しています。

 

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を使っている意味がありません。

 

まあ、networkの再起動すると修正されるのですが面倒です。我慢していたのですが、いい加減いらいらいして調べてみることしました。動作させてみてわかったのは、外にはIP直指定であれあば外にでるが、名前解決ができない、という状態になっていました。

 

/etc/resolvedをみたところ、ルータのアドレスを参照するようになっていました。


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

 

わーい!

 

念のためテストするかと再起動したらまた/etc/resolvedの記述が再びルータのアドレスになっていました。

どうやら起動時にVMがホストOSが参照しているネームサーバに勝手に書き換えてしまうようです。

 

Virutal Boxのドキュメントなんて全く読む気になりませんが読んだらきっと書いてあるのでしょうが、驚くべき動きです。


ホストOSのネットワーク設定も、ネームサーバをネットワークに依存しないものにしておく必要があるようです。

 

プロバイダからもらったネームサーバをちゃんと登録している方は、こんなことにはまらなかったのかもしれません。

その設定が無意味だと勝手に思っていたので私はルータのみnameseverにしていたのでこんな惨劇がおきました。

 

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


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


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

 

https://developers.google.com/speed/public-dns/

 

ちなみにVM使わない派の人でもGoogle Public DNSをnamseverに指定すると名前解決がだいぶ早くなります。

ネットの体感速度があがるので是非追加されることをおすすしておきます。