ワイルドカードDNSの必要性
意味を持った名前でサーバーにアクセスできる名前解決は、インターネットの根幹を支える重要な技術です。特に最近のWebアプリには、名前解決ができることを前提としているものも多く、ドメインのないLAN内にテスト環境を立てるのが面倒、といった経験のある方も多いのではないでしょうか。KubernetesのIngressなどで、よくこの問題に当たりがちです。
LAN内でお手軽に名前解決を実現したいのであれば、最初の候補に挙がるのがAvahiでしょう。Avahiを使えば、DNSを用意せずとも、ホスト名からIPアドレスを引くことができます。サーバーのホスト名が
これを実現する手段は、大きく以下の2つです。
- /etc/
hostsファイルを用意する - ローカルDNSにレコードを登録する
1はもっともシンプルかつ原始的な方法です。ですがすべてのクライアントに同じ内容のhostsファイルを配る必要があり、漏れがあるとアクセスできません。また内容を更新するのにも手間がかかります。2は第834回で紹介した方法です。本物のDNSサーバーを用意するためもっとも確実ですが、企業のシステムであれば
そこで登場するのがワイルドカードDNSです。ワイルドカードDNSでは、DNSサーバーの変更なしに、任意のホスト名を自動的にIPアドレスへ名前解決できます。
nip.ioとは
有名なワイルドカードDNSサービスに、nip.
サーバーのIPアドレスが、192.
$ host 192.168.1.1.nip.io 192.168.1.1.nip.io has address 192.168.1.1
IPアドレス、192.
$ host www.192.168.1.1.nip.io www.192.168.1.1.nip.io has address 192.168.1.1
こちらもIPアドレス、192.
$ host www-192-168-1-1.nip.io www-192-168-1-1.nip.io has address 192.168.1.1
やはりIPアドレス、192.
$ host www.c0a80101.nip.io www.c0a80101.nip.io has address 192.168.1.1
例によってIPアドレス、192.
つまりnip.
<任意の名前>[.-]<IPアドレス>.nip.io
これをワイルドカードDNSと呼びます。任意のIPアドレスを、正規のDNSの応答として名前解決できるため、テスト用にちょっとドメインがほしいという場合に便利なサービスです。ですが、以下のような点が気になる方もいるでしょう。
- 第三者のサービスを使うのは社内ポリシー的に問題
- プライベートIPアドレスを、インターネットを経由して名前解決するのに抵抗がある
- nip.
ioではなく自社ドメインを使いたい
実はnip.
nip.ioの動作原理
nip.
コンテナイメージのビルド
nip.
$ sudo apt install -U -y docker.io
ソースコードをGitHubからクローンします。
$ cd $ git clone https://github.com/exentriquesolutions/nip.io.git $ cd nip.io
リポジトリにDockerfileが用意されていますので、以下のコマンドでビルドします。ここではイメージに
$ sudo docker build -t nipio-local .
イメージがビルドされていることを確認しておきましょう。
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE nipio-local latest f964349992b5 About a minute ago 63.9MB alpine 3.7 6d1ef012b567 6 years ago 4.21MB
設定ファイルの用意
nip.
ここでは後者のみを編集します。まずサンプルのbackend.
$ cp ~/nip.io/nipio/backend.conf ~/
書き換えるポイントを解説します。
「domain」
# main domain
# domain=nip.io.example
domain=nip.example.jp
「ttl」
# default ttl
# ttl=432000
ttl=300
[SOA]セクションは、SOAレコードに関する設定です。
# Hostmaster email address
hostmaster=hostmaster@nip.example.jp
# Name server
ns=ns1.nip.example.jp
[nameservers]セクションは、NSレコードに関する設定です。先ほどdomainに指定したドメインのサブドメインとしてns1/
# nameservers
[nameservers]
ns1.nip.example.jp=127.0.0.1
ns2.nip.example.jp=127.0.0.1
[whitelist]セクションでは、nip.
# whitelisted ranges (optional)
[whitelist]
loopback = 127.0.0.0/8
private_net_172_16 = 172.16.0.0/16
[blacklist]セクションでは、名前解決を拒否するIPアドレスを個別に指定できます。whitelistに指定したレンジの中でも、
# blacklisted ips (optional)
# [blacklist]
# some_description = 10.0.0.1
最終的なbackend.
[main]
# main domain
domain=nip.example.jp
# default ttl
ttl=300
# default IP address for non-wildcard entries
ipaddress=127.0.0.1
# Indicates whether this response is authoritative, this is for DNSSEC.
auth=1
# Scopebits indicates how many bits from the subnet provided in the question.
bits=0
# SOA
[soa]
# serial number
id=1
# Hostmaster email address
hostmaster=hostmaster@nip.example.jp
# Name server
ns=ns1.nip.example.jp
# Refresh
refresh=10800
# Retry
retry=3600
# Expiry
expiry=604600
# Minimum TTL
minimum=3600
# nameservers
[nameservers]
ns1.nip.example.jp=127.0.0.1
ns2.nip.example.jp=127.0.0.1
# whitelisted ranges (optional)
[whitelist]
loopback = 127.0.0.0/8
private_net_172_16 = 172.16.0.0/16
nip.ioの起動
設定ファイルが完成したら、コンテナを起動します。以下のコマンドを実行してください。
$ sudo docker run \ -p 10053:53/tcp \ -p 10053:53/udp \ -v ~/backend.conf:/opt/nip.io/backend.conf \ --rm \ --name nipio \ -d \ nipio-local
ポイントは2点です。まずコンテナ内のPowerDNSは当然、TCP/
もうひとつは、コンテナ内でのnip.
なおDockerfileを確認するとわかりますが、pdns.
またnip.
それでは動作を確認してみましょう。127.
$ host -p 10053 www-172-16-1-1.nip.example.jp 127.0.0.1 Using domain server: Name: 127.0.0.1 Address: 127.0.0.1#10053 Aliases: www-172-16-1-1.nip.example.jp has address 172.16.1.1
またWhitelistにないレンジの名前解決が失敗することも確認しておきましょう。この例では
$ host -p 10053 www-192-168-1-1.nip.example.jp 127.0.0.1 Using domain server: Name: 127.0.0.1 Address: 127.0.0.1#10053 Aliases: $ sudo docker logs nipio (...略...) May 21 07:04:11 Coprocess: Not Whitelisted: 192.168.1.1
Unboundとの連携
さてこれで
Unboundには、
server:
interface: 自分自身のIPアドレス
port: 53
access-control: 127.0.0.0/8 allow
access-control: LANのネットワークアドレス/サブネットマスク allow
use-syslog: yes
log-queries: yes
hide-version: yes
hide-identity: yes
do-not-query-localhost: no
forward-zone:
name: "."
forward-addr: フォワード先の(プロバイダが提供している)プライマリDNS
forward-addr: フォワード先の(プロバイダが提供している)セカンダリDNS
stub-zone:
name: "nip.example.jp."
stub-addr: 127.0.0.1@10053
基本的には第834回で紹介した設定とほぼ同じです。異なる点は、server句に、localhostへのクエリ送信を許可する
$ sudo systemctl restart unbound.service
以後このUnboundは、通常の名前解決要求はプロバイダのDNSサーバーにフォーワドしつつ、nip.

あとは各クライアントが、キャッシュDNSサーバーとしてこのUnboundを使うように設定しましょう。DHCPでアドレスを配ってしまうのが簡単ですね。
今どきの開発現場では、VMやコンテナを頻繁に作っては消すことでしょう。LAN内で自由なホスト名を、それも複数のホスト名を、DNSサーバーをいじることなく、今すぐ名前解決したい。そんな時にはワイルドカードDNSが便利です。既にUnboundでローカルゾーンを運用しているような環境であれば、nip.