对多次ssh密码错误的IP进行防火墙拦截
来源:互联网 发布:17173天谕捏脸数据 编辑:程序博客网 时间:2024/04/30 07:07
对多次ssh密码错误的IP进行iptables drop
2008-08-07 13:03
#!/bin/bash
#
# 多次输入SSH密码不正确的IP被禁止
#
# Author cnscn <http://www.cnscn.org>
# Time: 2008-03-01 02:00
#####################设置######################
#是使用lastb还是使用/var/log/secure
isLastb=1
#是否调式(0:不调试 1:调试)
isDebug=0
#是否使用ipv6(0:不使用 1:使用)
ipv6=0
#最大错误次数
FailTimes=5
#ssh_scan_iptables.sh文件的路径
ssh_scan_iptables_path="/home/users/cnscn/script/ssh_scan_iptables.sh"
#ssh日志路径
ssh_log_path="/var/log/secure"
#本 程序 扫描出的结果日志
this_log_path="/var/log/messages"
#####################功能######################
#设置时区, 从而使日期输出为"Dec 28" 而不是 "12月 28"
export LC_ALL=UTC
#判断是使用lastb还是解析/var/log/secure
if [ $isLastb -eq 1 ]
then
#获取当前日期
hour=$(date +"%b %e");
#进行 扫描,并把IP地址输出成: 次数=IP 的格式
SCANNER=$(/usr/bin/lastb|grep -s "$hour"| grep -v "grep -s $hour" |awk '{print $3}'|sort|uniq -c|awk 'length($2)>7 {print $1"="$2}')
else
# 获取 1天内 secure 记录,统计 ssh 认证失败的 IP 和其 失败次数, 并用Iptables阻止之
SCANNER=$(awk 'BEGIN{ tm=strftime("%b %e",systime());} $0 ~ tm && /Failed password/ && /ssh2/ {print $(NF-3)}' "${ssh_log_path}" |sort|uniq -c |awk '{print $1"="$2;}')
fi
#对 扫描出的IP进行循环处理
for i in $SCANNER
do
#如果调试,则输出nums=xxx.xxx.xxx.xxx
if [ $isDebug -eq 1 ]
then
echo $i
fi
# 取认证失败次数
NUM=`echo $i|awk -F= '{print $1}'`
# 取其 IP 地址
if [ $ipv6 -eq 1 ]
then
#nums=::ffff:202.10.78.68
IP=`echo $i|awk -F= '{print $2}'|awk -F: '{print $4}'`
else
#nums=xxx.xxx.xxx.xxx
IP=`echo $i|awk -F= '{print $2}'`
fi
# 若其在失败次数超过 $FailTimes 次且之前没有被阻断过,那么添加一条 策略将其阻断,并记录日志
if [ $NUM -ge $FailTimes ] && [ -z "`/sbin/iptables -vnL INPUT|grep ${IP}`" ]
then
echo "/sbin/iptables -A INPUT -s $IP -j DROP"
/sbin/iptables -A INPUT -s $IP -j DROP
echo " ">> "${ssh_scan_iptables_path}"
echo "#"$(date +"%Y-%m-%d %H:%M:%S") >> "${ssh_scan_iptables_path}"
echo "/sbin/iptables -A INPUT -s $IP -j DROP" >> "${ssh_scan_iptables_path}"
#日志记录命令logger:无效选项 -- h
#usage: logger [-is] [-f file] [-p pri] [-t tag] [-u socket] [ message ... ]
logger -i -t "ssh_scan_crontab" -f "${this_log_path}" "$IP($NUM)..."
fi
done
###################End of Script#########################
[root@localhost 238_backup]# cat cnscn/sh/myiptables.sh
#!/bin/bash
#chkconfig: 345 85 15
#description: my iptables rules, which can auto run when system start
# This is a script
# Edit by liwei, cnscn
# establish a static firewall
# 网络接口
interdevice="eth0"
#端口
#21 ftp
#15022 sshd
#25 smtp
#53 named
#80 http
#110 pop3
#外界可以访问的端口
Open_ports="2401 17021 20 15022 80 25 53 110 30000:50000"
#可以外出的端口,其它端口都可以外出
Allow_ports="21 20 80 "
#清除所有以前设置的规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
#执行非法IP阻止规则
/home/cnscn/sh/ssh_scan_iptables.sh
#允许211.167.237.201, 防止自己输入错误而导致的IP被封锁
/sbin/iptables -I INPUT -s 211.167.237.201 -j ACCEPT
#定义每一个 网络接口规则
for eths in $interdevice ; do
#接受所有的,来源不是 网络接口$interdevice的数据(对不是eths端口则放行)
#iptables -A INPUT -i ! $eths -j ACCEPT
#定义外界可以访问的端口规则(--dport)
for Port in $Open_ports ; do
iptables -A INPUT -i $eths -p tcp --dport $Port -j ACCEPT
iptables -A INPUT -i $eths -p udp --dport $Port -j ACCEPT
done
#给不应该进入我们 机器的数据,一个欺骗性的回答
iptables -A INPUT -i $eths -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -i $eths -p udp -j REJECT --reject-with icmp-port-unreachable
done
#End of Script
#forbidden ping
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
已经有好几台服务器最近一直受到骚扰,地址来源于五湖四海.主要的方式是SSH 暴力破解,一直不断的尝试,日志逐渐庞大起来,这些可恶的小 臭虫们实在让人讨厌.
大部分情况下还是直接 扫描的22端口,于是简单的修改了一下端口,然后 筛选出日志中攻击的IP地址(我的日志极不规则,所以现在还没能想出特别好的 shell 筛选…….), 添加到iptables或者hosts.deny中. hosts.deny基本格式为 SERVICE_NAME : IP_RANGE : DENY , 服务名 : 单个IP或者IP段(ip/netmask) : DENY . DENY 为缺省的属性,可以省略.
先要检查sshd是否支持tcp_wrappers.用下面的方法,
1. [root@proxy_HUIXIAN log]# ldd /usr/sbin/sshd | grep libwrap.so
libwrap.so.0 => /usr/lib/libwrap.so.0 (0×0069a000)
有类似提示说明已经支持
2. 你也可以将 sshd : 127.0.0.1 : deny 添加到hosts.deny
#ssh localhost
ssh_exchange_identification: Connection closed by remote host
有这样的提示也说明已经支持
另外要养成定期查看完所有服务器的日志的习惯,但这可不是一件太轻松的事情.我们就需要用到日志查看工具–logwatch,这是很多发行版本都已经集成,我们可以修改设置让它把整理和筛选过的日志发到指定的MAIL中,每天需要做的事情就是打开你的信箱–我就专门在gmail申请了一个存放 系统日志的 MAIL,观察不同的服务器上的日志.例如RHEL AS4 中汽设置文件在 /etc/log.d/logwatch.conf ,每一项都有很详细的解释,主要修改
MAILTO = root 为 MAILTO = root , [url=mailto:serverlog.*@*.com]serverlog.*@*.com[/url],
Range = yesterday 选发送每个昨天的日志
Detail = High 日志详细等级,推荐最高等级10,
其余一般默认就可以,你也可以自己修改syslog.conf中的设置来满足你的对事件日志记录的要求,
{
这里提醒一下,要注意把 crond 守护服务开启,否则你只能傻傻等着,就是不会在你信箱中找到 系统发过来的日志.
#find /etc -type d -name ‘cron.*’ -ok ls -l {} \;
你用上面的命令可以看到在/etc/cron.daily 目录中看到 00-logwatch这个link指向 00-logwatch -> ../log.d/scripts/logwatch.pl ,
所以是需要开启crond
另:你会关系如果你的 系统中没有配置发件服务器怎么办,没有关系” mailer = /bin/mail ” , 系统的MAIL 程序可以帮你完成.
}
当日志很庞大的时候,即使你能很好的 筛选出攻击来源,每天手动的添加那些IP也够让你厌烦的.而用 DenyHosts 就可以自动完成检测日志,并且自动添加到hosts.deny中了,同时DenyHOSTS还会将结果 发到你的MAIL中.
DenyHosts 官方地址为 http://denyhosts.sourceforge.net/ ,至于详细的教程 网上很多了,就不再重复啦.自己摸索吧.
[root@localhost man8]# cat /etc/rc.d/init.d/cns_iptables.sh
#!/bin/sh
# /etc/init.d/cns_iptables.sh
#
# Starts the at daemon
#
# chkconfig: 345 96 5
# description: cns iptables
# processname: cns_iptables.sh
. /etc/init.d/functions
RETVAL=0
prog="cns_iptables"
start(){
if [ ! -f /var/lock/subsys/cns_iptables ]; then
echo -n $"Starting ${prog}: "
daemon /home/users/cnscn/script/cns_iptables.sh >/dev/null 2>&1
RETVAL=$?
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/cns_iptables
if [ $? -eq 0 ]
then
echo [OK]
else
echo [false]
fi
fi
return $RETVAL
}
stop(){
echo -n $"Stopping ${prog}: "
/etc/rc.d/init.d/iptables restart >/dev/null 2>&1
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/cns_iptables
if [ $? -eq 0 ]
then
echo [OK]
else
echo [false]
fi
return $RETVAL
}
restart(){
stop
start
}
reload(){
restart
}
status_at(){
status /home/users/cnscn/script/cns_iptables.sh
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
condrestart)
if [ -f /var/lock/subsys/cns_iptables ]; then
restart
fi
;;
satus)
status_at
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|status|condrestart}"
exit 1
esac
exit $RETVAL
#
# 多次输入SSH密码不正确的IP被禁止
#
# Author cnscn <http://www.cnscn.org>
# Time: 2008-03-01 02:00
#####################设置######################
#是使用lastb还是使用/var/log/secure
isLastb=1
#是否调式(0:不调试 1:调试)
isDebug=0
#是否使用ipv6(0:不使用 1:使用)
ipv6=0
#最大错误次数
FailTimes=5
#ssh_scan_iptables.sh文件的路径
ssh_scan_iptables_path="/home/users/cnscn/script/ssh_scan_iptables.sh"
#ssh日志路径
ssh_log_path="/var/log/secure"
#本 程序 扫描出的结果日志
this_log_path="/var/log/messages"
#####################功能######################
#设置时区, 从而使日期输出为"Dec 28" 而不是 "12月 28"
export LC_ALL=UTC
#判断是使用lastb还是解析/var/log/secure
if [ $isLastb -eq 1 ]
then
#获取当前日期
hour=$(date +"%b %e");
#进行 扫描,并把IP地址输出成: 次数=IP 的格式
SCANNER=$(/usr/bin/lastb|grep -s "$hour"| grep -v "grep -s $hour" |awk '{print $3}'|sort|uniq -c|awk 'length($2)>7 {print $1"="$2}')
else
# 获取 1天内 secure 记录,统计 ssh 认证失败的 IP 和其 失败次数, 并用Iptables阻止之
SCANNER=$(awk 'BEGIN{ tm=strftime("%b %e",systime());} $0 ~ tm && /Failed password/ && /ssh2/ {print $(NF-3)}' "${ssh_log_path}" |sort|uniq -c |awk '{print $1"="$2;}')
fi
#对 扫描出的IP进行循环处理
for i in $SCANNER
do
#如果调试,则输出nums=xxx.xxx.xxx.xxx
if [ $isDebug -eq 1 ]
then
echo $i
fi
# 取认证失败次数
NUM=`echo $i|awk -F= '{print $1}'`
# 取其 IP 地址
if [ $ipv6 -eq 1 ]
then
#nums=::ffff:202.10.78.68
IP=`echo $i|awk -F= '{print $2}'|awk -F: '{print $4}'`
else
#nums=xxx.xxx.xxx.xxx
IP=`echo $i|awk -F= '{print $2}'`
fi
# 若其在失败次数超过 $FailTimes 次且之前没有被阻断过,那么添加一条 策略将其阻断,并记录日志
if [ $NUM -ge $FailTimes ] && [ -z "`/sbin/iptables -vnL INPUT|grep ${IP}`" ]
then
echo "/sbin/iptables -A INPUT -s $IP -j DROP"
/sbin/iptables -A INPUT -s $IP -j DROP
echo " ">> "${ssh_scan_iptables_path}"
echo "#"$(date +"%Y-%m-%d %H:%M:%S") >> "${ssh_scan_iptables_path}"
echo "/sbin/iptables -A INPUT -s $IP -j DROP" >> "${ssh_scan_iptables_path}"
#日志记录命令logger:无效选项 -- h
#usage: logger [-is] [-f file] [-p pri] [-t tag] [-u socket] [ message ... ]
logger -i -t "ssh_scan_crontab" -f "${this_log_path}" "$IP($NUM)..."
fi
done
###################End of Script#########################
[root@localhost 238_backup]# cat cnscn/sh/myiptables.sh
#!/bin/bash
#chkconfig: 345 85 15
#description: my iptables rules, which can auto run when system start
# This is a script
# Edit by liwei, cnscn
# establish a static firewall
# 网络接口
interdevice="eth0"
#端口
#21 ftp
#15022 sshd
#25 smtp
#53 named
#80 http
#110 pop3
#外界可以访问的端口
Open_ports="2401 17021 20 15022 80 25 53 110 30000:50000"
#可以外出的端口,其它端口都可以外出
Allow_ports="21 20 80 "
#清除所有以前设置的规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
#执行非法IP阻止规则
/home/cnscn/sh/ssh_scan_iptables.sh
#允许211.167.237.201, 防止自己输入错误而导致的IP被封锁
/sbin/iptables -I INPUT -s 211.167.237.201 -j ACCEPT
#定义每一个 网络接口规则
for eths in $interdevice ; do
#接受所有的,来源不是 网络接口$interdevice的数据(对不是eths端口则放行)
#iptables -A INPUT -i ! $eths -j ACCEPT
#定义外界可以访问的端口规则(--dport)
for Port in $Open_ports ; do
iptables -A INPUT -i $eths -p tcp --dport $Port -j ACCEPT
iptables -A INPUT -i $eths -p udp --dport $Port -j ACCEPT
done
#给不应该进入我们 机器的数据,一个欺骗性的回答
iptables -A INPUT -i $eths -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -i $eths -p udp -j REJECT --reject-with icmp-port-unreachable
done
#End of Script
#forbidden ping
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
已经有好几台服务器最近一直受到骚扰,地址来源于五湖四海.主要的方式是SSH 暴力破解,一直不断的尝试,日志逐渐庞大起来,这些可恶的小 臭虫们实在让人讨厌.
大部分情况下还是直接 扫描的22端口,于是简单的修改了一下端口,然后 筛选出日志中攻击的IP地址(我的日志极不规则,所以现在还没能想出特别好的 shell 筛选…….), 添加到iptables或者hosts.deny中. hosts.deny基本格式为 SERVICE_NAME : IP_RANGE : DENY , 服务名 : 单个IP或者IP段(ip/netmask) : DENY . DENY 为缺省的属性,可以省略.
先要检查sshd是否支持tcp_wrappers.用下面的方法,
1. [root@proxy_HUIXIAN log]# ldd /usr/sbin/sshd | grep libwrap.so
libwrap.so.0 => /usr/lib/libwrap.so.0 (0×0069a000)
有类似提示说明已经支持
2. 你也可以将 sshd : 127.0.0.1 : deny 添加到hosts.deny
#ssh localhost
ssh_exchange_identification: Connection closed by remote host
有这样的提示也说明已经支持
另外要养成定期查看完所有服务器的日志的习惯,但这可不是一件太轻松的事情.我们就需要用到日志查看工具–logwatch,这是很多发行版本都已经集成,我们可以修改设置让它把整理和筛选过的日志发到指定的MAIL中,每天需要做的事情就是打开你的信箱–我就专门在gmail申请了一个存放 系统日志的 MAIL,观察不同的服务器上的日志.例如RHEL AS4 中汽设置文件在 /etc/log.d/logwatch.conf ,每一项都有很详细的解释,主要修改
MAILTO = root 为 MAILTO = root , [url=mailto:serverlog.*@*.com]serverlog.*@*.com[/url],
Range = yesterday 选发送每个昨天的日志
Detail = High 日志详细等级,推荐最高等级10,
其余一般默认就可以,你也可以自己修改syslog.conf中的设置来满足你的对事件日志记录的要求,
{
这里提醒一下,要注意把 crond 守护服务开启,否则你只能傻傻等着,就是不会在你信箱中找到 系统发过来的日志.
#find /etc -type d -name ‘cron.*’ -ok ls -l {} \;
你用上面的命令可以看到在/etc/cron.daily 目录中看到 00-logwatch这个link指向 00-logwatch -> ../log.d/scripts/logwatch.pl ,
所以是需要开启crond
另:你会关系如果你的 系统中没有配置发件服务器怎么办,没有关系” mailer = /bin/mail ” , 系统的MAIL 程序可以帮你完成.
}
当日志很庞大的时候,即使你能很好的 筛选出攻击来源,每天手动的添加那些IP也够让你厌烦的.而用 DenyHosts 就可以自动完成检测日志,并且自动添加到hosts.deny中了,同时DenyHOSTS还会将结果 发到你的MAIL中.
DenyHosts 官方地址为 http://denyhosts.sourceforge.net/ ,至于详细的教程 网上很多了,就不再重复啦.自己摸索吧.
[root@localhost man8]# cat /etc/rc.d/init.d/cns_iptables.sh
#!/bin/sh
# /etc/init.d/cns_iptables.sh
#
# Starts the at daemon
#
# chkconfig: 345 96 5
# description: cns iptables
# processname: cns_iptables.sh
. /etc/init.d/functions
RETVAL=0
prog="cns_iptables"
start(){
if [ ! -f /var/lock/subsys/cns_iptables ]; then
echo -n $"Starting ${prog}: "
daemon /home/users/cnscn/script/cns_iptables.sh >/dev/null 2>&1
RETVAL=$?
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/cns_iptables
if [ $? -eq 0 ]
then
echo [OK]
else
echo [false]
fi
fi
return $RETVAL
}
stop(){
echo -n $"Stopping ${prog}: "
/etc/rc.d/init.d/iptables restart >/dev/null 2>&1
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/cns_iptables
if [ $? -eq 0 ]
then
echo [OK]
else
echo [false]
fi
return $RETVAL
}
restart(){
stop
start
}
reload(){
restart
}
status_at(){
status /home/users/cnscn/script/cns_iptables.sh
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
condrestart)
if [ -f /var/lock/subsys/cns_iptables ]; then
restart
fi
;;
satus)
status_at
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|status|condrestart}"
exit 1
esac
exit $RETVAL
- 对多次ssh密码错误的IP进行防火墙拦截
- 对几次输入ssh密码错误的IP进行iptables drop
- 防火墙对于127.0.0.1地址的不进行拦截
- 多次密码错误,冻结登录
- SSH密码错误几次后封禁登录IP
- Ubuntu配置IP、SSH、防火墙
- 配置ssh无密码登陆的错误
- 对用户的密码进行加密
- 一段对密码进行加密的脚本
- 一段对密码进行加密的脚本
- 用户登录密码错误多次被锁
- nginx中对指定的IP不使用密码对区域外IP使用密码访问
- 对同一个数组进行多次初始化
- ssh, scp 不输入密码进行操作的方法
- spring security2中对url进行拦截的配置
- spring security2中对method进行拦截的配置
- 实现对未登录用户进行相关操作的拦截
- android怎样对webview加载的内容进行拦截修改
- [TEAP] HTML5简史
- Linux Vnc配置说明
- GlusterFS可靠性计算
- 利用MSXML解析XML文本(转)
- 传统线程同步通讯技术
- 对多次ssh密码错误的IP进行防火墙拦截
- myEclipse设置
- 编译launcher问题
- 架构师的职责
- 如何删除windows服务
- OpenGL源代码之五绘制3D图形
- 进程间通信
- Android4: 旋转屏幕时禁止Activity重启
- 使用BackgroundWorker