Knot DNSを使ってみた- DNS Summer Days 2014
NTTコミュニケーションズ株式会社
先端IPアーキテクチャセンタ
⾼高⽥田  美紀
2014/6/27

Copyright © NTT Communications Corporation. All right reserved.

⾃自⼰己紹介n 1993〜～  株式会社NTTPCコミュニケーションズ• ISP  (InfoSphere)  サーバの運⽤用• ホスティング  (WebARENA)  ⽴立立ち上げ〜～開発〜～運⽤用• 主にDNS、メールシステム担当n 2013/4〜～  NTTコミュニケーションズ株式会社• 先端IPアーキテクチャセンタü R&D部⾨門ü DDoS対策技術、DNSまわりでの事業部サポート、対外活動

n 対外活動• dnsops.jp  幹事• ときどき  JANOG  meeting  スタッフ、などなど
n エンジニア＋⺟母親業の両輪輪で活動中

Copyright © NTT Communications Corporation. All right reserved.

2

Knot  DNS  とは?
n CZ(チェコ共和国)  NIC製のDNSサーバソフトウェア• 権威DNS専⽤用• オープンソース• ⾼高速、マルチスレッド、⼤大部分はlock  freeü SMPで適切切にスケールするようデザイン
ü userspace-‐‑‒rcuを利利⽤用してlockを減らしている• 主なDNSプロトコルをサポートüüü
ü

AXFR/IXFR,  TSIG,  EDNS0,  NSID  (RFC  5001)
DNSSEC  with  NSEC3  (automatic  signing)
Response  Rate  Limiting
Dynamic  DNS,  オンラインでのzoneの追加/削除• そのほかおまけ的機能ü Auto  Forward/Reverse  Zone
ü disable-‐‑‒anyCopyright © NTT Communications Corporation. All right reserved.

3

実績?
n Knot  DNS  update＠2013  ENOG6/RIPE  NCC  Regional  Meeting•

http://www.enog.org/presentations/enog-‐‑‒6/210-‐‑‒KNOT-‐‑‒ENOG6-‐‑‒20131002-‐‑‒JT.pdf• .CZ,  .DKのroot• いくつかのチェコ共和国のレジストラ/ホスティング事業者• ルートサーバでもテストした
ü ICANN(I),  RIPE  NCC(K)

Copyright © NTT Communications Corporation. All right reserved.

4⾼高速らしいと聞いて:  ベンチマークn 伊藤⾼高⼀一さんのベンチマーク＠2012年年• http://www.kkdlabs.jp/dns/benchmark-‐‑‒2012/ja/ü BIND  9.9.1-‐‑‒P1  vs  NSD  3.2.10  vs  Knot  DNS  1.0.6• qps:  BINDの6倍以上、NSDの2.8倍程度度、⾼高速• Knot  DNSのみlost発⽣生せず=>まだ余⼒力力があったのではn Knot  DNS本家のベンチマーク＠2014年年• https://www.knot-‐‑‒dns.cz/pages/benchmark.html
üBIND  9.10.0-‐‑‒P1  vs  Knot  DNS  1.5.0-‐‑‒rc2,1.4.6  vs  NSD  3.2.17,4.0.4  vs  PowerDNS  3.3• qps:  次ページ
• 起動時間:  BINDと同じ〜～2倍程度度、⾼高速• メモリ使⽤用量量:  Knot  DNS  1.4.6ではBINDの2.5倍多く使⽤用
ü 1.5.0-‐‑‒rc2ではBINDより少ない使⽤用量量• Dynamic  DNS処理理スピードü 100万RRの巨⼤大ゾーンではBINDより3倍程度度遅いCopyright © NTT Communications Corporation. All right reserved.

5

Benchmark:  Response  Rate/Hosting(100k)

Copyright © NTT Communications Corporation. All right reserved.

6脱BINDn DNSサーバソフトウェア  ==  BIND?
n ここがいけてないよBINDさん• 権威DNS機能とキャッシュDNS機能が分離離されてない• 機能が豊富すぎる• デフォルト設定がいけてないü メモリ使い切切っちゃったりとか• 設定がわかりづらいü notify  まわり、allow-‐‑‒なんとか• バージョンによって同じ設定で挙動が違う• やばい設定を書けてしまうü ソースポート固定とか• 巨⼤大すぎるn脆弱性の多さ
Copyright © NTT Communications Corporation. All right reserved.

