あいつの日誌β

働きながら旅しています。

iPhone 実機で VirtualBox 内で稼働している WEBサービスへアクセスする方法

purpose

これは以下のケースで有効な作業かもしれません。

  • 開発環境を VirtualBox の中に構築している
  • 開発環境は社内LANネットワークに参加させない
  • iPhone 実機から VirtualBox 内の WEB サーバーにアクセスしたい

別の言い方をすると Vagrant で開発していて config.vm.network :public_network にするとネットワーク管理者に迷惑をかけるので dnsmasq を使って何とかしたという記事です。

network

iPhoneMacOSXair port でインターネット共有しているものとします。

  • VM(192.168.33.10) <===> Mac OSX(192.168.33.1)
  • Mac OSX(192.168.2.1) <===> iPhone(192.168.2.2)

tools

簡易 DNS サーバーである dnsmasq と proxy として使用する nginx を Mac 上で動作させます。 以下検証したバージョン。

  • dnsmasq 2.68
  • nginx 1.4.4

to do

  • vmhttp://centos.vm でリクエストできるように web サーバーを立ち上げます。
  • iPhonehttp://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.vmcentos.local にした場合、MacOSでは動きません。.local は apple 製品では予約された名前の為です。