我们的邮件服务器受到了很多攻击。邮件日志中有很多这样的内容:
Apr 23 04:35:13 mail1 postfix/smtpd[31700]: NOQUEUE: reject: RCPT from unknown[119.153.14.231]: 554 <[email protected]>: Recipient address rejected: User unknown in local recipient table; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<localhost>
我有一个脚本,用于搜索 IP 并阻止它们。当我阻止 RCPT IP 时,我遇到了问题。相反,我想阻止发件人的域名,例如此示例:shareme.com。我应该在脚本中修改什么才能做到这一点?
#!/bin/bash
IPT=/sbin/iptables
LIMIT=10
cd /admin
# first get one minute of log
grep "`date +"%b %d %H:%M:" --date="1 minutes ago"`" /var/log/maillog > minutelog
# now extract the rejected attempts, sort and count uniq ip
cat minutelog | grep "reject:" | cut -d" " -f10 | cut -d"[" -f2 | cut -d"]" -f 1 | sort | uniq -c | sort -n | sed 's/^[ \t]*//' > tmp1
# for each line in result
while read line
do
MYCOUNT=`echo $line | cut -d" " -f1`
MYIP=`echo $line | cut -d" " -f2`
if [ $MYCOUNT -lt $LIMIT ] ;
then
echo $MYIP is ok: $MYCOUNT attempts
else
echo blocking the spammer at $MYIP with $MYCOUNT attempts
$IPT -I INPUT -i eth0 --proto tcp -s $MYIP --destination-port 25 -j DROP
echo $MYIP >> blocked.smtp
fi
done < tmp1
rm -f minutelog
rm -f tmp1
答案1
仅使用 IP 过滤器按 SMTP 发件人域进行阻止是不可能的,因为具有给定域的电子邮件可能来自任何 IP。此外,按发件人域进行阻止是危险的,因为任何人都可以伪造发件人电子邮件并发送多封邮件,例如[电子邮件保护]并且您的脚本将会很乐意阻止来自 Gmail 的所有流量。
为了解决您的问题,我建议您检查“针对建立过多连接的客户端的措施”部分http://www.postfix.org/TUNING_README.html
答案2
最好尝试一下 Fail2ban:http://www.fail2ban.org/
Fail2ban 会扫描日志文件(如 /var/log/pwdfail 或 /var/log/apache/error_log)并封禁密码失败次数过多的 IP。它会更新防火墙规则以拒绝该 IP 地址。