一条命令查找并封禁多数暴力破解SSH的IP

之前的文章曾提到,常见的SSH暴力破解工具似乎只支持RSADSA两种密钥交换,而不支持较新的ECDSA(使用NIST P-256的ECDSA)和Ed25519(使用X25519的ECDSA)。

由此一来,当这些机器人来暴力破解的时候,/var/log/auth.log中会出现大量类似如下内容的日志

Jan 28 06:41:50 HWS-Node3 sshd[8476]: fatal: Unable to negotiate with 113.195.145.52 port 34408: no matching host key type found. Their offer: ssh-rsa,ssh-dss [preauth]

*:DSS(数字签名标准)采用的算法为DSA(数字签名算法)。

这些请求不可能是由正常的SSH客户端发出的,故可以不加分辨地、自动化地用脚本加以屏蔽。


首先建立一个脚本,以将标准输入中每行的内容(IP地址)加入UFW黑名单;并对这个脚本添加执行位。

echo -e '#!/bin/bash\nwhile read line\ndo ufw insert 1 deny from $line 2> /dev/null\ndone' >> banip.sh
chmod +x banip.sh

然后用一行命令,将攻击者的IP筛选出来并去除重复。

grep -oh /var/log/auth.log* -Ee 'Unable to negotiate with .*\..*\..*\..*'|grep -oh -Ee 'with.*\..*\..*\..*port'|sed -e 's/^with //g;s/ port$//g'|sort -n|uniq

执行此命令,会使攻击者的IP按一行一个输出到标准输出。


通过I/O转移,可将其输出到文件或直接加以屏蔽。

#输出到文件
grep -oh /var/log/auth.log* -Ee 'Unable to negotiate with .*\..*\..*\..*'|grep -oh -Ee 'with.*\..*\..*\..*port'|sed -e 's/^with //g;s/ port$//g'|sort -n|uniq > badip_ssh

#屏蔽
grep -oh /var/log/auth.log* -Ee 'Unable to negotiate with .*\..*\..*\..*'|grep -oh -Ee 'with.*\..*\..*\..*port'|sed -e 's/^with //g;s/ port$//g'|sort -n|uniq|./banip.sh