DNSOPS.JP BoF nginxを利 した DNS over TLS 対応フルリゾルバの作り ( 株 ) ハートビーツ滝澤隆史
2 私は誰 名 : 滝澤隆史 @ttkzw 所属 : 株式会社ハートビーツ ウェブ系のサーバの構築 運 や 24 時間 365 の有 監視をやっている会社 いわゆる MSP( マネージドサービスプロバイダ ) 本 Unbound ユーザー会 Unbound/NSD の 書の翻訳 DNS をネタとして遊んでいるおじさんです DNS RFC 系統図 を作っています
3 DNS Privacy IETF の dprive ワーキンググループ DNS PRIVate Exchange (DPRIVE) DNS トランザクション中のプライバシーを守る仕組み RFC 7626: DNS Privacy Considerations I-D: DNS over TLS: Initiation and Performance Considerations I-D: DNS over DTLS (DNSoD)
4 DNS トランザクション ルートゾーンの権威サーバ スタブリゾルバ ( クライアント ) www.example.jp の IP アドレスを教えて? www.example.jp の IP アドレスは 192.0.2.4 フルリゾルバ ( キャッシュネームサーバ ) 権威ネームサーバ jp ゾーンの 権威サーバ example.jp ゾーンの 権威サーバ
5 DNS トランザクションの暗号化 DNS over TLS DNS over DTLS ルートゾーンの権威サーバ スタブリゾルバ ( クライアント ) www.example.jp の IP アドレスを教えて? www.example.jp の IP アドレスは 192.0.2.4 フルリゾルバ ( キャッシュネームサーバ ) 権威ネームサーバ jp ゾーンの 権威サーバ example.jp ゾーンの 権威サーバ
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
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
8 DNS over TLS 対応リゾルバ Unbound ssl-port, ssl-upstream 機能 DNS over TLS に対応
9 Unbound の ssl-upstream 機能の利 例 クエリーを TCP 853 ポートにフォワードする TCP 853 ポートで リッスンする DNS over TLS スタブ リゾルバ スタブリゾルバ ( クライアント ) server: ssl-upstream: yes forward-zone: name: "." forward-addr: 192.0.2.1@853 フルサービスリゾルバ ( キャッシュネームサーバ ) server: interface: 0.0.0.0@853 ssl-service-key: "/etc/unbound/unbound_server.key" ssl-service-pem: "/etc/unbound/unbound_server.pem" ssl-port: 853
10 Unboundならできるのは わかった では フルリゾルバ側で Unbound 以外を 利 したいときには?
11 そうだ nginx( ウェブサーバ ) の streamモジュールを 使おう
12 nginx( えんじんえっくす ) とは 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 of active sites) http://news.netcraft.com/archives/ 2015/10/16/october-2015-web-serversurvey.html
13 nginx( えんじんえっくす ) とは 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 of active sites) http://news.netcraft.com/archives/ 2015/10/16/october-2015-web-serversurvey.html
14 なぜ nginx なのか stream モジュール (TCP proxy 機能 ) は TLS termination 対応 そこに nginx があったから 今時の実装 ( イベント駆動 ノンブロッキング 同期 I/O)
15 nginx で DNS パケットを転送 おまえは何を っているんだ! クエリーを TCP 853 ポートにフォワードする TCP 853 ポートで リッスンする DNS over TLS nginx TCP 53 ポートにフォワードする スタブ リゾルバ フル リゾルバ スタブリゾルバ ( クライアント ) フルリゾルバ ( キャッシュネームサーバ )
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-GCM- SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128- SHA:ECDHE-RSA-AES128-SHA; ssl_certificate /etc/nginx/tls/server.crt; ssl_certificate_key /etc/nginx/tls/server.key; ssl_session_cache shared:dns:5m; ssl_session_timeout 5m; ssl_session_ticket_key /etc/nginx/tls/ticket.key; ssl_session_tickets on; } } proxy_pass backend; アップストリーム先の指定
17
18 ベンチマーク環境 ベンチマークツール dnsperf 2.0.0.0 -c 10 -n 200000 "localhost A" を問い合わせ サーバ AWS EC2 c4.large クライアントとサーバは 同 リージョン同 アベイラビリティゾーンであるため ネットワークレイテンシは さい 結果について 3 回計測し その平均値を有効数字 2 桁で四捨五 今 思いつきでベンチマークをやったので精度はよくない さらに クラウド上の仮想マシンですし クライアント側がボトルネックになっていて負荷があまりかけられていない でも CPU 負荷は数 % CPU Usage は steal が数 % コンテキストスイッチが 6 桁台 クラウド環境な時点で負け そのため 相対的な 雑把な 較
19 ベンチマーク環境 クライアント側の unbound 経由で対象サーバにクエリーを う キャッシュ無しのフォワーダーとして動作 cache-max-ttl: 0 localhost に対する回答を返せるので無効化 local-zone: "localhost" transparent クライアント側の nginx 経由で TLS 化 TLS セッション再利 の有無の 違いも計測 proxy_ssl on; proxy_ssl_session_reuse on; stream { upstream backend { server 10.0.0.38:853; } server { listen *:80; proxy_ssl on; proxy_ssl_session_reuse on; proxy_ssl_protocols TLSv1.2; proxy_pass backend; } }
20 ベンチマーク環境 TLS 化 TLS セッション 再利 検証 nginx (TCP/80) (UDP/53) DNS over TLS DNS over TLS nginx (TCP/853, TLS) (UDP TCP/53) dnsperf 基準値 スタブリゾルバ ( クライアント ) フルリゾルバ ( キャッシュネームサーバ )
21 1. 基準値 (UDP) 項番 1 qps 82000 (UDP/53) UDP (UDP/53) dnsperf スタブリゾルバ ( クライアント ) フルリゾルバ ( キャッシュネームサーバ )
22 2. 基準値 (TCP) 項番 1 2 qps 82000 71000 (UDP/53) TCP (TCP/53) dnsperf スタブリゾルバ ( クライアント ) フルリゾルバ ( キャッシュネームサーバ )
23 3. 基準値 (DNS over TLS) 項番 1 2 3 qps 82000 71000 1000 (UDP/53) DNS over TLS (TCP/853, TLS) dnsperf スタブリゾルバ ( クライアント ) フルリゾルバ ( キャッシュネームサーバ )
24 4. nginx(tls なし ) 項番 1 2 4 qps 82000 71000 69000 (UDP/53) TCP nginx (TCP/80) (TCP/53) dnsperf スタブリゾルバ ( クライアント ) フルリゾルバ ( キャッシュネームサーバ )
25 5. nginx(tls) 項番 1 3 5 qps 82000 1000 2100 (UDP/53) DNS over TLS nginx (TCP/853, TLS) (TCP/53) dnsperf スタブリゾルバ ( クライアント ) フルリゾルバ ( キャッシュネームサーバ )
26 6. クライアント側 nginx(tls) サーバ側 unbound(tls) 項番 3 5 6 qps 1000 2100 2400 nginx (TCP/80) (UDP/53) (TCP/853, TLS) dnsperf スタブリゾルバ ( クライアント ) フルリゾルバ ( キャッシュネームサーバ )
27 7. クライアント側 nginx で TLS 化 項番 1 3 7 qps 82000 1000 15000 nginx (TCP/80) DNS over TLS nginx (TCP/853, TLS) (UDP/53) (TCP/53) dnsperf スタブリゾルバ ( クライアント ) フルリゾルバ ( キャッシュネームサーバ )
28 8. クライアント側 nginx で TLS 化 (TLS セッション再利 あり ) 項番 1 7 8 qps 82000 15000 44000 nginx (TCP/80) DNS over TLS nginx (TCP/853, TLS) (UDP/53) (TCP/53) dnsperf スタブリゾルバ ( クライアント ) フルリゾルバ ( キャッシュネームサーバ )
29 結果 有効数字 2 桁 として四捨五 項番 説明 プロト コル qps 1 基準値 ([unbound] [unbound]) UDP 82000 2 基準値 ([unbound] [unbound]) TCP 71000 3 基準値 ([unbound] [unbound]) TLS 1000 4 5 6 7 8 nginx で TCP 転送 ([unbound] [nginx unbound]) nginx で TLS termination ([unbound] [nginx unbound]) クライアント側を nginx で TLS 化 ([unbound nginx] [unbound]) クライアント側を nginx で TLS 化 ([unbound nginx] [nginx unbound]) クライアント側を nginx で TLS 化 ( セッション再利 ) ([unbound nginx] [nginx unbound]) TCP TLS TLS TLS TLS 69000 2100 2400 15000 44000
30 ベンチマークのまとめ 負荷が 分にかけられていない状況では UDP と TCP による性能の違いは きくはない ベンチマーク環境のネットワークレイテンシーが さいのでより差が出にくい? unbound の TLS 周り性能はよくない nginx の TLS 周りの性能はよい TLS termination TLS proxy
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 Open
32