ファイアウォールpfの制限設定

pfはルールが書きやすく巨大なテーブルを扱えてしかも結構高速なので使いやすいファイアウォール。高いレイヤーまで見ないけど。
pfがあるからFreebsd/OpenBSDをネットワークのファイアウォールに専用で使いたい(使っている)ってくらい。

で、インターネットとの境界にあるファイアウォールだとわけのわからないのも含めて膨大な接続を面倒見なきゃならないんだけどpfの標準設定では制限値を超えてしまうことがある。よく目にするメッセージは下みたいなの。

+[zone: pf states] PF states limit reached

pfの制限値を確認するのは以下。

# pfctl -sm
states        hard limit    10000
src-nodes     hard limit    10000
frags         hard limit     5000
table-entries hard limit   200000

上はFreeBSD10.3のpfの標準値。statesの上限が10000は用途によってはちょっと小さすぎるかと。
テーブルのエントリ数は20万ということで普通に使うには十分。
なのでstatesの制限値を変更。
/etc/pf.confの先頭あたりにでも以下を追加。ついでにタイムアウトも設定。

set limit states 40000                  #statesだけ変更する場合
set limit { states 40000, frags 20000 } #statesとfragsを変更する場合
set timeout { adaptive.start 24000, adaptive.end 48000 }
set timeout tcp.established 43200       #半日(秒)

adaptive.start, adaptive.endは触らなくても良いかも。
基本値はadaptive.startはstatesの値の60%、adaptive.endはstatesの値の120%。