DNSキャッシュサーバを選ぶ

(2014.12.13)

LAN内の各ホストに対して、DNSサービスを提供する。

やりたいこと::

  • LANの外のホスト名-IPアドレスのキャッシュ
  • LAN内のファイルサーバなど, いくつかのホストについて, ホスト名-IPアドレスを引けるようにする。これらのホストは外からは見えない。

毒入れ (DNS cache poisoning)

キャッシュサーバに毒を盛り、クライアントからの問合わせに対して偽のIPアドレスを返させる攻撃。この攻撃が成功すると、phishingサイトに誘導したり、偽メールサーバに誘導してメールを詐取したりできる。

この辺りが解説の出発点。

権威サーバとキャッシュサーバ

図を見ればよく分かる;

DNSサーバと一口に言っても, 権威サーバとキャッシュサーバがある。

権威サーバとキャッシュサーバの分離は, 非常に古くから指摘されている。

権威サーバとキャッシュサーバでは、求められるアクセス管理がまったく異なるため、分離しなければ管理ができない。

権威サーバ (Authoritative Name Server)

権威サーバは、自身の管理するドメイン名空間のドメイン名について完全な情報を持ち、外部からの問合わせに対して回答する。

管轄外のドメイン名のキャッシュ機能は持たない (持たせてはいけない).

したがって, リゾルバ機能は持たない.

公開サーバの名前については, 全世界に公開する。

キャッシュサーバ (Recursive and caching name server)

キャッシュサーバは, LAN内などからの問合わせを受けて, root servers から順に再帰的に検索し, 名前を解決して回答する。

権威サーバへの問合わせが発生する.

上の毒入れのページにあるように, 実装に脆弱性があると, キャッシュサーバに偽データを注入されるリスクがある。

キャッシュサーバを権威サーバから分離して、キャッシュサーバのほうにはアクセス制限を掛けなければならない。

加えて, どこからでも問合わせを受け付けるようになっていると, 権威サーバへのDDos攻撃に使われかねない。(オープンリゾルバ)

キャッシュサーバ実装

で、どの実装がいいのか。

dnscache

D. J. Bernstein による djbdns の一部。

権威サーバとキャッシュサーバの分離や、キャッシュサーバは root servers を設定ファイルで持ち、信頼の出発点を確実にする、など優れた考え方で作られている。

開発がはるか昔に終了しており, IPv6にも対応しておらず, セキュリティ上の問題があるかないかも分からず, もはや使えない。

Unbound

キャッシュサーバに特化しており、必要であれば, NSD などの権威サーバと組み合わせる。

権威サーバなしでも, いくつかのホストを設定ファイルに登録して、そのホストは名前が引けるようにできる。

設定も簡単で, 扱いやすい。GOOD.

Dnsmasq

DNS forwarder. 上に書いたキャッシュサーバとは異なる。

キャッシュと /etc/hosts ファイルなどで名前解決できない場合は, DNS問合せを別のDNSサーバに転送する。自分でroot servers から出発して解決するわけではない。

なので, 別途, ISPなどが提供するキャッシュサーバが必要。ごく小規模な環境向け?

/etc/hostsあるいは設定ファイルで, いくつかのホストの名前が引けるようにできる。

DHCPサーバも兼ねる。便利は便利。

Unboundの設定

(2017.7.28更新)

ということで、私はUnbound をキャッシュサーバとして利用している。

Fedora Linux での設定ファイルは /etc/unbound/unbound.conf が出発点。

デフォルト設定では, localhost (127.0.0.1) からの問い合わせだけを受け付ける. LAN内のほかの機械からの問い合わせも受け付けたいときは, serverinterface, access-control を調整する。

例えば,

server:
    interface: 192.168.241.21
    access-control: 192.168.241.0/24 allow

設定ファイルを変更したら unbound-checkconf コマンドで確認する。

# systemctl restart unbound

digコマンドなどで、正常に動くか確認。

FreeBSDの場合

FreeBSD では、設定ファイルは /var/unbound にある。unbound.conf ファイルは非常に小さく, 基本的に全部の設定を conf.d/*.conf として置く形になる。

conf.d/local.conf ファイル:

server:
    root-hints: /var/unbound/named.cache

    # listen
    interface: 0.0.0.0
    interface: ::

    access-control: 192.168.241.0/24 allow

root hintファイルは、次のようにして (定期的に) 入手する;

/var/unbound# wget https://www.internic.net/domain/named.cache

起動は unbound-controlコマンド.

# unbound-control stop
ok
# unbound-control start

# unbound-control status
version: 1.5.10
verbosity: 1
threads: 1
modules: 2 [ validator iterator ]
uptime: 14 seconds
options: control(ssl)
unbound (pid 884) is running...

drillコマンドなどで正常に動くか確認。

システムの起動時に立ち上げるのは, /etc/rc.conf ファイルに次を追加;

local_unbound_enable="YES"