このページはリンク切れを生じないために残してありますが、内容は古くなっていますのでご注意下さい。

起動

まずはプライマリになってみましょう。
ソースツリーのsamples/knot.full.confを参考に/proj/knot-dns/etc/knot.confを以下の内容で作りました。

system {
        storage "/proj/knot-dns/var";
}
zones {
        example1.jp {
                file "/proj/dns/namedb/example1.jp";
        }
}

また、example1.jpゾーンのゾーンデータ、/proj/dns/namedb/example1.jpは以下の内容で作りました。

$TTL 1d
@       IN      SOA     ns.example1.jp. hostmaster.example1.jp. (
        2012040101
        20m
        15m
        4w
        15m )
        NS      ns.example1.jp.
ns      A       192.0.2.1

Knot DNSの制御にはknotcコマンドを使います。knotcの構文は次の通りです。

% /proj/knot-1.0.6/sbin/knotc -help
Usage: knotc [parameters] start|stop|restart|reload|running|compile [additional]
Parameters:
 -c [file], --config=[file] Select configuration file.
 -j [num], --jobs=[num]     Number of parallel tasks to run (only for 'compile').
 -f, --force                Force operation - override some checks.
 -v, --verbose              Verbose mode - additional runtime information.
 -V, --version              Print knot server version.
 -w, --wait                 Wait for the server to finish start/stop operations.
 -i, --interactive          Interactive mode (do not daemonize).
 -a, --auto                 Enable automatic recompilation (start or reload).
 -h, --help                 Print help and usage.
Actions:
 start     Start knot server zone (no-op if running).
 stop      Stop knot server (no-op if not running).
 restart   Stops and then starts knot server.
 reload    Reload knot configuration and compiled zones.
 refresh   Refresh all slave zones.
 running   Check if server is running.
 checkconf Check server configuration.

 checkzone Check zones (accepts specific zones, f.e. 'knotc checkzone example1.com example2.com').
 compile   Compile zones (accepts specific zones, see above).

まずknotcのcheckckonfサブコマンドでknot.confをチェックしてみます。

% /proj/knot-1.0.6/sbin/knotc checkconf
2012-06-28T20:44:50.819854+09:00 Using '/proj/knot-dns/etc/knot.conf' as default configuration.
2012-06-28T20:44:50.820522+09:00 OK, configuration is valid.

OKだと言っています。続いてcheckzoneサブコマンドでexample1.jpゾーンのゾーンデータをチェックしてみます。

% /proj/knot-1.0.6/sbin/knotc checkzone example1.jp
2012-06-28T20:46:34.196737+09:00 Using '/proj/knot-dns/etc/knot.conf' as default configuration.
2012-06-28T20:46:34.201878+09:00 [error] /proj/dns/namedb/example1.jp:2: @ used, but no $ORIGIN specified.

2012-06-28T20:46:34.219498+09:00 [error] /proj/dns/namedb/example1.jp:9: Zone file does not contain SOA record!

おやおや、エラーになってしまいました。Knot DNSはBINDやNSDとは違ってzones{}に書いたゾーン名をoriginの初期値には使ってくれないようです。メーリングリストで質問したところ、開発者から反応がありましたので、そのうち仕様が変わると思います。
v1.1.0-rc1で変わりました。

ゾーンデータの2行目に$ORIGINを書き足して、以下のようにして

$TTL 1d
$ORIGIN example1.jp.
@ IN SOA ns.example1.jp. hostmaster.example1.jp. ( 2012040101 20m 15m 4w 15m ) NS ns.example1.jp. ns A 192.0.2.1
もう一度checkzoneしてみたところ

% /proj/knot-1.0.6/sbin/knotc checkzone example1.jp
2012-06-28T20:47:50.841841+09:00 Using '/proj/knot-dns/etc/knot.conf' as default configuration.
2012-06-28T20:47:50.860735+09:00 Zone file for 'example1.jp.' is OK.

OKになりました。
Knot DNSはNSDと同じように、テキストのゾーンデータを中間形式のデータファイルにコンパイルしてからサーバに読み込みます。コンパイルにはknotcのcompileサブコマンドを使います。

% /usr/bin/sudo /proj/knot-1.0.6/sbin/knotc compile
2012-06-21T19:34:49.809626+09:00 Using '/proj/knot-dns/etc/knot.conf' as default configuration.
2012-06-21T19:34:49.830451+09:00 Parsing file '/proj/dns/namedb/example1.jp', origin 'example1.jp.' ...
2012-06-21T19:34:49.834400+09:00 Compilation of 'example1.jp.' successful.

それでは起動してみましょう。knotcの-iオプションはinteractive modeで起動するオプションです。

