DNS の名前解決をフックする
開発の仕事をしていると、DNS への本番サーバに対する名前解決をフックして本番サーバの IP ではなく、開発環境の IP を返したいことが、ままあります。
いつもは hosts ファイルの編集でごまかしていました。が、今の仕事では、お客様から支給された PC を使い、hosts を変更するにはお客様管理者による承認が必要になる仕組みになっており、hosts の変更に非常に手間がかかります。
一方で、リモートワークが主体なため、DHCP の接続先は自由に設定できます。このため、手間をかけずに名前解決の動作を変えるのであれば、DNS のクエリに対しては自分で IP アドレスを返せる DNS サーバを導入し、DHCP でDNSサーバーアドレスを配布できれば目的が達成できそうです。
そこで見つけたのが、dnsmasq という OSS プロダクトです。
dnsmasq の設定と起動
docker で起動してしまえば、あっという間に簡易 DNS が立ち上がり、設定ファイルを少し編集すれば、任意のドメインに対するクエリに予め設定した IP を返せます。
- docker-compose.yml
version: '3.0' services: dnsmasq: restart: always image: strm/dnsmasq volumes: - ./dnsmasq.conf:/etc/dnsmasq.conf ports: - "192.168.254.195:53:53/udp" cap_add: - NET_ADMIN
dnsmasq.conf の編集
以下の例では通常の問い合わせは Google のネームサーバ 8.8.8.8 に向けさせ、問合せをフックしたい内容は address= の行に記述しています。
#log all dns queries log-queries #dont use hosts nameservers no-resolv #use google as default nameservers server=8.8.4.4 server=8.8.8.8 #explicitly define host-ip mappings address=/wws.jp/10.1.1.1 #address=/yahoo.co.jp/10.1.1.1 #address=/server/10.1.1.2
あとは DHCP サーバの設定を変更して、DNS 問い合わせをこのコンテナに向ければ、やりたいことを実現できます。
その他の活用方法
自分の環境ではブロードバンドルーターがNATループバック(ヘアピンNATとも呼ばれるらしい)機能があるので必要ないですが、自宅にグローバルIPをポートフォワーディングしているサーバなどが、自宅LAN環境からつながらない場合なども、この dnsmasq でプライベートIPを解決してあげると良いでしょう。