iptablesのオプションは間違うとひどいことになりますが、うまく動くと素晴らしい。わずか2行でsshへの総当り攻撃を防ぐことが出来る方法。知っている方には何をいまさらですが、不勉強な私は知りませんでした。ネタは以下のリンクです。
自宅サーバを立ち上げている方やサーバ管理をされている方は一度や二度はsshへの総当り攻撃を見たことがあると思います。私のところではログインする元がほぼ決まっているので/etc/hosts.allowにSSHで接続を許可するホスト/ネットワークを指定しており、これでほとんど問題ありません。
それでも一日100回以上アタックの形跡が残っています。もしポートが開いていると辞書攻撃などをガンガンかけてきてくれてうっとうしいことこの上ありません。そこで以下のようなiptablesの設定で繰り返しアクセスのあるサイトを締め出すことが出来ます。
Ubuntu/Debian系
# iptables -A INPUT -ieth0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP
iptablesに上のルールを追加することで過去60秒間に8回以上SSHポートに接続を試みたIPアドレスを拒否する設定になります。詳しくは上のリンクにUbuntuでの解説があります。
Redhat/Fedora/CentOS系
Redhat系(Fedora/CentOS含む)では/etc/sysconfig/iptablesのsshの設定の前あたりに以下の2行を追加して"/etc/init.d/iptables restart"すればいいと思います。
/etc/sysconfig/iptables:
-A RH-Firewall-1-INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP
hosts.allow/denyでの拒否
もう少しお手軽で、セットでやると効果的な/etc/hosts.allow/denyの例。これだけでもずいぶんと違います。iptablesで同じことを設定してもいいのですが、ドメインでの指定も出来るので便利です。考えたらこちらも2行ですね。自分の許可した範囲からのアタックは防げませんが、海外からのものは十分防いでくれます。
/etc/hosts.allow:
/etc/hosts.deny:
ドキュメントなど
ネットフィルターにあるrecentフィルタの説明。
浦島気分で軽く読んでみるといろいろモジュールが増えてますね。このrecentの持っているテーブルをうまく操作できたら、メールのスパム送信元やトラックバックスパマーの連続送信を蹴ることも出来そうなんですが。 後はlimitフィルタで激しいCrawlを拒否とか。
他の方法
元記事のコメントを見ると、下のDenyHostsというスクリプトがいいよとかあります。これはsshのログからアタックしてきた情報を集めて/etc/hosts.denyを使ってアクセス拒否するようです。同期モードでは中央のサーバと拒否リストを共有したりも出来るようです。少し大掛かりそうなので試していませんが。
他にも元記事コメントにはsshのポートを変えると0dayアタックにも耐えれるよとか(まあ当たり前か)いろいろサジェスチョンがあります。一読されればいいかもしれません。