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 Radware

Alteon4released

Bought by Nortel Networks
Gigabit Ethernet NIC
Jumbo Frame
2000

founded in 1996

2009

2010

founded in 1997

1997

Local Director

1998

founded in 19963

Load Balancerとは復習

4つの基本機能• 負荷分散機能• アドレス変換機能(MACとIP)• ヘルスチェック機能• セッション維持機能

Virtual Server
DNS
Real Server1

VIP Load Balancer
SLB

DNS
Real Server24ネットワーク構成

復習

IN LINEとDSRのPACKET Walkthrough

Client208.46.221.240

Client208.46.221.240

IN LINE構成

１４１

DSR構成
FOUNDRY

ServerIronGT EGx2

NETWORKSWSMM2CPU CPU CPU
112PwrConsole

TxAct
RxAct
Active

BxG

Link

1

FOUNDRY

ServerIronGT EGx2

NETWORKSWSMM2CPU CPU CPU
112PwrTxAct
RxAct
ActiveBxG

Link

1Active2

LB

ConsoleServerIron
Mgmt: 208.46.221.228
Gw: 208.46.221.225
VIP: 208.46.221.230

Server02
192.168.0.102

2

LB

ServerIron
Mgmt: 208.46.221.228
Gw: 208.46.221.225
VIP: 208.46.221.230
server source-ip 10.229.0.254

２Server01
192.168.0.101

Activevlantag

３L3-Switch

２

３Server01
10.229.0.206
Loopback
208.46.221.230

Server02
10.229.0.207
Loopback
208.46.221.230
5

TOS Bit L3 DSR構成

ここ3年の話PACKET Walkthrough

ClientTOS

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

208.44.1.200

L3-Switch

４２１

L3-Switch

FOUNDRY

ServerIronGT EGx2NETWORKS
CP CP CPU1 U1 U2

WSMM2

L2-Switch

３

L3-Switch

Active

BxG

Link

1

Server01
58.81.111.249
Loopback
144.49.0.250

Active2ServerIron
Mgmt: 144.49.0.222
Gw: 144.49.0.4
VIP: 144.49.0.250

３Pwr

TxAct
RxAct

Consoleserverの iptable rewrite ruleで宛先を144.49.0.250に変更
FreeBSD用のReference module
は、Yahoo!が公開している。

Server02
58.81.111.250
Loopback
144.49.0.250
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モードパフォーマンス(IXIAでの実測値)
セッション
テーブルの作成
コネクションコントロール
DNS Firewall
統計情報の表示DNSSEC対応

Stateful SLB

Stateless SLB

普通55万 qps
(ADX1000を使用)する

高速225万 qps(ADX1000を使用)
しない

可能

不可

Queryの中を精査

不可

あり
なし
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-okquery-namequery-rd-flagquery-type~~snip~~<cr>

Flag (の一部) を見たりその結果によって、
 振り分け先を変える rate limit をかける etc…

SeverIronADX (config-csw-dns-rule-TEST)#query-type
DECIMAL
dns-type-val
aAddress Record
aaaa
IPv6 Address Record
cert
Certificate Record
cnameCanonical Name Record
dnskeyDNS Key Record
dsDelegation Signer
ipseckey
IPSEC Key Record
key
Key Record
locLocation Record
mx
Mail Exchange Record
nsName 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

L7 SLB記述用のスクリプト言語での例

Script Details – Advanced

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