ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

[FreeBSD] ipfw の動的フィルタを使う時の注意点

http://d.hatena.ne.jp/Hossy/20090820/p1
この辺に書いたように動的ルールを適用するときは、
TCP/IPタイムアウト関係の設定を少し調整する必要があります。


デフォルトのままだと、負荷が高くなった時に FIN が届く前に ipfw ルールが閉じてしまい、
LAST_ACK とか WAIT_FIN とかの状態のままタイムアウト待ちになるソケットが量産されて、
一種の DDoS に似た状態になります。


netstat -a とかで存在しているソケットを眺めてみると、WAIT_FIN のソケットが大量にあり、
しかもそれぞれ相手先の IP がばらばらだったので、「DDoSか??」と一瞬焦りました。
まぁ、理由が分かれば大したことはないんですが……


さて、対策は非常に簡単で、/etc/sysctl.conf に以下の文を書きくわえてタイムアウトを長くします。

net.inet.tcp.finwait2_timeout=15000
net.inet.tcp.fast_finwait2_recycle=1
net.inet.ip.fw.dyn_max=65535
net.inet.ip.fw.dyn_fin_lifetime=15

割と負荷の低いことが多いマシンなら、こんな感じにかなり緩くしても結構大丈夫みたい。
負荷が高いマシンならもっとちゃんとチューニングしましょう。