iPhoneからLANのPCへ名前でアクセスするために一時的にDNSサーバーを動かす

iPhoneのWebアプリでも作って勉強しようと思った。開発には短い間隔で書いて確認の反復が大事。同じネットワークにいるデスクトップPCのWebサーバーへiPhoneからアクセスしたい。カメラ使いたいのでHTTPSでアクセスする必要がある。自己署名証明書やオレオレ認証局だとiPhone側の設定とか面倒くさそう。Let's EncryptならiPhoneで信頼済みの証明書が簡単に手に入る。これを使いたい。

hostsファイルがあればいい。iPhoneにhostsはないらしい。iPhoneのネットワーク設定を見るとipv4DNSサーバーはルーターのアドレスになってる。ipv6も設定されてるけどよくわかってないから今回は無視する。ルーターはBUFFALO WXR-1900DHP3。ルーターでhostsみたいなことできるやつある。うちのルーターの設定画面にそれっぽい項目がない。

作業中だけDockerでDNSサーバー動かせば解決できる。dnsmasqというのが目的に適っていそう。

dnsmasqをインストールしたdockerイメージを作る

Dockerfile
FROM alpine

RUN apk update \
    && apk upgrade \
    && apk add --no-cache dnsmasq

ENTRYPOINT ["dnsmasq", "-k" ,"-u", "root"]

alpine linuxにdnsmasqをインストールするだけ。dnsmasqのオプションの-kは"keep-in-foreground"。これがないとコンテナがすぐ終了してしまう。dockerはENTRYPOINTのプロセスが終了したらコンテナを終了させる。

docker build
docker build -t dnsmasq - < Dockerfile 

何も持っていかないから'-'を指定する。Dockerfileだけ。今回は"dnsmasq"というイメージ名を付けた。

dnsmasqを起動する

docker run -d -p 53:53/tcp -p 53:53/udp --name dns dnsmasq -A /www.example.com/192.168.11.4

tcp:53とudp:53をDockerホストとつなぐ。dnsmasqの-Aオプションで解決したい名前とipを指定する。ここでの"dnsmasq"の文字はイメージの名前。ENTRYPOINTのコマンドの追加の引数として"-A"から後ろの文字が渡される。

Dockerホストのファイアウォール

tcp:53とudp:53の受信を許可する。

iPhoneの設定

  • 設定 - Wi-Fi - 接続しているネットワークをタップ
  • DNSを構成 - 手動を選択する
    • いまあるDNSサーバーを全部削除
    • DockerホストのIPを追加

あとかたづけ

docker rm -f dns

iphoneWi-Fi設定は「DNSを構成」を自動にして「リースを更新」で元に戻る。

docker build のWARNING

SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

Docker for WindowsLinuxコンテナのbuildをすると必ず表示されるらしい。よくないことが起きたって意味ではなくて、よく確認してねって意味らしい。そもそも今回はpathに-を指定してるから関係ない。