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リゾルバーだと思うので、これからも見守っていこうと思います。