matd

matd は,libpcaplibdnet を利用した MAT (MAC Address Translation) のためのユーザスペースデーモンで, Solaris と FreeBSD 上で動作確認しています.

ロードバランシング方法としてポピュラーな NAT (Network Address Translation) を用いた場合では,全パケットがロードバランサを通過することになるため ロードバランサがボトルネックとなってしまいかねませんが,MAT では戻りパケットはロードバランサを通過せずダイレクトにクライアントに 返ります(このため DSR (Direct Server Return) とも呼ばれます).

2ch の雪だるま作戦において,当初 MAT のために LVSFreeBSD 版 を用いようとしたもののカーネルパニックを繰り返すなど不安定だったため, その代替品として作られたのが matd です.ユーザスペースデーモンということで パケットが大量に押し寄せた場合に捌き切れるかが心配な点でしたが, 今のところ無難に動いているようです.

使用法など

ロードバランサに受付用仮想 IP アドレスを割り当てるとともに, 実処理する各サーバにも ARP が無効となる形で同一の仮想 IP アドレスを割り当てます (loopback I/F に対してその仮想 IP アドレスを割り当てる等).

matd コマンドラインオプション:

使用法: matd [-Fh] [-f cffile] [-n nthreads] [-s statfile]
        -f cffile: 設定ファイル [デフォルト: /etc/matd.cf]
        -F: フォアグラウンドで実行
        -h: ヘルプ表示
        -n nthreads: worker スレッド数
                [デフォルト: 0 (シングルスレッドモード)]
        -s statfile: SIGUSR1 で statfile に統計情報をダンプ
                [デフォルト: /dev/null]

matd.cf の例:

# tcp または udp
proto=tcp
# 仮想アドレス:ポート
listen=www.example.com:80
# パケット転送先と同一 LAN セグメントの I/F
output_if=iprb0
# パケット転送先(ホスト名,IP アドレス,または MAC アドレス)
# '=' でウェイト指定可(デフォルトは 1)
targets=www1.example.com,www2.example.com,www3.example.com=2

なお,matd では libpcap でパケットキャプチャするため, 例えば次のような ipf ルールでパケットを破棄する必要があります.

block in quick proto tcp from any to www.example.com port = 80