对多次ssh密码错误的IP进行防火墙拦截

 
对多次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
<think>好的,我现在要解决用户提到的SSH连接Linux服务器时无法输入密码的问题。首先,我需要回忆一下可能的原因以及对应的解决方法。这个问题比较常见,可能涉及多个方面,比如SSH服务配置、网络设置、客户端问题等。让我一步步理清楚思路。 首先,用户遇到的情况是,在SSH登录时,输入密码的环节无法键入,或者输入后没有反应。这可能表现为光标不动、没有提示,或者直接拒绝连接。我需要考虑各种可能性,并逐一分析。 第一个可能性是SSH服务是否正常运行。如果服务器端的SSH服务没有启动,或者端口被防火墙阻止,用户可能无法连接到输入密码的步骤。这时候,用户可能连密码输入的机会都没有,直接会显示连接被拒绝。不过用户已经到达了输入密码的步骤,说明连接已经建立,SSH服务应该是运行中的。但也不能排除服务配置的问题,比如是否允许密码认证。 接下来,密码输入时没有反应,可能是因为SSH客户端的问题。比如,某些终端模拟器在输入密码时不会显示任何字符,包括星号或者圆点,这可能会让用户误以为无法输入。这时候需要告诉用户,尽管看不到反馈,但实际上输入的字符是有效的,继续输入后按回车即可。不过,如果输入正确密码后仍无法登录,可能密码错误,或者服务器配置禁止密码登录,转而要求密钥认证。 第三个可能性是服务器SSH配置文件中禁用了密码认证。在/etc/ssh/sshd_config中,PasswordAuthentication参数如果设置为no,那么即使用户尝试输入密码,系统也会拒绝,转而要求密钥。这时候用户需要检查配置文件,并确保该参数是yes,然后重启SSH服务。 另外,用户可能被服务器防火墙或安全组规则拦截。比如,虽然SSH端口(默认22)开放,但可能某些安全组设置限制了IP访问,或者有入侵防御系统暂时封锁了多次尝试的IP。这种情况下,用户需要检查服务器防火墙设置,如iptables或ufw,以及云服务提供商的安全组配置。 还有可能是用户的账户被锁定,或者密码过期。在Linux系统中,如果账户被锁定,或者密码过期,即使用户输入正确密码,系统也会拒绝登录。这时候需要检查账户状态,比如使用passwd -S [用户名]查看,或者在服务器查看日志文件/var/log/auth.log,寻找相关登录失败的记录。 此外,客户端的键盘布局问题也可能导致输入的密码与实际不符。例如,用户可能在客户端使用的是不同的键盘布局(如QWERTY与AZERTY),导致输入的字符与预期不同,从而密码错误。这种情况下,建议用户在其他地方测试密码输入是否正确,或者使用SSH密钥认证避免输入错误。 还有一种情况是,服务器的磁盘空间已满,导致无法进行认证操作。虽然这种情况较少见,但可以检查服务器的磁盘使用情况,使用df -h命令查看是否有分区使用率达到100%。 总结下来,可能的步骤包括: 1. 检查是否能够连接到SSH端口,确认网络和防火墙设置。 2. 确认SSH服务配置中允许密码认证。 3. 检查用户账户状态和密码是否正确。 4. 查看服务器日志,获取详细的错误信息。 5. 尝试使用SSH密钥登录,排除密码输入问题。 6. 检查客户端终端设置,确保输入无异常。 7. 验证服务器资源(如磁盘空间)是否充足。 用户可能需要逐步排查这些可能性,或者提供更多信息,例如具体的错误提示、是否能够使用其他方式登录等,以便更准确地定位问题。</think>当使用SSH连接Linux服务器时无法输入密码,可能是由多种原因导致的。以下是常见原因及解决方法: --- ### **1. 密码输入不可见(正常现象)** - **现象**:输入密码时光标不动、无星号或圆点反馈。 - **原因**:SSH客户端默认隐藏密码输入(安全设计)。 - **解决**:**直接输入密码后按回车**,即使看不到输入内容。 --- ### **2. SSH服务配置问题** - **可能原因**:服务器SSH配置禁用了密码登录。 - **检查步骤**: 1. 登录服务器(如通过控制台或密钥),编辑配置文件: ```bash sudo vi /etc/ssh/sshd_config ``` 2. 确认以下参数为`yes`: ```ini PasswordAuthentication yes ChallengeResponseAuthentication yes ``` 3. 重启SSH服务: ```bash sudo systemctl restart sshd # 或 service ssh restart ``` --- ### **3. 账户或密码错误** - **现象**:输入密码后提示`Permission denied`。 - **可能原因**: - 密码输入错误(注意大小写、特殊字符)。 - 账户被锁定或密码过期。 - **解决**: - 检查密码是否正确(可尝试本地直接登录服务器验证)。 - 查看账户状态: ```bash sudo passwd -S [用户名] # 检查是否锁定 sudo chage -l [用户名] # 检查密码有效期 ``` --- ### **4. 防火墙/安全组拦截** - **现象**:连接超时或直接拒绝。 - **检查步骤**: 1. **服务器防火墙**: ```bash sudo ufw status # 若使用UFW sudo iptables -L -n # 检查iptables规则 ``` 2. **云服务器安全组**:确保入方向允许`TCP 22`端口。 3. **网络限制**:本地网络或ISP是否屏蔽SSH端口。 --- ### **5. 磁盘空间不足** - **现象**:登录时提示`No space left on device`。 - **检查命令**: ```bash df -h # 查看磁盘使用情况 ``` - **解决**:清理大文件或扩容磁盘。 --- ### **6. 客户端SSH配置问题** - **可能原因**:客户端软件(如PuTTY、OpenSSH)异常。 - **解决**: - 换用其他客户端(如Xshell、MobaXterm)。 - 重置客户端配置或更新版本。 --- ### **7. 使用SSH密钥登录(替代方案)** 如果密码登录持续失败,可改用密钥认证: 1. **生成密钥对**(本地): ```bash ssh-keygen -t rsa ``` 2. **上传公钥到服务器**: ```bash ssh-copy-id -i ~/.ssh/id_rsa.pub user@server_ip ``` 3. **禁用密码登录(可选)**: 在`/etc/ssh/sshd_config`中设置: ```ini PasswordAuthentication no ``` --- ### **8. 查看日志定位问题** - **服务器日志**: ```bash tail -f /var/log/auth.log # Ubuntu/Debian tail -f /var/log/secure # CentOS/RHEL ``` 观察登录失败的具体错误信息(如`Failed password`或`Authentication refused`)。 --- ### **总结步骤** 1. 确认密码输入正确(无显示是正常的)。 2. 检查服务器SSH配置是否允许密码登录。 3. 验证防火墙/安全组是否开放22端口。 4. 查看服务器日志获取详细错误。 5. 尝试使用SSH密钥登录。 若问题仍存在,请提供具体错误提示或日志内容,以便进一步诊断!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值