ipt_recent

補足:いまならrecentじゃなくてhashlimitを使った方がよさげ。
以下の文章はrecentについてなので、hashlimitについて追記した id:hirose31:20060421 を見てもらった方がいいと思うす。


SSHのbrute forceアタックがうざいので、iptablesで悪い子はDROPするようにする。

  • OpenSSHのログをみて、
  • 一定時間に一定回数連続でアクセスに失敗しているやつはDROPするようにして、
  • atで然るべき時間が経ったら解除するように

しようかなぁと思ったら、iptablesにはipt_recentなんて便利がものがあるのがわかった。

↑を参考にして設定したのの抜粋はこんなかんじ。

iptables -N block_ssh
iptables -N ssh
iptables -A INPUT -j ACCEPT -s 信頼できるIPアドレス
iptables -A INPUT -j ssh    -p tcp --dport 22

# SSH brute force アタックを拒否する
# /proc/net/ipt_recent/*
iptables -F block_ssh
iptables -A block_ssh -m recent --name block_ssh --set \
    -j LOG --log-level DEBUG --log-prefix "block_ssh "
iptables -A block_ssh -j DROP

iptables -F ssh
## syn 以外のパッケットは許可
iptables -A ssh -p tcp ! --syn -m state --state ESTABLISHED,RELATED -j ACCEPT
## 攻撃者は10分間拒否し続ける
iptables -A ssh -p tcp --syn -m recent --name block_ssh \
    --update --seconds 600              -j REJECT
## 1分間に5回アクセスがあった場合は攻撃者と見なす
iptables -A ssh -p tcp --syn -m recent --name syn_ssh   \
    --rcheck --seconds 60  --hitcount 5 -j block_ssh
## syn パケットを記録
iptables -A ssh -p tcp --syn -m recent --name syn_ssh --set

iptables -A ssh -p tcp --syn -j ACCEPT

はまったのは、

  • Debian woodyのiptables 1.2.7aは古いらしく、-m recentの--nameが効かなかった。
    • → --name block_sshもsyn_sshもデフォルト名のDEFAULTになってしまった。
    • → なので、1回アクセスするとマークされて、2回目からブロックされてしまった。orz
    • iptables 1.3.3にしたらちゃんと動くようになった。

s/blute/brute/gしました。ありがとうございますー>ifさん