Limiting closed port RST response from
No:111 Time[2007-12-26 15:02:57]
突然、

Limiting closed port RST response from

なるエラーがたくさんでるようになった。
これは何ぞやと調べると、どうも秒間当り、デフォルトで200のICMPアクセスがあるものは攻撃とみなして
カーネルがポートを閉じてくれているよというものである。
では、どういう時そういったことがおこるのか?
という問題ですが、よくあるのは、ポートスキャンであるようですね。
ICMPのデファルトがいくつなのか調べるのは

sysctl -a | grep icmplim

とすれば確認できます。中にはこの問い合わせが原因でサーバーがクラッシュすることも
あるので、その場合は値を小さくして、ポートを早めに閉じさせることも検討できます。
その場合は、

sysctl -w net.inet.icmp.icmplim=100

等とすると秒間100回でポートを閉じてくれます。

再起動しても反映させたい場合は

vi /etc/sysctl.conf
net.inet.icmp.icmplim=100

と記載すればいいのですが、この値、決して小さくすればいいというものではありません。
そもそも、ポートスキャンやping等に答えないほうがセキュリティはあがりますよね。
ping連打をされればそれはもう攻撃ですし、まあ、そもそもこの時点で何が原因かなんてのは
ログすら取っていないわけですからわからないわけです。
ではどうすればいいか?

まず、用意するのはnmap、ポートスキャン用のソフトを何でもいいのでwindows
マシンにダウンロードして自分の管理するサーバーに向けてポートスキャンしてみましょう。
すると結構ポートが使われていることがわかるわけです。

http://insecure.org/nmap/man/jp/

尚、このソフトはそもそもは自分の管理サーバーに穴がないかをチェックするための物ですから
windows版をダウンしてサーバーアドレスを入れるだけです。間違っても他人のサーバーに向かって
行わないことをお勧めします。場合によっては怒られますよ。

そして、次にサーバーにファイアーウォールを入れて、ログの収集といらないポート(pingの応答等)を
閉じたいと思います。
私は、freebsd環境なので、IPFilterを使うことにしました。
まず、カーネルに

options IPFILTER
options IPFILTER_LOG
options IPFILTER_DEFAULT_BLOCK

を追加してコンパイルしなおしてください。

次にrc.confに
ipfilter_enable="YES" # Set to YES to enable ipfilter functionality
ipfilter_program="/sbin/ipf" # where the ipfilter program lives
ipfilter_rules="/etc/ipf.rules" # rules definition file for ipfilter, see
ipmon_enable="YES" # log
ipmon_flags="-D /var/log/ipflog"
ipfilter_flags="" # additional flags for ipfilter

等といれればOKです。

次にルールファイルを作らないといけません。
まず

cd /usr/src/contrib/ipfilter/
perl mkfilters | grep -v inet6 > /etc/ipf.rules

で簡単な物は作ってくれます。後は個々に必要なものを設定していくわけですが、
下記を上でできたファイルに追加すればOKだと思います。

pass in quick on lo0 all
pass out quick on lo0 all

pass in quick proto tcp from any to xxx.xxx.xxx.xxx/32 port = 80 flags S/SA keep state
pass in quick proto tcp from any to xxx.xxx.xxx.xxx/32 port = 443 flags S/SA keep state
pass in quick proto tcp from any to xxx.xxx.xxx.xxx/32 port = 21 flags S/SA keep state
pass in quick proto tcp from any to xxx.xxx.xxx.xxx/32 port = 22 flags S/SA keep state
pass in quick proto tcp from any to xxx.xxx.xxx.xxx/32 port = 25 flags S/SA keep state
pass in quick proto tcp from any to xxx.xxx.xxx.xxx/32 port = 587 flags S/SA keep state
pass in quick proto tcp from any to xxx.xxx.xxx.xxx/32 port = 110 flags S/SA keep state
pass in quick proto udp from any to xxx.xxx.xxx.xxx/32 port = 53 keep state

pass out quick proto tcp/udp from any to any keep state
pass out quick proto icmp from any to any keep state
block in log quick all
block out quick all

xxx.xxx.xxx.xxxは自分のサーバーにしてください。
完成したら、反映させます。がこのとき、設定がまずいと、特にリモート操作している場合はコンソールの
受付もしなくなるので十分注意してください。

ipf -Fa -Z -f /etc/ipf.rules


尚、ここではHP、SSL、ftp、SSH、SMTP、POP、DNS及び、中から外へのICMP問い合わせを許可した上で他を禁止しています。
したがって、NMAPでスキャンしても、許可されている以外のものは出てこなくなりますし、
pingにたいしても応答しなくなります。ログにはブロックと同時にログが残されます。

上の設定でセキュリティ的にはいいのですが、apacheのログからなどから該当のipを遮断したい場合などは、

block in log quick from xxx.xxx.xxx.xxx/32 to any

と書けばいいわけですが、サブネットマスクである程度のIPの幅を持たせて制御すれば、プロバイダなどでころころIPが変わる場合
には有効です。が、あまりやりすぎるとアクセスが全くなくなっていまいますし、SEO的にいうと遮断することはお勧めできません。