iptablesで総当たり攻撃を止める

サーバをインターネットに公開していると、一日に何百回となくsshで不正アクセス攻撃が来る。RSA鍵がないとsshできないようにしているのでパスワードの総当たり攻撃(ブルートフォース攻撃)は効かないのだが、ログファイルが肥大化するし気持ちのいいものはない。iptablesのrecentオプションでそういった通信を遮断することができるらしいので、試してみる。

CentOSではiptablesの設定は/etc/sysconfig/iptablesにある。その中に従来のsshを許可する行も記述されているが、その直前に下記のようなrecentを含んだ2行を追加する。

-A RH-Firewall-1-INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
-A RH-Firewall-1-INPUT -p tcp --dport 22 -m state --state NEW -m recent --rcheck --seconds 60
 /--hitcount 5 --name SSH -j DROP
-A RH-Firewall-1-INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

1行目では、tcpの22番ポートに接続してきた新規通信のソースIPをSSHという名前のテーブルに載せる。既にSSHテーブルに同じソースIPがあった場合はアップデートする。この行には-j ACCEPT(許可)も-j DROP(破棄)もないので、次の行へ行く。

2行目では引き続き同じ通信を扱う。このソースIPが過去60秒間に5回以上アクセスをして来ている場合、-j DROPで破棄される。

3行目では、2行目で破棄されなかった場合に-j ACCEPTで許可される。もともとあった単なる許可設定である。

上記のように書き換えてservice iptables reloadとすると反映される。iptables -Lで動作状態を確認する。

[root@ml115 ~]# iptables -L 
target  prot opt source    destination 
...
        tcp  --  anywhere  anywhere  tcp dpt:ssh state NEW recent: SET name: SSH side: source 
DROP    tcp  --  anywhere  anywhere  tcp dpt:ssh state NEW recent: CHECK seconds: 60 hit_count: 5 name: SSH side: source 
ACCEPT  tcp  --  anywhere  anywhere  tcp dpt:ssh state NEW 
...

上記のSSHというテーブルは/proc/net/ipt_recentに記録されている。さっそく引っかかっていた。

[ishii@ml115 ~]$ cat /proc/net/ipt_recent/SSH
src=221.143.x.x ttl: 111 last_seen: 4490427483 oldest_pkt: 1 4490427483