% /usr/bin/sudo /proj/knot-1.0.6/sbin/knotc -i start
2012-06-21T19:39:18.693806+09:00 Using '/proj/knot-dns/etc/knot.conf' as default configuration.
2012-06-21T19:39:18.713661+09:00 Running in interactive mode.
2012-06-21T19:39:18.721303+09:00 Reading configuration '/proj/knot-dns/etc/knot.conf' ...
2012-06-21T19:39:18.722100+09:00 Loading 1 compiled zones...
2012-06-21T19:39:18.729707+09:00 Loaded zone 'example1.jp.'
2012-06-21T19:39:18.751623+09:00 Loaded 1 out of 1 zones.
2012-06-21T19:39:18.752808+09:00 Configured 0 interfaces and 1 zones.
2012-06-21T19:39:18.752891+09:00 
2012-06-21T19:39:18.753392+09:00 Starting server...
2012-06-21T19:39:18.757210+09:00 Server started in foreground, PID = 3278
2012-06-21T19:39:18.758948+09:00 PID stored in /proj/knot-dns/var/knot.pid

起動したようです。ところが、この状態でnetstatすると、localhostにしかbind()していません。

% netstat -atu | grep :domain
tcp        0      0 localhost.locald:domain *:*                     LISTEN     
udp        0      0 localhost.locald:domain *:*                                

一度^Cでknotcを停止して

2012-06-21T19:53:11.063316+09:00 Stopping server...
2012-06-21T19:53:11.064593+09:00 Server finished.
2012-06-21T19:53:11.065009+09:00 Shut down.

knot.confにinterfaces{}を書き足して以下のようにしました。

system {
        storage "/proj/knot-dns/var";
}
interfaces { eth0 { address 192.0.2.1; } }
zones { example1.jp { file "/proj/dns/namedb/example1.jp"; } }
今度は-iオプションなしで起動してみましょう。

% /usr/bin/sudo /proj/knot-1.0.6/sbin/knotc start
2012-06-21T19:54:06.392361+09:00 Using '/proj/knot-dns/etc/knot.conf' as default configuration.

この状態でnetstatしてみましょう。

% netstat -atu | grep :domain
tcp 0 0 ns.example1.jp:domain *:* LISTEN
tcp 0 0 localhost.locald:domain *:* LISTEN
udp 0 0 ns.example1.jp:domain *:*
udp 0 0 localhost.locald:domain *:*
今度はLANインターフェースにもbind()しました。INADDR_ANYはダメなのでしょうか? 試しにaddressを0.0.0.0に書き換えてknotc reloadしてみたところ、localhostにしかbind()しませんでした。どうやら明示的にIPアドレスを書かなきゃいけないみたいです。ということは、ホストをリナンバするときは、ここの設定変更も忘れないようにしなきゃいけませんね。まぁ公開サーバをリナンバすることなど、そうそうないんでしょうが、それをやるような状況の精神状態では、気づきにくいんじゃないかと思います。
ついに一応動いたようなので、digでクエリしてみましょう。

% dig @192.0.2.1 example1.jp SOA

; <<>> DiG 9.6.-ESV-R5-P1 <<>> @192.0.2.1 example1.jp SOA
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18151
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;example1.jp.                   IN      SOA

;; ANSWER SECTION:
example1.jp.            86400   IN      SOA     ns.example1.jp. hostmaster.example1.jp. 2012040101 1200 900 2419200 900

;; AUTHORITY SECTION:
example1.jp.            86400   IN      NS      ns.example1.jp.

;; ADDITIONAL SECTION:
ns.example1.jp.         86400   IN      A       192.0.2.1

;; Query time: 0 msec
;; SERVER: 192.0.2.1#53(192.0.2.1)
;; WHEN: Thu Jun 21 20:03:09 2012
;; MSG SIZE  rcvd: 120

無事、応答しました。
この時点で/proj/knot-dns/varの下には以下のファイルができています。

% ls -l /proj/knot-dns/var
total 36
-rw-r--r-- 1 root root   282 Jun 21 19:34 example1.jp.db
-rw-r--r-- 1 root root     9 Jun 21 19:34 example1.jp.db.crc
-rw-r----- 1 root root 20517 Jun 21 20:02 example1.jp.diff.db
-rw-r--r-- 1 root root     4 Jun 21 19:54 knot.pid

どうやら、中間形式のデータファイルはゾーン毎に作られ、knot.confのstorageで指定したディレクトリ直下にフラットに置かれるようです。NSDがすべてのゾーンをnsd.db、1ファイルにまとめるのとは違いますね。.db、.db.crc、.diff.dbの各ファイルの内容はわかりませんが、サーブするゾーンの数が多いと大変そうですね。
Copyright(c) 2012 Koh-ichi Ito, All rights reserved
ページ先頭のアイコン: Copyright(c) 2017 いらすとや, All rights reserved.
Last update: $Date: 2019-08-16 11:45:02 +0900 (Fri, 16 Aug 2019) $
[インストールへ|indexへ|スレーブになってみるへ]