iptables 模块 recent 防止字典暴力、port scan 攻击

http://cha.homeip.net/blog/archives/2008/03/iptables_recent.html
http://hahahaha.cc/?p=76
http://www.ducea.com/2006/06/28/using-iptables-to-block-brute-force-attacks/
http://www.snowman.net/projects/ipt_recent/
解决具体问题:限制 ssh 猜密码,对每个 IP 允许三分钟内允许有 5 次 TCP 的 NEW 请求
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ROUTER-SSH --update --seconds 180 --hitcount 10 -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ROUTER-SSH --set -j ACCEPT

iptables recent module 操作备忘
?    同一个 IP 来源在一个小时内只允许建立(或尝试)五次 SSH 联机
?    建立解除封锁的后门
?    /proc/net/ipt_recent/* 清单
同一个 IP 来源在一个小时内只允许建立(或尝试)三次 SSH 联机
iptables -A INPUT -p tcp --dport 22 --syn -m recent --rcheck --seconds 3600 --hitcount 3 --rttl --name SSH --rsource -j DROP
iptables -A INPUT -p tcp --dport 22 --syn -m recent --set --name SSH --rsource -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
注: 请注意 rule 顺序: 先设置 recent 条件 -j DROP, 再设置 recent --set -j ACCEPT
建立解除封锁的后门
#留下解锁的记录
iptables -A INPUT -p tcp --dport 1600 --syn -j LOG --log-prefix "SSH_CONN_UNLOCKED "
iptables -A INPUT -p tcp --dport 1600 --syn -m recent --remove --name SSH --rsource -j REJECT --reject-with icmp-host-unreachable
使用方法: telnet linux.host 1600
注: 以上 tcp 1600 port 可以改成任一个未使用的 tcp port
/proc/net/ipt_recent/* 清单
若未设定 --name 则预设为 DEFAULT
#把某 IP 加入 DEFAULT 记录清单
echo xx.xx.xx.xx > /proc/net/ipt_recent/DEFAULT
#把某 IP 从 DEFAULT 清单移除
echo -xx.xx.xx.xx > /proc/net/ipt_recent/DEFAULT
#清空 DEFAULT 清单
echo clear > /proc/net/ipt_recent/DEFAULT