7この⽀支配からの卒業n 「重複」から卒業しませんか  !?
• キャッシュDNS:  Unbound• 権威DNS:  NSD,  Knot  DNS,  PowerDNS,  etc..
n 参考:  DNS実装ダイバーシティの話＠IW  2012  DNS  DAY•https://www.nic.ad.jp/ja/materials/iw/2012/proceedings/d2/

Copyright © NTT Communications Corporation. All right reserved.

8Knot  DNS:  使い⽅方

9Copyright © NTT Communications Corporation. All right reserved.

9

インストールn tarballダウンロード• https://www.knot-‐‑‒dns.cz/pages/download.htmln cat  README• yum  なり  apt-‐‑‒get  なりでbuildに必要なパッケージを⼊入れる• conﬁgure  して  make,  make  install$	 sudo	 apt-get	 install	 git-core	 libtool	 autoconf	 flex	 bison	 libssl-dev	 liburcu-dev

or$	 yum	 install	 libtool	 autoconf	 flex	 bison	 openssl-devel	 userspace-rcu-devel$	 ./configure	 &&	 make$	 sudo	 make	 installn Knot  DNS⽤用に  knot  ユーザ作成n /var/run/knot,  /var/lib/knot  ディレクトリ作成、knotユーザで書き込めるようにしておく$	 useradd	 –g	 users	 knot

$	 mkdir	 –p	 /var/run/knot	 /var/lib/knot$	 chown	 knot.users	 /var/run/knot	 /var/lib/knot

Copyright © NTT Communications Corporation. All right reserved.

knotcn knotdコントロール⽤用ユーティリティ• rndc  みたいなもの• knotc⽤用の設定ファイルは  *ない*ü simple  is  best!

• デフォルトではUNIXドメインソケット経由n コマンド• stop,  reload,  refresh  [zone]• ﬂushü journalファイルをﬂushしてzoneに反映• status,  zonestatus,  memstats  [zone]• checkconf,  checkzone  [zone]
ü knot.confをreloadする前に確認できる• signzone  [zone]

ü DNSSECの署名動作

Copyright © NTT Communications Corporation. All right reserved.

11

knotc#	 /usr/local/sbin/knotc

Usage:	 knotc	 [parameters]	 <action>

Parameters:	 -c,	 --config	 <file>	 	 	 	 Select	 configuration	 file.	 -s	 <server>	 	 	 	 	 	 	 	 	 	 	 	 Remote	 UNIX	 socket/IP	 address	 (default	 /var/run/knot/knot.sock).	 -p	 <port>	 	 	 	 	 	 	 	 	 	 	 	 	 	 Remote	 server	 port	 (only	 for	 IP).	 -y	 <[hmac:]name:key>	 	 	 Use	 key	 specified	 on	 the	 command	 line.	 -k	 <file>	 	 	 	 	 	 	 	 	 	 	 	 	 	 Use	 key	 file	 (as	 in	 config	 section	 'keys').	 -f,	 --force	 	 	 	 	 	 	 	 	 	 	 	 Force	 operation	 -	 override	 some	 checks.	 -v,	 --verbose	 	 	 	 	 	 	 	 	 	 Verbose	 mode	 -	 additional	 runtime	 information.	 -V,	 --version	 	 	 	 	 	 	 	 	 	 Print	 knot	 server	 version.	 -i,	 --interactive	 	 	 	 	 	 Interactive	 mode	 (do	 not	 daemonize).	 -h,	 --help	 	 	 	 	 	 	 	 	 	 	 	 	 Print	 help	 and	 usage.

Actions:	 stop	  	 	 	 	 Stop	 server.	 reload	  	 	 	 	 Reload	 configuration	 and	 changed	 zones.	 refresh	 [zone]	 	 	 	 Refresh	 slave	 zone	 (all	 if	 not	 specified).	 Flag	 '-f'	 forces	 retransfer.	 flush	  	 	 	 	 Flush	 journal	 and	 update	 zone	 files.	 status	  	 	 	 	 Check	 if	 server	 is	 running.	 zonestatus	 	 	 	 	 Show	 status	 of	 configured	 zones.	 checkconf	 	 	 	 	 Check	 current	 server	 configuration.	 checkzone	 [zone] 	 	 	 	 Check	 zone	 (all	 if	 not	 specified).	 memstats	 [zone]	 	 	 	 Estimate	 memory	 use	 for	 zone	 (all	 if	 not	 specified).	 signzone	 [zone]	 	 	 	 Sign	 all	 zones	 with	 available	 DNSSEC	 keys.

