document

ipfw(8)+dummynet(4)の
ススメ
Masuda,Masashi
[email protected]
http://unixluser.org/
自己紹介
197?年東京都大田区六郷で生まれる。
千葉県松戸市で小学→大学時代をすごす。
小学生のころNEC PC-8801mkIISR を親に買ってもらう。
某月刊パソコン雑誌の投稿者コーナで道を踏み外す。
大学生1年の夏休みの時にバイトしていたアキバ某店で
でいわゆるDOS/V に出会う。
友人から譲り受けたPC-9801U2 でFreeBSD(98) をはじ
めて使う。
某ネットワーク機器販売会社に就職。
入社後8ヶ月経たずになぜかいきなりroot ・ネットワーク
管理の全権が降ってくる。
ipfw との出会い
以下の要件を満たすネットワークをquick に作る
必要


The Internet に接続は必要けど従来のユーザの帯域
を食われるのは困る
WEB・DNS は接続必要だけど他のサーバ&ネット
ワークセグメントにアクセスできるのは困る。
上記ニーズをお金を掛けずに実現
当時Open/BSD方面でのipfliter 周りのごたご
た?があったのでipfw を使うことに。
今日の内容
ipfw 超基本
ipfw のstatefull filtering
ipfw + dummynet(4) でのWF2Q+
その他 tips
natd(8) 絡みは良くわからんのでパス
ipfw を使うには(1)
kld(4) つかう方法

kldload /modules/ipfw.ko &
kernel コンパイル時に組み込む

options
IPFIREWALL
ipfw を使うには(2)
/etc/rc.conf で起動時に有効にする。
firewall_enable="YES"
firewall_script="/usr/local/etc/rc.firewall"
firewall_script の実態はただのshell script
ipfw の文法とか
詳しいことはipfw のman を参照のこと
# 特にBUGS セクションは重要 ;-)
CiscoのACLと同じでFirst matching rule

基本的にルールにマッチしたらアクションに
従ってパケット処理→終了
Sample config is /etc/rc.firewall
ipfw でのstatefull
filtering(1)
基本的にはこんな感じ
ipfw add check-state
ipfw add allow tcp from myip to any setup keep-state \
out xmit myif
ipfw add deny all from any to any
ipfw でのstatefull
filtering(2)
Statefull filtering とは

(主にTCP の)セッションの状態に応じてフィルタリング

ルールマッチングしても正常なセッションではないパケットは
除外
Stateless filtering

セッションの状態に関わり無く、ルールマッチングのみ
でfiltering
ipfw でのstatefull
filtering(3)
Tips?

UDP/ICMP もstatefull filtering できる。
例)
ipfw add allow udp from myip to nsip 53 \
keep-state out xmit myif
ipfw add allow icmp from myip to any \
keep-state out xmit myif
ipfw でのstatefull
filtering(4)
Tips?

Release 4.5 から ipfw –a l ではダイナミック
ルールは表示されなくなった。 ipfw –d l で出
る。
limit

ipfw add allow tcp from any to me 80 \
setup limit src-addr 4
ipfwのstatefull filtering
関連のsysctl 変数
net.inet.ip.fw.dyn_ack_lifetime

300sec(default)
net.inet.ip.fw.dyn_syn_lifetime

20sec(default)
net.inet.ip.fw.dyn_fin_lifetime
net.inet.ip.fw.dyn_rst_lifetime

1sec(default)
net.inet.ip.fw.dyn_short_lifetime

30sec(default)
net.inet.ip.fw.dyn_udp_lifetime

5sec(default)
ipfw+dummynet
pipe
仮想的な通信経路
 帯域・パケットロスト率等々設定可能

queue
WF2Q+ の実装
 REDもつかえる
 queue をpipe でまとめることも可能

