banips.sh 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #!/bin/bash
  2. banip_run(){
  3. # https://help.baidu.com/search?keywords=hiker.nokia.press 访问这个直接dd
  4. nginx_home=/usr/sbin/nginx
  5. log_path=/var/log/nginx
  6. nginx_etc=/etc/nginx/conf.d
  7. maxcn=3000
  8. history=50000
  9. cat /dev/null > $log_path/ban_ip_tmp.txt
  10. tail -n$history $log_path/access.log \
  11. |awk '{print $1,$12}' \
  12. |grep -i -v -E "google|yahoo|baidu|msnbot|FeedSky|sogou" \
  13. |awk '{print $1}'|sort|uniq -c|sort -rn \
  14. |awk '{if($1>'$maxcn')print "deny "$2";"}' >$log_path/ban_ip_tmp.txt
  15. spiders=`awk 'END{print NR}' $log_path/ban_ip_tmp.txt`
  16. now_time=$(date "+%Y-%m-%d %H:%M:%S")
  17. if [ $spiders -gt 0 ]
  18. then
  19. cat $log_path/ban_ip_tmp.txt > $nginx_etc/ban_ip.conf
  20. blacks=`cat $log_path/ban_ip_tmp.txt`
  21. echo "$now_time 本次封禁以下$spiders个IP:$blacks"
  22. service nginx reload
  23. echo "nginx重载完毕"
  24. #docker restart hiker
  25. docker exec hiker odoo restart
  26. echo "道长仓库重载完毕"
  27. else
  28. echo "$now_time 很棒,本次检测未发现恶意访问的ip"
  29. hiker_test
  30. fi
  31. }
  32. hiker_test(){
  33. httpcode=`curl -I localhost:8025 -w "%{http_code}\n" -o /dev/null -s`
  34. # httpcode=`curl -I -s localhost:8025|head -1|cut -d " " -f2`
  35. if [ "$httpcode" == "200" ];then
  36. echo "hiker服务运行正常"
  37. else
  38. echo "hiker服务已经异常,返回$httpcode,开始重启服务"
  39. docker exec hiker odoo restart
  40. echo "道长仓库重载完毕"
  41. fi
  42. }
  43. banip_num(){
  44. # 500000 10000
  45. log_path=/var/log/nginx
  46. tail -n$1 $log_path/access.log \
  47. |awk '{print $1,$12}' \
  48. |grep -i -v -E "google|yahoo|baidu|msnbot|FeedSky|sogou" \
  49. |awk '{print $1}'|sort|uniq -c|sort -rn \
  50. |awk '{if($1>'$2')print ""$2""}' >$log_path/ban_ip_tmps.txt
  51. cat $log_path/ban_ip_tmps.txt
  52. }
  53. banip_kill(){
  54. log_path=/var/log/nginx
  55. for line in `cat $log_path/ban_ip_tmps.txt`
  56. do
  57. iptables -I INPUT -s $line -j DROP
  58. echo '封禁了:'$line
  59. done
  60. }
  61. ipkill(){
  62. iptables -I INPUT -s $1 -j DROP
  63. echo '封禁了:'$1
  64. }
  65. ipallow(){
  66. iptables -D INPUT -s $1 -j DROP
  67. echo '解封了:'$1
  68. }
  69. ipshow(){
  70. # iptables --list
  71. iptables -L
  72. }
  73. log(){
  74. log_path=/var/log/nginx
  75. tail -f $log_path/access.log
  76. }
  77. banip_log(){
  78. awk '{print $1}' /var/log/nginx/access.log |sort |uniq -c|sort -n
  79. }
  80. banip_clear(){
  81. cat /dev/null > ban_ip.conf
  82. }
  83. banip_show(){
  84. nginx_etc=/etc/nginx/conf.d
  85. cat $nginx_etc/ban_ip.conf
  86. }
  87. # cat /dev/null > banips.sh
  88. #ln -s /etc/nginx/conf.d/banips.sh /usr/local/bin/banips
  89. #rm -rf /usr/local/bin/banips
  90. # EDITOR=vi;export EDITOR
  91. #crontab -e
  92. # PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
  93. #15分钟执行一次封ip
  94. # */15 * * * * banips run >> /etc/nginx/conf.d/banips.log 2>&1
  95. # cat /dev/null > /etc/nginx/conf.d/banips.log
  96. # /etc/init.d/cron stop
  97. # /etc/init.d/cron start
  98. # iptables -L -n --line-numbers
  99. # iptables -I INPUT -s 168.138.198.222 -j DROP
  100. # cat /var/log/nginx/access.log | grep HEAD
  101. msg='run 启动ip封杀\nlog 打印访问ip记录\nshow 显示被封的ip\nclear 清空封禁列表\nlogs 显示nginx实时日志\nnum输出异常ip到文本\nkills 封禁文本异常ip\nipkill 手动封单ip\nipshow 显示规则\nipallow 解封ip'
  102. case "$1" in
  103. run)
  104. banip_run
  105. ;;
  106. log)
  107. banip_log
  108. ;;
  109. logs)
  110. log
  111. ;;
  112. num)
  113. banip_num $2 $3
  114. ;;
  115. kills)
  116. banip_kill
  117. ;;
  118. show)
  119. banip_show
  120. ;;
  121. clear)
  122. banip_clear
  123. ;;
  124. ipkill)
  125. ipkill $2
  126. ;;
  127. ipallow)
  128. ipallow $2
  129. ;;
  130. ipshow)
  131. ipshow
  132. ;;
  133. *)
  134. echo -e $msg
  135. ;;
  136. esac