devops:development:hook_dns_query

DNS の名前解決をフックする

開発の仕事をしていると、DNS への本番サーバに対する名前解決をフックして本番サーバの IP ではなく、開発環境の IP を返したいことが、ままあります。

いつもは hosts ファイルの編集でごまかしていました。が、今の仕事では、お客様から支給された PC を使い、hosts を変更するにはお客様管理者による承認が必要になる仕組みになっており、hosts の変更に非常に手間がかかります。

一方で、リモートワークが主体なため、DHCP の接続先は自由に設定できます。このため、手間をかけずに名前解決の動作を変えるのであれば、DNS のクエリに対しては自分で IP アドレスを返せる DNS サーバを導入し、DHCP でDNSサーバーアドレスを配布できれば目的が達成できそうです。

そこで見つけたのが、dnsmasq という OSS プロダクトです。

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

以下の例では通常の問い合わせは 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を解決してあげると良いでしょう。

  • devops/development/hook_dns_query.txt
  • 最終更新: 2022/01/07 17:14
  • by admin