DNSOPS.JP BoF 2015-11-19

nginxを利⽤した DNS over TLS
対応フルリゾルバの作り⽅(株)ハートビーツ

滝澤 隆史

2私は誰
• ⽒名: 滝澤 隆史 @ttkzw• 所属: 株式会社ハートビーツ▫ ウェブ系のサーバの構築・運⽤や24時間365⽇の有⼈監視をやっている会社▫ いわゆるMSP(マネージド サービス プロバイダ)• ⽇本Unboundユーザー会▫ Unbound/NSDの⽂書の翻訳• DNSをネタとして遊んでいるおじさんです。
▫ 「DNS RFC系統図」を作っています。
DNSOPS.JP BoF

2015-11-19

3

DNS Privacy• IETFのdpriveワーキンググループ▫ DNS PRIVate Exchange (DPRIVE)• DNSトランザクション中のプライバシーを守る仕組み• RFC 7626: DNS Privacy Considerations• I-D: DNS over TLS: Initiation andPerformance Considerations• I-D: DNS over DTLS (DNSoD)DNSOPS.JP BoF

2015-11-19

4

DNSトランザクション
ルートゾーンの権威サーバ

www.example.jpのIPアドレスを教えて？

jpゾーンの権威サーバ

www.example.jpのIPアドレスは192.0.2.4

スタブ リゾルバ（クライアント）

フル リゾルバ（キャッシュ ネームサーバ）

example.jp
ゾーンの権威サーバ
権威ネームサーバDNSOPS.JP BoF

2015-11-19

5

DNSトランザクションの暗号化
DNS over TLS
DNS over DTLS

ルートゾーンの権威サーバ

www.example.jpのIPアドレスを教えて？

jpゾーンの権威サーバ

www.example.jpのIPアドレスは192.0.2.4

スタブ リゾルバ（クライアント）

フル リゾルバ（キャッシュ ネームサーバ）

example.jp
ゾーンの権威サーバ
権威ネームサーバDNSOPS.JP BoF

2015-11-19

6

DNS over TLS対応リゾルバ• draft-ietf-dprive-dns-over-tls-01▫ 8. Implementation Status▫ 8.1. Unbound▫ 8.2. ldns
▫ 8.3. digit▫ 8.4. getdns

DNSOPS.JP BoF

2015-11-19

7

DNS over TLS対応リゾルバ• draft-ietf-dprive-dns-over-tls-01▫ 8. Implementation Status▫ 8.1. Unbound▫ 8.2. ldns
▫ 8.3. digit▫ 8.4. getdns

DNSOPS.JP BoF

2015-11-19

8

DNS over TLS対応リゾルバ• Unbound▫ ssl-port, ssl-upstream機能
 DNS over TLSに対応

DNSOPS.JP BoF

2015-11-19

9Unboundのssl-upstream機能の利⽤例
クエリーをTCP 853ポートにフォワードする。
unboundTCP 853ポートでリッスンする。

DNS over TLS

unbound

スタブリゾルバ
スタブ リゾルバ（クライアント）

フルサービス リゾルバ
（キャッシュ ネームサーバ）

server:server:ssl-upstream: yesinterface: 0.0.0.0@853
forward-zone:
ssl-service-key: "/etc/unbound/unbound_server.key"
name: "."
ssl-service-pem: "/etc/unbound/unbound_server.pem"
forward-addr: 192.0.2.1@853
ssl-port: 853
DNSOPS.JP BoF

2015-11-19

10Unboundならできるのはわかった。
では、フルリゾルバ側でUnbound以外を利⽤したいときには？
DNSOPS.JP BoF

2015-11-19

11

そうだ。
nginx（ウェブサーバ）のstreamモジュールを使おう。

DNSOPS.JP BoF

2015-11-1912nginx（えんじん えっくす）とは• HTTP server• reverse proxy server (HTTP)• mail proxy server (SMTP, POP3, IMAP)• TCP proxy server• SSL/TLS termination対応• HTTP/2対応• ウェブサーバのシェアはApache HTTP Serverに続いて2位。（Netcraftの調査。Market share ofactive sites）▫ http://news.netcraft.com/archives/
2015/10/16/october-2015-web-serversurvey.html
DNSOPS.JP BoF

2015-11-19