W2FQ+
WFQ の改良ver?
FIFO ではバーストトラフィックに占有される
のをトラフィックフローごとに重み付け(weight)
をつけ比較的公平(fair)に待ち行列処理
(queuing)されるようにした→WFQ
 (参考:
http://www.cisco.com/warp/public/732/Tech
/wfq/)

ipfw+dummynet での
WF2Q+(1)
ssh(tcp/22)とdns(udp53)のプライオリティ最高・
http(tcp/80)は中・その他は最低

ipfw add queue 1 tcp from me 22 to any
ipfw add queue 1 udp from me 53 to any
ipfw add queue 2 tcp from me 80 to any
ipfw add queue 3 ip from me to any
ipfw queue 1 config weight 50 pipe 2
ipfw queue 2 config weight 30 pipe 2
ipfw queue 3 config weight 10 pipe 2
ipfw pipe 2 config bw 256kbit/s
ipfw+dummynet での
WF2Q+(2)
dst-net /28 毎にdynamic queue を生成す
る。

ipfw queue 1 ip from me to any
ipfw queue 1 config weight 50 pipe 1 \
mask dst-ip 0x0000000f
ipfw pipe 1 config bw 1Mbit/s
ipfw+dummynet での
WF2Q+(3)
応用

ipfw add queue 1 tcp from me 22 to any
ipfw add queue 1 udp from me 53 to any
ipfw add queue 2 tcp from me 80 to any
ipfw add queue 3 ip from me to any
ipfw queue 1 config weight 50 pipe 2
ipfw queue 2 config weight 30 pipe 2 mask dst-ip \
0x00000f
ipfw queue 3 config weight 10 pipe 2
ipfw pipe 2 config bw 256kbit/s
ipfw+dummynet での
WF2Q+(4)
tips

pipe を通した後にさらにfirewall rule にhit さ
せたい場合
sysctl net.inet.ip.fw.one_pass =0
ipfw tips?(1)
デバッグhints



ipfw add 65534 pass log all from any to any
/var/log/security をじっと眺める。
パケットの気持ちになって考える。;-)
Auth/IDENT(tcp/113) の罠


ipfw add reset tcp from any to myip 113 setup
Deny しないほうが幸せになれます。
詳しくは http://unixluser.org/techmemo/ident/
ipfw tips?(2)
skipto アクションでの条件分岐も出来る

使い道思いつきませんでした。;-)
prob x で x%だけ反応する

ipfw add prob 0.3 allow icmp from any to me \
icmptype 8
ipfw tips?(3)
fwd でのpolicy routing

isp1 から 10.1.1.0/29 isp2から10.2.1.0/29
割り当てがあり両方のisp につながる形で
multihome する場合(FreeBSD-users-jp
66354)

ipfw add fwd 10.1.1.1 ip from 10.1.1.2 to \
not 10.1.1.0/29
ipfw add fwd 10.2.1.1 ip from 10.2.1.2 to \
not 10.2.1.0/29
ipfw tips?(4)
Firewall としてがちがちに固めたい人に




/etc/rc.conf でkern_securelevel="3"
万が一Firewall Box に侵入されても稼動中のruleset
の追加変更は不可能(see man init)
Ruleset 変更するにはマシンリブート以外には無い
ある程度設定がfix したらsecurelevel= “3” にするの
がいいのかも。
参考URLs
"Firewall 構築ガイド"

<URL:http://www.tac.tsukuba.ac.jp/~hiromi/firewall.html>
"Luigi Rizzo -- home page"

<URL:http://info.iet.unipi.it/~luigi/>
"QoS :Overview of Packet Scheduling"

<URL:http://www.nanog.org/mtg-9811/ppt/wabik/>
"Implementation of Worst-case Weighted fair
Queueing (wf2q+)"

<URL:http://www-2.cs.cmu.edu/~cheeko/wf2q+/>
"Hierarchical Packet Schedulers"

<URL:http://www-2.cs.cmu.edu/~hzhang/HFSC/>
おわり