特定のポートに自動で繰り返しアクセスしIDやPASSを盗もうとする行為が日常的に起きています。
これは気付かなくてもネットに繋いでいる以上はどなたも経験されていることです。
通常利用ではルーター経由であればフォワーディングの宛先が無いのでパケットが破棄され特に問題はありません。
(偽装パケットだと問題になります)
ここで問題になるのはサーバーを公開されている方です。
サーバーをルーターの外側に設置するのはもちろんですが
静的NATで特定のポートを公開している場合も注意が必要です。
試しにsshのポートを開けてみるとかなりのアタックがあることがログから分かると思います。
IPフィルターでアタックの多い国のアクセスを遮断すればかなり減りますが
それでもアタックの形跡はログに残ったりします。
これらのアタックをiptablesでブロックするのが今回の目的です。
時間当たりのアクセス回数で制限する為にiptablesのrecent機能を使います。
※以下のサイトを参考に設定しました。
Netfilter Extensions HOWTO: New netfilter matches
基本的な構文は以下のように書くようです。
# iptables -A FORWARD -m recent –name badguy –rcheck –seconds 60 -j DROP
# iptables -A FORWARD -p tcp -i eth0 –dport 139 -m recent –name badguy –set -j DROP
オプションの説明を読んでみると色々と説明が書いてありますね。
自分の環境に合わせて書き換えてみましょう。
iptables -A INPUT -p tcp -i eth1 –dport 22 -m recent –name SSH -m state –state NEW –set
iptables -A INPUT -m recent –name SSH -i eth1 -p tcp –dport 22 -m state –state NEW –update –seconds 60 –hitcount 6 –rttl -j DROP
この設定内容はeth1デバイスのTCP22番ポートへ60秒間に6回以上アクセスがあったホストを拒否するようになっています。
–name SSH ルールの名前は他のルールと重複しない名前ならなんでも良いようです。
-iオプションのeth1と書いてある部分は自分の環境のWAN側に接続されているデバイスに書き換えます。
–dport 22 の22は規制の対象とするポートを指定します。
–seconds 60 最後のアクセスからログをさかのぼる秒数の範囲を指定します。つまり「○秒間の間に」となります。
–hitcount 6 上の–secondsで設定した時間ログの中に何回以上ヒットするものを対象にするかを指定します。
これは一度実行してもrebootすると設定は消えてしまいます。
他のiptablesの設定と同じように起動時等に実行されるように設定を行って下さい。
※個人的には起動時にスクリプトで読み込んでますがiptablesの設定を一括して
iptables-save、iptables-restoreなどで行っても良いと思います。
最後に・・・
この機能ではゆっくりと繰り返されるアタックには対応出来ません。
他の機能と組み合わせてセキュリティを高めることで高い効果を発揮出来る機能だと思います。