Copyright © NTT Communications Corporation. All right reserved.

12

knotd.conf  (システム的なとこ)
system  {    rundir  "/var/run/knot";    user  knot.users;    max-‐‑‒udp-‐‑‒payload  1220;}
interfaces  {    all_̲ipv4  {        address  0.0.0.0;    }    all_̲ipv6  {        address  [::];    }}log  {    syslog  {  any  info;  }}Copyright © NTT Communications Corporation. All right reserved.

権限分離離ユーザで読み書きできることが必要
pidファイル、control⽤用ソケットファイルなど
権限分離離ユーザ
UDPのペイロードサイズ上限
Listenするインタフェースの設定
書かないとListenしない(!)
IPv4とIPv6を別々に書く必要がある
名前 (all_ipv4とか) は何でもok
名前に対する address は1⾏行行のみok
ログの出し⽅方設定。syslog, stdout, stderr など

13knotd.conf  (マスターサーバ)
remotes  {    ns2_̲ipv4  {        address  192.0.2.53@53;    }    ns2_̲ipv6  {        address  2001:db8::53@53;    }
}スレーブサーバのIPアドレス、ポートの定義
192.0.2.0/24 などサブネット単位でもok

ゾーンの設定zones  {    storage  "/var/lib/knot";ワーキングディレクトリ    example.jp  {ゾーン定義、ゾーンファイルの場所        ﬁle  ”example.jp";        xfr-‐‑‒out  ns2_̲ipv4,  ns2_̲ipv6;
このアドレスからのゾーン転送のみ許可する        notify-‐‑‒out  ns2_̲ipv4,  ns2_̲ipv6;    }このアドレスにnotifyを送信する}
Copyright © NTT Communications Corporation. All right reserved.

14