13nginx（えんじん えっくす）とは• HTTP server• reverse proxy server (HTTP)• mail proxy server (SMTP, POP3, IMAP)• TCP proxy server• SSL/TLS termination対応• HTTP/2対応• ウェブサーバのシェアはApache HTTP Serverに続いて2位。（Netcraftの調査。Market share ofactive sites）▫ http://news.netcraft.com/archives/
2015/10/16/october-2015-web-serversurvey.html
DNSOPS.JP BoF

2015-11-19

14

なぜ、nginxなのか• streamモジュール(TCP proxy機能)はTLS termination対応• そこに、nginxがあったから• 今時の実装（イベント駆動、ノンブロッキング
⾮同期I/O）

DNSOPS.JP BoF

2015-11-19

15

nginxでDNSパケットを転送

おまえは何を⾔っているんだ！

クエリーをTCP 853ポートにフォワードする。
unbound

TCP 853ポートでリッスンする。
DNS over TLS

nginx

TCP 53ポートにフォワードする。

スタブリゾルバ

フルリゾルバスタブ リゾルバ（クライアント）

フル リゾルバ（キャッシュ ネームサーバ）

DNSOPS.JP BoF

2015-11-19

16

nginx.conf
stream {upstream backend {server 127.0.0.1:53;}
server {listen *:853 ssl;
listen [::]:853 ssl;

フルリゾルバを指定。
複数個記述することで負荷分散できる。
リッスンするポートをTCP 853に指定。
SSL/TLSを有効に。

ssl_prefer_server_ciphers on;
ssl_protocols
TLSv1.2;
ssl_ciphers
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCMSHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128SHA:ECDHE-RSA-AES128-SHA;
ssl_certificate/etc/nginx/tls/server.crt;
ssl_certificate_key /etc/nginx/tls/server.key;
ssl_session_cacheshared:DNS:5m;
ssl_session_timeout 5m;
ssl_session_ticket_key /etc/nginx/tls/ticket.key;
ssl_session_tickets on;proxy_pass backend;}}

アップストリーム先の指定。
DNSOPS.JP BoF

2015-11-19

17

DNSOPS.JP BoF

2015-11-19

18

ベンチマーク環境• ベンチマークツール▫ dnsperf 2.0.0.0
 -c 10 -n 200000
 "localhost A"を問い合わせ。
• サーバ▫ AWS EC2 c4.large▫ クライアントとサーバは、同⼀リージョン同⼀アベイラビリティゾーンであるため、ネットワークレイテンシは⼩さい。
• 結果について▫ 3回計測し、その平均値を有効数字2桁で四捨五⼊。
▫ 今⽇、思いつきでベンチマークをやったので精度はよくない。
 さらに、クラウド上の仮想マシンですし。
▫ クライアント側がボトルネックになっていて負荷があまりかけられていない。
 でも、CPU負荷は数%。CPU Usageはstealが数%。コンテキ
ストスイッチが6桁台。クラウド環境な時点で負け。
▫ そのため、相対的な⼤雑把な⽐較。
DNSOPS.JP BoF

2015-11-19

19

ベンチマーク環境• クライアント側のunbound経由で対象サーバにクエリーを⾏う。
▫ キャッシュ無しのフォワーダーとして動作 cache-max-ttl: 0▫ localhostに対する回答を返せるので無効化
 local-zone: "localhost" transparent
stream {• クライアント側のnginx経由でupstream backend {server 10.0.0.38:853;TLS化}▫ TLSセッション再利⽤の有無のserver {listen *:80;
違いも計測proxy_ssl on;▫ proxy_ssl on;
proxy_ssl_session_reuse on;proxy_ssl_protocols TLSv1.2;▫ proxy_ssl_session_reuse on;proxy_pass backend;}}

DNSOPS.JP BoF

2015-11-19

20

ベンチマーク環境

TLS化。
TLSセッション
再利⽤検証⽤nginx(TCP/80)
unbound(UDP/53)

dnsperf
スタブ リゾルバ（クライアント）

DNS over TLS
STLrev
So
N
D

nginx
(TCP/853, TLS)
unbound(UDP|TCP/53)

基準値
フル リゾルバ（キャッシュ ネームサーバ）
DNSOPS.JP BoF

2015-11-19

21

1. 基準値（UDP）

unbound(UDP/53)

UDP

項番qps

182000unbound(UDP/53)

dnsperf
スタブ リゾルバ（クライアント）

フル リゾルバ（キャッシュ ネームサーバ）
DNSOPS.JP BoF

2015-11-19

222. 基準値（TCP）

unbound(UDP/53)

TCP

項番

qps

1

82000

