おふくろさまより愛をこめて

mmmpa ふとしです。誠実なプログラミングを心がけたい。

hosts でサブドメインをワイルドカードで指定したいができないので dnsmasq で対応する。

サブドメインをなんらかの key としたサービスがあります。その開発においてはローカルの開発環境においてもサブドメインを付与したアクセスが必要になります。しかしいわゆる /etc/hosts にあたるファイルではワイルドカードを指定できないため、key ごとに書き加えていく必要があります。

127.0.0.1       foo.example.com
127.0.0.1       bar.example.com
127.0.0.1       *.example.com # 機能しない

しかし、これは明らかに手間です。そこでローカルマシン上で DNS としての機能を提供する dnsmasq を用いて *.example.com へのアクセスを 127.0.0.1 にリダイレクトさせることで対応できます。

/etc/dnsmasq.conf

インストールは各環境に合わせて行い、設定ファイルにリダイレクト設定を書きます。

記法は単純で address=/a/b で a にマッチするアクセスがあった場合に b へリダイレクトします。これは必要なリダイレクト分だけ書けます。

address=/.example.com/192.168.0.1
address=/.o296.com/192.168.0.1

詰まりどころ

以下はわたしが dnsmasq を設定するにあたって詰まった部分です。比較的長い時間を溶かしたので、同じような状況に陥ったどなたかの助けになれれば幸いです。

Operation not permitted

起動時に以下のエラーが出る場合は /etc/dnsmasq.confuser=root を書き加えます。

dnsmasq: setting capabilities failed: Operation not permitted

リダイレクトされない

dnsmasq は DNS として振る舞います。どの DNS でドメインを解決するかというのは /etc/resolv.conf 書かれていて、大体の場合以下のようになっているようです。

nameserver 192.168.0.1
nameserver 2001:268:fd07:4::1
nameserver 2001:268:fd08:4::1

192.168.0.1 は自分自身に向いていることも多いのですが、わたしの場合はマシンの ip は 192.168.0.6 でした。これは確実に自分に向くように 127.0.0.1 に変更します。

nameserver 127.0.0.1
nameserver 2001:268:fd07:4::1
nameserver 2001:268:fd08:4::1

書きかえた /etc/resolv.conf がもとに戻ってしまう

NetworkManager が動作している場合 recolv.conf は再起動のたびに上書きされてしまいます。書き換えを防止するために、以下のように追記します。

[main]
plugins=ifupdown,keyfile
dns=none  # 追加 

まとめ

これで無限にサブドメインアクセスができるようになりました。

業務でちょうどサブドメインを key とするサービスの作業を担当していたのでもっと早く dnsmasq を知れれば、都度 /etc/hosts を編集することもなかったのにな……と思いました。(その業務からは年内で担当をはずれました)

その他の手段

適当なドメインを所有している場合は *.local.o296.com などを 127.0.0.1 にポイントしておくという手もあります。サブドメインを使用するサービスでローカル開発環境を提供しているような場合、その会社がそういうローカル用のドメインを用意している場合もあるようです。