我想过滤并阻止访问 proftp 服务器的失败尝试。以下是 /var/log/secure 文件中的示例行:
Jan 2 18:38:25 server1 proftpd[17847]: spy1.XYZ.com (93.218.93.95[93.218.93.95]) - Maximum login attempts (3) exceeded
有几行这样的代码。我想阻止任何 IP 的此类尝试两次。这是我尝试运行以阻止这些 IP 的脚本。
tail -1000 /var/log/secure | awk '/proftpd/ && /Maximum login/ { if (/attempts/) try[$7]++; else try[$11]++; }
END { for (h in try) if (try[h] > 4) print h; }' |
while read ip
do
/sbin/iptables -L -n | grep $ip > /dev/null
if [ $? -eq 0 ] ; then
# echo "already denied ip: [$ip]" ;
true
else
logger -p authpriv.notice "*** Blocking ProFTPD attempt from: $ip"
/sbin/iptables -I INPUT -s $ip -j DROP
fi
done
我如何使用“awk”选择 IP。使用当前脚本,它完全选择“(93.218.93.95[93.218.93.95])”这一行。但我只想选择 IP。
答案1
如果您使用 GNU awk ( gawk
),则可以使用正则表达式作为字段分隔符。
$ echo 'Jan 2 18:38:25 server1 proftpd[17847]: spy1.XYZ.com (93.218.93.95[93.218.93.95]) - Maximum login attempts (3) exceeded' \
| awk -F'\\[|]' '{print $4}'
93.218.93.95
答案2
你也可以看看 Fail2Ban 之类的东西,它确实有示例设置FTP 服务。
答案3
tail -1000 /var/log/secure | awk '/proftpd/ && /Maximum login attempts/' | awk -F "[][]" '{print $(NF-1)}' |
while read ip
do
# note: check if IP is already blocked...
/sbin/iptables -L -n | grep $ip > /dev/null
if [ $? -eq 0 ] ; then
# echo "already denied ip: [$ip]" ;
true
else
# echo "Subject: denying ip: $ip" | /usr/sbin/sendmail [email protected]
logger -p authpriv.notice "*** Blocking ProFTPD attempt from: $ip"
/sbin/iptables -I INPUT -s $ip -j DROP
fi
done