purpose
これは以下のケースで有効な作業かもしれません。
- 開発環境を VirtualBox の中に構築している
- 開発環境は社内LANネットワークに参加させない
- iPhone 実機から VirtualBox 内の WEB サーバーにアクセスしたい
別の言い方をすると Vagrant で開発していて config.vm.network :public_network にするとネットワーク管理者に迷惑をかけるので dnsmasq を使って何とかしたという記事です。
network
iPhone は MacOSX の air port でインターネット共有しているものとします。
tools
簡易 DNS サーバーである dnsmasq と proxy として使用する nginx を Mac 上で動作させます。 以下検証したバージョン。
- dnsmasq 2.68
- nginx 1.4.4
to do
- vm に http://centos.vm でリクエストできるように web サーバーを立ち上げます。
- iPhone は http://centos.vm にアクセスしようとします。
- iPhone 実機は centos.vm の ip を Mac 上の dnsmasq に問い合わせをします。
- dnsmasq は Mac OSX(192.168.2.1) を返します
- iPhone は 192.168.2.1 に http リクエストを行います。
- 192.168.2.1 では ningx が返答をしますが、nginx は proxy です。
- proxy となっている nginx は http://centos.vm にアクセスしようとします。
- この場合は /etc/hosts から centos.vm が 192.168.33.10 であると判断します。
/etc/hosts
以下を追記
192.168.33.10 centos.vm
nginx
edit /usr/local/etc/nginx/nginx.conf
# /usr/local/etc/nginx/nginx.conf server { listen 80; server_name centos.vm; location / { proxy_pass http://centos.vm; } }
dnsmasq
% cat /usr/local/etc/dnsmasq.conf address=/centos.vm/192.168.2.1 no-hosts
no-hosts を指定し忘れると dnsmasq が /etc/hosts を優先してしまうのでご注意下さい。 上記設定を行うと iPhone には centos.vm は 192.168.2.1 を返し、nginx には 192.168.33.10 を返します。
デーモン化せず、クエリログを見たい場合は以下のように実行します。
% sudo dnsmasq -dq
iPhone の設定
インターネット共有をした場合、おそらく以下のようになっています。
IPアドレス: 192.168.2.2 サブネットマスク: 255.255.255.0 ルーバー: 192.168.2.1 DNS: 192.168.2.1
動作確認
iPhone から http://centos.vm へ接続が出来る事を確認します。
dnsmasq には以下のようにログが出力されます。
dnsmasq: query[A] centos.vm from 192.168.2.2 dnsmasq: config centos.vm is 192.168.2.1
あとは virtual machine 側で問題なければ動作すると思います。
注意点
時々以下のメッセージがでるのでその場合は一回インターネット共有をオフにするとよいでしょう。
dnsmasq: failed to create listening socket for 192.168.2.1: Address already in use
注意点2
centos.vm を centos.local にした場合、MacOSでは動きません。.local は apple 製品では予約された名前の為です。