邮件服务器自动防攻击脚本分享

1100阅读 0评论2016-02-19 sync_1521
分类:LINUX



  1. #!/bin/bash
  2. #Authors :Tangwb
  3. #Date :2016/02/18
  4. ##########################################################################################
  5. # 该脚本的目的在于: #
  6. # 1.邮件服务器自动防御CC攻击。 #
  7. # 2.内部邮箱被黑客破译密码后乱发邮件导致邮件队列过长问题。 #
  8. ##########################################################################################
  9. #加载环境变量
  10. . /etc/profile
  11. # 定义需监控的端口
  12. CHK_PORT="80 443 25 110 22 995 465 587 143 993"
  13. # 定义不需要监控的tcp状态
  14. CHK_TCP_STATE="LISTEN"
  15. # 连接数量最大限制
  16. MAX_CONNECT_IP_NUM=100
  17. # 邮件队列最大限制
  18. MAX_MAIL_QUEUE=200
  19. # 扫描ip的间隔时间()
  20. SCAN_IP_TIMEOUT=30
  21. # IP自动解封时间()
  22. IP_DEBLOCK_TIME=5
  23. # ip白名单
  24. ACCEPT_IP="183.62.15.118 172.16.2.10 127.0.0.1 192.168.1.97 192.168.1.99 0.0.0.0"
  25. # 记录需要封锁IP临时文件
  26. IP_DENY_TMP=/tmp/ip_deny_tmp
  27. # 记录需要封锁IP文件
  28. IP_DENY=/tmp/ip_deny
  29. # 邮件队列过长输出信息
  30. MAIL_QUEUE=/tmp/mail_queue_info
  31. # 汇总文件
  32. MAIL_TXT=/tmp/mail_txt
  33. # sendEmail命令路径
  34. SENDMAIL=/usr/local/bin/sendEmail
  35. # 邮件接收列表
  36. MAILLIST="tang@sina.cn"

  37. # 封杀ip函数
  38. function drop_ip_from_table()
  39. {
  40.         iptables -I INPUT -s "$1" -j DROP -m comment --comment "auto by shell"
  41. }

  42. # 找出符合规定的IP并在iptables里面封杀
  43. function deny_ip_iptable()
  44. {
  45.         time=$(date +"%F")
  46.         netstat -an |awk --re-interval 'BEGIN{split("'"${CHK_PORT}"'",_p);for(i in _p){p[_p[i]]};split("'"${CHK_TCP_STATE}"'",_s);for(i in _s){s[_s[i]]}}/^tcp/&&!/LISTEN/{match($4,":([0-9]+)$",a);match($5,"([0-9]{1,3}\\.){3}[0-9]{1,3}",b);sum[a[1]" "b[0]" "$NF]++}END{for(i in sum){if(sum[i]>+"'$MAX_CONNECT_IP_NUM'"){split(i,c);if(c[1] in p && !(c[3] in s)){print "'${time}'",c[2]" --> port: "c[1],"state: "c[3],"sum: "sum[i]}}}}' >$IP_DENY_TMP
  47.         while read line
  48.         do
  49.            ip=$(awk '{print $2}' <<<$line)
  50.            if grep -w $ip <<<$ACCEPT_IP &>/dev/null || iptables-save |grep -E "$ip.*auto by shell" &>/dev/null ;then
  51.               continue
  52.            fi
  53.            drop_ip_from_table $ip && echo "$time $ip" >> $IP_DENY
  54.         done<${IP_DENY_TMP}
  55. }

  56. # 自动解封ip
  57. function deblock_ip()
  58. {
  59.         DEBLOCK_TIME=$(date -d "${IP_DEBLOCK_TIME} days ago" +"%F")
  60.         awk '{if($1<"'$DEBLOCK_TIME'"){CMD="iptables -D INPUT -s \""$2"\" -j DROP -m comment --comment \"auto by shell\"";system(CMD)}else{exit}}' $IP_DENY
  61.         NR=$(awk '$1<"'$DEBLOCK_TIME'"{n=NR}END{print n}' $IP_DENY)
  62.         test -n "$NR" && sed -i "1,${NR}d" $IP_DENY
  63. }

  64. # 自动处理内部邮件队列过长问题
  65. function mail_queue()
  66. {
  67.         mailq |awk 'BEGIN{RS=""}$9==""{a[$7]++}END{if($0~/Request/){if($5>+"'${MAX_MAIL_QUEUE}'"){for(i in a){print i,a[i]|"sort -rn -k2,2|head -1"}}}}' >$MAIL_QUEUE
  68.         if [ -s $MAIL_QUEUE ];then
  69.             sender=$(cat $MAIL_QUEUE|head -1|awk '{print $1}')
  70.             postsuper -h ALL
  71.             mailq |awk 'BEGIN{RS=""}{if($7=="'"$sender"'"&&$9=="")print $1}'| tr -d '*!'| postsuper -d -
  72.             postsuper -r ALL
  73.         fi
  74. }

  75. # 发送邮件函数
  76. function sendmsg()
  77. {
  78.         cat $MAIL_TXT|${SENDMAIL} -f "nagios@onecloud.cn" -t "$MAILLIST" -s 192.168.1.99 -u "Mail server anti attack record mail" -xu nagios@onecloud.cn -xp xxoo -o message-content-type=text/html -o message-charset=utf8
  79. }

  80. # 程序执行入口
  81. function main_app()
  82. {
  83.         while true
  84.         do
  85.             deny_ip_iptable
  86.             if [[ $(date +"%H%M") -eq 2300 ]];then
  87.                 deblock_ip
  88.             fi
  89.             mail_queue
  90.             cat /dev/null >$MAIL_TXT
  91.             cat $IP_DENY_TMP >> $MAIL_TXT
  92.             test -s $MAIL_QUEUE && awk '{print $1,"queue size is",$2,"Maybe the password is known to hackers, please change the password !!"}' $MAIL_QUEUE >> $MAIL_TXT
  93.             if [ -s $MAIL_TXT ];then
  94.                 sendmsg
  95.             fi
  96.             sleep ${SCAN_IP_TIMEOUT}
  97.         done
  98. }

  99. main_app


上一篇:IRedMail
下一篇:如何使用sendEmail发送邮件