knotd.conf  (スレーブサーバ)
remotes  {    ns1_̲ipv4  {        address  192.0.2.53@53;    }    ns1_̲ipv6  {        address  2001:db8::53@53;    }}zones  {    storage  "/var/lib/knot";    example.jp  {        ﬁle  ”example.jp";        xfr-‐‑‒in  ns1_̲ipv4,  ns1_̲ipv6;        notify-‐‑‒in  ns1_̲ipv4,  ns1_̲ipv6;    }}Copyright © NTT Communications Corporation. All right reserved.

マスターサーバのIPアドレス、ポートの定義
192.0.2.0/24 などサブネット単位でもok

ゾーンの設定ワーキングディレクトリ
ゾーン定義
ゾーンファイル。storageディレクトリ配下
このアドレスに対しゾーン転送を要求する
このアドレスからのnotifyのみ受け取る

15

Automatic  forward/reverse  recordsn 指定したアドレス帯のA/AAAA/PTRを⾃自動⽣生成• BINDでいう$GENERATEみたいなの• (forward|reverse)  <preﬁx>  <ttl>  <address>/<netblock>n Knot  DNS  1.5以降降n 設定例例:

zones{ example. {file "ns_soa_only_zone";query_module {synth_record "forward dynamic- 86400 2001:db8::/32";
synth_record "forward dynamic- 86400 198.51.100.0/25";}}
100.51.198.in-addr.arpa {file "ns_soa_only_zone";query_module {synth_record "reverse dynamic- example. 86400 198.51.100.0/25";}}
8.b.d.0.1.0.0.2.ip6.arpa {file "ns_soa_only_zone";query_module {synth_record "reverse dynamic- example. 86400 2001:db8::/32";}}}
Copyright © NTT Communications Corporation. All right reserved.

Automatic  forward/reverse  recordsn 実⾏行行例例:$ kdig -x 2001:db8:dead:beef::53 @::1 +norec;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 5688;; Flags: qr aa; QUERY: 1; ANSWER: 1; AUTHORITY: 0; ADDITIONAL: 0;; QUESTION SECTION:;; 3.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.f.e.e.b.d.a.e.d.8.b.d.0.1.0.0.2.ip6.arpa.
INPTR;; ANSWER SECTION:3.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.f.e.e.b.d.a.e.d.8.b.d.0.1.0.0.2.ip6.arpa. 86400
INPTR
dynamic-2001-0db8-deadbeef-0000-0000-0000-0053.example.
;; Received 159 B;; Time 2014-06-24 14:11:48 JST;; From ::1@53(UDP) in 0.0 ms

Copyright © NTT Communications Corporation. All right reserved.

disable-‐‑‒anyn ANYで問い合わせられたら、空のレスポンスにTCをつけて返す• 権威DNSサーバを狙ったDNS  reﬂection  attackの踏み台になりづらくなる• デフォルトではdisablezones {
disable-any on;::}zones {
example.jp {file ”example.jp";::
disable-any on;}}Copyright © NTT Communications Corporation. All right reserved.

起動$	 sudo	 /usr/local/sbin/knotd	 –d$	 sudo	 tail	 /var/log/messages

Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Knot	 DNS	 1.5.0-rc2	 starting.

Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Binding	 to	 interface	 0.0.0.0@53.

Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Binding	 to	 interface	 ::@53.

Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Configured	 2	 interfaces	 and	 4	 zones.

Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Changing	 group	 id	 to	 '100'.

Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Changing	 user	 id	 to	 '521'.

Jun	 24	 16:09:00	 ns1	 knot[3974]:	 PID	 stored	 in	 '/var/run/knot/knot.pid'

Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Changed	 directory	 to	 /.

Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Loading	 zones...

Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Zone	 '100.51.198.in-addr.arpa.'	 will	 be	 loaded	 (serial	 0)Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Zone	 'example.jp.'	 will	 be	 loaded	 (serial	 0)Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Zone	 'example.'	 will	 be	 loaded	 (serial	 0)Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Zone	 '8.b.d.0.1.0.0.2.ip6.arpa.'	 will	 be	 loaded	 (serial	 0)Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Starting	 server...

Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Zone	 '100.51.198.in-addr.arpa.'	 loaded	 (0	 ->	 2014062301).

Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Zone	 'example.jp.'	 loaded	 (0	 ->	 2014062301).

Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Zone	 'example.'	 loaded	 (0	 ->	 2014062301).

Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Zone	 '8.b.d.0.1.0.0.2.ip6.arpa.'	 loaded	 (0	 ->	 2014062301).

Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Server	 started	 as	 a	 daemon,	 PID	 =	 3974

Jun	 24	 16:09:00	 ns1	 knot[3974]:	 Binding	 remote	 control	 interface	 to	 '/var/run/knot/
knot.sock’.

Copyright © NTT Communications Corporation. All right reserved.

19

BINDからの移⾏行行
n 違うとこ• viewがない• 設定ファイル形式• ログの形式n 同じとこ• ゾーンファイル形式はBINDと同じ• Dynamic  DNSのインタフェースは同じ

Copyright © NTT Communications Corporation. All right reserved.

20

まとめn Knot  DNSのいいとこ紹介しました• わかりやすい• シンプル• 速い• 新しい設計
ü 競合を少なくした、とかn BINDとさよならしよう• 選択肢はいくつもある• 権威/キャッシュの分離離• viewも無くしてシンプルな世界にn 「重複」に怯えない暮らしを!
Copyright © NTT Communications Corporation. All right reserved.

21

おまけ:  権威DNSサーバでのDDoS対策
n 権威DNSサーバソフトウェアのDDoS対策機能として必要なもの• ⼤大きな返答をsource  IPへ返さないü 詐称されてるかもしれないからü TCPへのフォールバック  (TC=1)üdisable-‐‑‒any• 同じ返答を短時間にたくさん返さないü レートリミットüResponse  Rate  Limitingn これらは必須の機能となってきますn しかし、ここまでやったとしても。。
• 世界中のbotから1つずつ、別々の権威DNSサーバにqueryを送られると。。。

Copyright © NTT Communications Corporation. All right reserved.

22

権威DNSサーバを使ったDDoSの仕組み

送信元IPをn.n.n.nと偽造

権威
DNS
Copyright © NTT Communications Corporation. All right reserved.

ターゲット
n.n.n.n

権威
DNS

権威
DNS
23

権威
DNS

ANYへの対策:  disable-‐‑‒any

送信元IPをn.n.n.nと偽造

ターゲット
n.n.n.n

ANY  query
TC=1

権威
DNS
Copyright © NTT Communications Corporation. All right reserved.

権威
DNS

権威
DNS
24

権威
DNS

その他RRの対策:  Response  Rate  Limiting

送信元IPをn.n.n.nと偽造

ターゲット
n.n.n.n

DNSKEY,  TXTなど
返答サイズが⼤大きくなる
query

権威
DNS
Copyright © NTT Communications Corporation. All right reserved.

送信元アドレス帯、NAME,QTYPE等で制限該当すればTC=1

権威DNS

権威DNS
25

権威DNS