[DNS] Knot DNS resolverを導入してみた。

AIX、UNIX、Linux
Knot Resolver
Resolve DNS names like it’s 2024

C言語とJITLuaで書かれた、DNSリゾルバー、Knot DNS resolverを導入してみました。

ファーストリリースが2016年5月と最近出てきたものになります。

最新の更新内容は以下に書いてあります。

knot-resolver/NEWS at master · CZ-NIC/knot-resolver
Knot Resolver - resolve DNS names like it's 2024. Contribute to CZ-NIC/knot-resolver development by creating an account ...

個人的にissueであげていた以下の部分が追加されたので導入してみることにしました。

– DAF: Allow forwarding to custom port

確認環境:

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"

導入手順

1. レポジトリの追加およびインストール

run as root:

LC_ALL=C.UTF-8 add-apt-repository ppa:cz.nic-labs/knot-dns
LC_ALL=C.UTF-8 add-apt-repository ppa:cz.nic-labs/knot-resolver
apt-get update
apt-get install knot-resolver

2. これで導入自体は終わりなのですが、以下のSocketファイルが常時起動しており、localhostにbindされます。
面倒くさいので一旦無効化します。

$ sudo netstat -antp | grep init
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      1/init
tcp6       0      0 ::1:53                  :::*                    LISTEN      1/init
tcp6       0      0 :::853                  :::*                    LISTEN      1/init   
sudo systemctl stop kresd.socket kresd-control.socket kresd-tls.socket
sudo systemctl mask kresd.socket kresd-control.socket kresd-tls.socket

7行目と14行目を変更します。

$ sudo systemctl cat kresd.service
# /lib/systemd/system/kresd.service
[Unit]
Description=Knot DNS Resolver daemon
Documentation=man:kresd(8)
## This is a socket-activated service:
RefuseManualStart=false

[Service]
Type=notify
WorkingDirectory=/run/knot-resolver/cache
EnvironmentFile=-/etc/default/kresd
ExecStart=/usr/sbin/kresd $KRESD_ARGS
#User=knot-resolver
User=root
Restart=on-failure

[Install]
WantedBy=sockets.target

3. configファイルの内容は以下の様な感じになるはずです。–以下がコメント扱いになります。

-- Default empty Knot DNS Resolver configuration in -*- lua -*-
-- Bind ports as privileged user (root) --
-- net = { '127.0.0.1', '::1', '192.168.1.2',  }
for name, addr_list in pairs(net.interfaces()) do
	net.listen(addr_list)
end
-- Switch to unprivileged user --
user('knot-resolver','knot-resolver')
-- Unprivileged
cache.size = 256*MB
modules = {
  'hints  > iterate', -- Hints AFTER iterate
  'policy > hints',   -- Policy AFTER hints
  'view   < rrcache',  -- View BEFORE rrcache
  predict = {
    window = 15, -- 15 minutes sampling window
    period = 6*(60/15) -- track last 6 hours
  },
  	'daf'
}
modules.list() -- Check module call order
policy.add(policy.suffix(policy.FORWARD('192.168.1.2@10053'), {'7kometch5local'}))
daf.add 'qname ~ %w*.kometch.local forward 192.168.1.2@10053'

最後は同居しているDNSコンテンツサーバのカスタムポートへFORWARDする書き方です(stub forwardingですね)。
ここらへんは公式のドキュメントにも記載があるので、問題無いでしょう。

POINT

開発者の方から、DNS application Firewallを併用したほうがいいよということで追加しました。

modules = { 'daf' }
daf.add 'qname ~ %w*.kometch.local forward 192.168.1.2@10053'

ドキュメント

http://knot-resolver.readthedocs.io/en/latest/modules.html#query-policies
404 Not Found | Read the Docs

4. サービス起動が不安なときは以下のようにしてインタラクティブモードで起動しましょう。verboseオプションをつけているので、デバッグっぽく上がってくるので、configがミスっていてもわかると思います。

sudo kresd --config=/etc/knot-resolver/kresd.conf --verbose --forks=1 --keyfile=/usr/share/dns/root.key /run/knot-resolver/cache

他にもDNS application FirewallとかPrometheus対応、HTTP2 Web interface対応など、どこに向かっているかわからない機能追加が満載ですが、色々と面白いDNSリゾルバーだと思うので、これからも見守っていこうと思います。

この記事を書いた人

kometchtech

うつ病を患いながら、IT業界の末席にいるおっさんエンジニア。科学計算をしたことがないのに、HPC分野にお邪魔している。興味のある分野で学習したことをblogにまとめつつ、うつ病の経過症状のメモも置いておく日々。じつはRouterboard User Group JPの中の人でもある。 Amazon欲しいものリスト / Arm板を恵んでくれる人募集中

kometchtechをフォローする
タイトルとURLをコピーしました