2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

FreeeBSDポートスキャンによるICMPパケット連打を制限する!

以下のような、ログがあった。これは、ポートスキャンをされたことによりカーネルが吐きだしたログである。
FreeBSDの場合は、リアルタイムに画面にログがはき出されるので気がつくのが早い(笑)。 ちょっと気になるので、詳細を調査してみた。


Jan 8 10:05:53 ns /kernel: Limiting closed port RST response from 334 to 200 packets per second
Jan 8 10:05:55 ns /kernel: Limiting closed port RST response from 328 to 200 packets per second
Jan 8 10:05:56 ns /kernel: Limiting closed port RST response from 333 to 200 packets per second
Jan 8 10:05:57 ns /kernel: Limiting closed port RST response from 335 to 200 packets per second
Jan 8 10:05:58 ns /kernel: Limiting closed port RST response from 336 to 200 packets per second
Jan 8 10:05:59 ns /kernel: Limiting closed port RST response from 338 to 200 packets per second
Jan 8 10:06:00 ns /kernel: Limiting closed port RST response from 342 to 200 packets per second
Jan 8 10:06:01 ns /kernel: Limiting closed port RST response from 291 to 200 packets per second


1.メッセージの調査
# cd /sys
# grep ‘Limiting closed’ */*.[ch]
netinet/ip_icmp.c: “Limiting closed port RST response”,

# vi netinet/ip_icmp.c
badport_bandlim と言う関数がこのエラーを報告している。この関数では、if文で連続パケットが200を越えると捨てる処理をしてる。200がlimitである事は次の変数宣言でわかる。
static int icmplim = 200;


2.結果
結果的に200パケットの設定になっているため、もっとパケットの数を少なくして捨てるようにすれば無駄な連打を我慢せずにすむのではなかろうか?さらに、落ちる可能性も低くなる。このような考えから、連続パケット50に設定することにした。

# sysctl -a | grep icmplim
net.inet.icmp.icmplim: 200
net.inet.icmp.icmplim_output: 1

# sysctl -w net.inet.icmp.icmplim=50
net.inet.icmp.icmplim: 200 -> 50

limitを少なくすることにより、早めにブロックするのでパケット連打されても落ちる可能性は少ない。 rebootしてもこの設定を反映したいなら、/etc/sysctl.confに書いておく。

# vi /etc/sysctl.conf
net.inet.icmp.icmplim=50

以上

コメント