DNSOPS.JP BoF 2012-11-21 DNS Load balancer と 俺 ブロケードコミュニケーションズ システムズ 株 式 会 社 甲 野 謙 一 1
私 は 誰 新 宿 ゴールデン 街 にて 甲 野 謙 一 (36) as KonoKono 2000 年 から 様 々の 形 でLoad Balancerを 担 当 BrocadeではADXの 機 能 設 計 やPOST 系 を 担 当 ブロケード 事 業 L2/L3とL4-7スイッチ Fiber Channel SANスイッチ 今 は SANもIP/LANも 両 方 やってます 合 体! 2
Load Balancer 業 界 の 変 遷 とメジャープレーヤー founded in 1996 2008 Bought by Nortel Networks Bought by Radware Alteon4 released Gigabit Ethernet NIC Jumbo Frame founded in 1996 2000 2009 2010 founded in 1997 1997 Local Director 1998 founded in 1996 3
Load Balancerとは 4つの 基 本 機 能 復 習 負 荷 分 散 機 能 アドレス 変 換 機 能 (MACとIP) ヘルスチェック 機 能 セッション 維 持 機 能 Virtual Server VIP Load Balancer SLB Real Server1 DNS Real Server2 DNS 4
FOUNDRY NETWORKS BxG Link 1 Active 2 TxAct RxAct Pwr Active Console FOUNDRY NETWORKS BxG Link 1 Active 2 TxAct RxAct Pwr Active Console ネットワーク 構 成 IN LINEとDSRのPACKET Walkthrough 復 習 Client 208.46.221.240 Client 208.46.221.240 IN LINE 構 成 1 4 DSR 構 成 1 WSMM2 LB CPU 2 CPU 1 CPU 1 ServerIronGT EGx2 ServerIron Mgmt: 208.46.221.228 Gw: 208.46.221.225 VIP: 208.46.221.230 WSMM2 LB CPU 2 CPU 1 CPU 1 ServerIronGT EGx2 ServerIron Mgmt: 208.46.221.228 Gw: 208.46.221.225 VIP: 208.46.221.230 server source-ip 10.229.0.254 vlan tag 2 L3-Switch 3 2 3 Server01 192.168.0.101 Server02 192.168.0.102 Server01 10.229.0.206 Loopback 208.46.221.230 Server02 10.229.0.207 Loopback 208.46.221.230 5
FOUNDRY NETWORKS BxG Link 1 Active 2 TxAct RxAct Pwr Active Console TOS Bit L3 DSR 構 成 4 L3-Switch 2 L3-Switch Client 208.44.1.200 1 L3-Switch 1 2 3 4 ここ3 年 の 話 PACKET Walkthrough TOS Source IP Destination IP 0x0 204.44.1.200 144.49.0.250 0x4 204.44.1.200 58.81.111.249 0x4 204.44.1.200 58.81.111.249 0x0 144.49.0.250 204.44.1.200 3 L2-Switch WSMM2 CPU 2 CPU 1 CPU 1 ServerIronGT EGx2 serverの iptable rewrite ruleで 宛 先 を144.49.0.250に 変 更 3 Server01 58.81.111.249 Loopback 144.49.0.250 Server02 58.81.111.250 Loopback 144.49.0.250 ServerIron Mgmt: 144.49.0.222 Gw: 144.49.0.4 VIP: 144.49.0.250 FreeBSD 用 のReference module は Yahoo!が 公 開 している 6
DNS と Load balancer よくある 導 入 の 目 的 復 習 運 用 性 任 意 の 実 サーバの メンテナンス L7データによる 分 散 権 威 権 威 キャッシュ 性 能 向 上 スケールアウト 複 数 ロードバランサ 実 サーバによる 冗 長 権 威 権 威 キャッシュ キャッシュ 可 用 性 DoSトラフィックの 制 御 GSLBによるDRサイト 権 威 権 威 キャッシュ 7
LB 観 点 でのUDP DNSの 特 徴 UDP TCP FIN/RSTがないのでエントリ 削 除 の 制 御 Flagが 無 い そのため テーブルがパンクする 危 険 性 をはらむ UDP DNSはTransaction 数 が 多 い ISPにおける Cache DNS Server TLDやRoot Server 8
LBにおけるUDP DNS 処 理 の 特 徴 DNS queryのresponseを 処 理 した 段 階 で 即 座 に コネクションテーブルを 削 除 IP Fragment 時 は 処 理 後 少 し 待 って 削 除 短 い 間 でFragment IDが 重 複 しても 大 丈 夫 実 際 に どうしているかは 実 装 依 存 同 一 Source Portを 使 用 した 複 数 のQueryはIPヘッダ のIdentificationやTransaction IDで 識 別 することも 9
StatefulとStateless の 話 SLBモード Stateful SLB Stateless SLB パフォーマンス (IXIAでの 実 測 値 ) セッション テーブルの 作 成 コネクション コントロール 普 通 55 万 qps (ADX1000を 使 用 ) する 可 能 高 速 225 万 qps (ADX1000を 使 用 ) しない 不 可 DNS Firewall Queryの 中 を 精 査 不 可 統 計 情 報 の 表 示 あり なし DNSSEC 対 応 IP Fragmentを 含 めて どちらも 対 応 10
Stateful SLBで 接 続 制 限 する 例 Cache/ 権 威 DNSに 対 して 同 一 Source Portを 使 用 して 通 信 されると 気 が 付 きにくい(と 思 われる) 知 らぬ 間 に 攻 撃 されてることも LBでは 識 別 可 能 なので 秒 間 の 閾 値 を 超 えた 時 点 で ログだけ 出 力 することや 一 定 時 間 制 限 を 行 う 振 る 舞 いが 可 能 LB 導 入 のプラスαのモチベーション 11
Statelessの 話 LBとしてはパフォーマンスが 高 い 点 以 外 の 特 徴 を 発 揮 できず 実 現 できることが 少 ないのが 特 徴 です ですので 事 例 等 をコメントさせて 頂 きます 権 威 Cache DNS 共 に Stateless SLBを 採 用 してい る 事 業 者 もいますが Statefulより 圧 倒 的 に 少 数 Brocadeの 採 用 事 例 ですと Root DNS Serverにおい て Stateless SLB + Anycast DNS/BGPの 組 み 合 わせ で 使 用 されています 権 威 でもCache DNSでも そもそも LB 使 わないで サービスしているところも 結 構 多 いです 12
その 他 TIPSなど 13
LBのDNS Firewall 機 能 で 頑 張 る L7 DNS SLBのテンプレート SeverIronADX (config-csw-dns-rule-test)# ~~snip~~ query-dnssec-ok query-name query-rd-flag query-type ~~snip~~ <cr> Flag (の 一 部 ) を 見 たり その 結 果 によって 振 り 分 け 先 を 変 える rate limit をかける etc SeverIronADX (config-csw-dns-rule-test)#query-type DECIMAL dns-type-val a Address Record aaaa IPv6 Address Record cert Certificate Record cname Canonical Name Record dnskey DNS Key Record ds Delegation Signer ipseckey IPSEC Key Record key Key Record loc Location Record mx Mail Exchange Record ns Name Server Record nsec Next-Secure Record ptr Pointer Record rrsig DNSSEC Signature soa Start of Authority Record srv Service locator txt Text Record QNAME/QTYPE を 見 たり 14
Script Details Advanced L7 SLB 記 述 用 のスクリプト 言 語 での 例 Vulnerability Note VU#725188 ISC BIND 9 vulnerable to denial of service via dynamic update request use OS_UDP; use OS_SLB; sub UDP_CLIENT_DATA{ } $payload = OS_UDP::payload; $mydata = unpack( "b*", $payload); $mystring = substr ($mydata, 18, 4); if ($mystring == "0101" ) { OS_SLB::forward("30"); } else { OS_SLB::forward("40"); } LBのOpenScript 機 能 [kkono@ns1 ~]# iptables -A INPUT -p udp --dport 53 -j DROP -m u32 --u32 '30>>27&0xF=5' 15
DNSパケットの 作 り 方 wiresharkとhping3を 使 用 した 場 合 Follow UDP Streamを C Arrayで 表 示 root@ub00:~/testdns# vi korori.c #include <stdio.h> main( ) { FILE *fp; fp=fopen( korori.dns", "w"); fprintf(fp, "%c%c%c%c%c%c%c%c", 0x19, 0x00, 0x00, 0x00, 0x02, 0x29, 0x00, 0x00); fprintf(fp, "%c%c%c%c%c%c%c%c", 0x00, 0x00, 0xc8, 0x00, 0xd4, 0x5e, 0x25, 0x0f); fprintf(fp, "%c%c%c%c%c%c%c%c", 0x00, 0x06, 0x40, 0x4d, 0x00, 0x17, 0x45, 0xbb); fprintf(fp, "%c", 0x00); fclose(fp); } korori.c" [New] 12L, 350C written root@ub00:~/testdns# gcc korori.c root@ub00:~/testdns#./a.out root@ub00:~/testdns# iptables -A OUTPUT -p icmp --icmp-type port-unreachable -j DROP root@ub00:~/testdns# hping3-2 -p 53 -E korori.dns -d 25 10.210.40.1 -c 1 ちなみに 3-wayhandshakeが 必 要 なTCPだと python scapyを 使 ってます 16
Thank you! 17