271000unbound(TCP/53)

dnsperf
スタブ リゾルバ（クライアント）

フル リゾルバ（キャッシュ ネームサーバ）
DNSOPS.JP BoF

2015-11-19

23

3. 基準値 (DNS over TLS)

unbound(UDP/53)

DNS over TLS

項番

qps

1

82000

2710003

1000

unbound(TCP/853, TLS)

dnsperf
スタブ リゾルバ（クライアント）

フル リゾルバ（キャッシュ ネームサーバ）
DNSOPS.JP BoF

2015-11-19

24

4. nginx(TLSなし)

TCP

unbound(UDP/53)

項番

qps

1

82000

271000469000nginx(TCP/80)
unbound(TCP/53)

dnsperf
スタブ リゾルバ（クライアント）

フル リゾルバ（キャッシュ ネームサーバ）
DNSOPS.JP BoF

2015-11-19

25

5. nginx(TLS)

Sunbound(UDP/53)

TLrev
SoN
D

項番

qps

182000

31000

52100

nginx
(TCP/853, TLS)
unbound(TCP/53)

dnsperf
スタブ リゾルバ（クライアント）

フル リゾルバ（キャッシュ ネームサーバ）
DNSOPS.JP BoF

2015-11-19

26

6. クライアント側nginx(TLS)、サーバ側unbound(TLS)

項番

qps

3

1000

52100

62400

nginx
(TCP/80)
unbound(UDP/53)

unbound(TCP/853, TLS)

dnsperf
スタブ リゾルバ（クライアント）

フル リゾルバ（キャッシュ ネームサーバ）
DNSOPS.JP BoF

2015-11-19

27

7. クライアント側nginxでTLS化
nginx(TCP/80)
unbound(UDP/53)

DNS over TLS

項番

qps

18200031000

715000nginx(TCP/853, TLS)
unbound(TCP/53)

dnsperf
スタブ リゾルバ（クライアント）

フル リゾルバ（キャッシュ ネームサーバ）
DNSOPS.JP BoF

2015-11-19

28

8. クライアント側nginxでTLS化（TLSセッション再利⽤あり）
nginx(TCP/80)
unbound(UDP/53)

DNS over TLS

項番

qps

182000715000844000nginx(TCP/853, TLS)
unbound(TCP/53)

dnsperf
スタブ リゾルバ（クライアント）

フル リゾルバ（キャッシュ ネームサーバ）
DNSOPS.JP BoF

2015-11-19

29

結果

有効数字2桁として四捨五⼊

項番 説明プロト
コル

qps

1

基準値([unbound] – [unbound])

UDP

82000

2

基準値([unbound] – [unbound])

TCP

71000

3

基準値([unbound] – [unbound])

TLS

1000

4nginxでTCP転送([unbound] – [nginx – unbound])

TCP

69000

5nginxでTLS termination([unbound] – [nginx – unbound])

TLS

2100

6

クライアント側をnginxでTLS化([unbound – nginx] – [unbound])

TLS

2400

7

クライアント側をnginxでTLS化([unbound – nginx] – [nginx – unbound])

TLS

15000

8

クライアント側をnginxでTLS化(セッション再利⽤)([unbound – nginx] – [nginx – unbound])

TLS

44000
DNSOPS.JP BoF

2015-11-19

30

ベンチマークのまとめ• 負荷が⼗分にかけられていない状況では、UDPとTCPによる性能の違いは⼤きくはない。
▫ ベンチマーク環境のネットワークレイテン
シーが⼩さいのでより差が出にくい？
• unboundのTLS周り性能はよくない。
• nginxのTLS周りの性能はよい。
▫ TLS termination▫ TLS proxy

DNSOPS.JP BoF

2015-11-19

31

ベンチマークのまとめ• TLSのハンドシェイクのオーバーヘッドは⼤きい。
▫ TLSセッション再利⽤を⾏わないと性能がかなり落ちる。
• TLS周りでは次の機能のどちらかを利⽤しないと性能的には⾟い。
▫ TLS session cache▫ TLS Session Resumption / TLS Session Tickets
 RFC 5077 Transport Layer Security (TLS) Session
Resumption without Server-Side State• draft-ietf-dnsop-5966bis (DNS Transport over TCP Implementation Requirements)で性能は改善するはず？
▫ Connection Re-use▫ Query Pipelining▫ TCP Fast OpenDNSOPS.JP BoF

2015-11-19

32

DNSOPS.JP BoF

2015-11-19