技术文摘

巧用宝塔计划任务的Shell脚本,守护网站安全,拉黑恶意采集IP

作者:雨祺   发表于:
浏览:117次    字数:4432  原创
级别: 站长   总稿: 69 篇,  月稿: 0
今天我们来聊聊如何巧妙运用宝塔的计划任务中的Shell脚本,将恶意采集网站内容的IP一网打尽!网站如同宝库,恶意采集者则如同小偷,悄悄窃取我们的心血。是时候亮剑反击了!借助Shell脚本,我们就像布下了侦探网,自动识别并拉黑那些可疑的IP。再结合宝塔的计划任务,让“侦探”每日定时巡逻,让恶意采集者无处遁形!这样不仅能保护我们的原创内容,减轻服务器负担,还能提升用户浏览体验,甚至助力网站排名和流量的提升。虽然无法完全杜绝采集,但至少能让那些菜鸟采集者望而却步。赶紧行动起来,用宝塔计划任务中的Shell脚本守护我们的网站,让它重回宁静与安全的怀抱!

首先要安装jq:安装jq非常简单,cenos只需运行以下命令
  1. sudo yum install jq -y 
该命令将自动下载并安装jq工具及其依赖项。

那接下来就进入宝塔的计划任务,任务类型选择shell脚本,任务名称“定位恶意IP”执行周期每15分钟。脚本内容如下
  1. #!/bin/bash   
  2. logfiles=(   
  3.   "/www/wwwlogs/www.*****.com.log"   
  4.   "/www/wwwlogs/www.*****.cn.log"   
  5.   "/www/wwwlogs/www.*****.com.log"   
  6. )   
  7. baidu_spider_ips="/www/server/nginx/conf/baidu_spider_ips.txt"   
  8. blockiplogfile="/www/server/nginx/conf/blockip.conf"   
  9. geolocation_file="/www/wwwlogs/blockipinfo.txt"   
  10. last_minutes=1   
  11. start_time=$(date -d "${last_minutes} minutes ago" +"%d/%b/%Y:%H:%M:%S")   
  12. stop_time=$(date +"%d/%b/%Y:%H:%M:%S")   
  13. merged_log=$(mktemp)   
  14. geolocation_txt=$(mktemp)   
  15. for logfile in "${logfiles[@]}"do   
  16.   tac "$logfile" | awk -v st="$start_time" -v et="$stop_time" -F' ' '   
  17.     BEGIN {   
  18.       while (getline < "'$baidu_spider_ips'") spider[$0]   
  19.     }   
  20.     {   
  21.       t = substr($4, 2, 19); # 时间戳是每行的第四个字段,格式为[dd/Mmm/YYYY:HH:MM:SS]   
  22.       if (t >= st && t <= et && !($1 in spider)) { # 排除百度蜘蛛IP   
  23.         print $1; # IP地址是每行的第一个字段   
  24.       }   
  25.     }   
  26.   ' >> "$merged_log"   
  27. done    
  28. sort "$merged_log" | uniq -c | sort -nr > "${merged_log}.sorted"   
  29. threshold=60   
  30. api_url="https://www.meiweny.cn/e/extend/chat/info.php?enews=ipcha&ip="  
  31. "$blockiplogfile"   
  32. while IFS=' ' read -r count ip; do   
  33.   if (( count > threshold )); then   
  34.     response=$(curl -s "$api_url$ip")   
  35.     if [[ -n "$response" ]]; then   
  36.       location=$(echo "$response" | jq -r '.ip1' 2>/dev/null)   
  37.       if [[ $? -eq 0 ]]; then # 检查jq命令是否成功   
  38.         echo "$ip - $count requests - $location" >> "$geolocation_txt"   
  39.         echo "deny $ip;" >> "$blockiplogfile"   
  40.         echo "IP $ip blocked due to excessive requests."   
  41.       else   
  42.         echo "$ip - $count requests - Failed to extract location with jq" >> "$geolocation_txt"   
  43.       fi   
  44.     else   
  45.       echo "$ip - $count requests - Unable to retrieve location" >> "$geolocation_txt"   
  46.     fi   
  47.   fi   
  48. done < "${merged_log}.sorted"   
  49. while IFS=' ' read -r ip _; do   
  50. grep -qF "deny $ip;" "$blockiplogfile" || echo "deny $ip;" >> "$blockiplogfile"   
  51. done < "$geolocation_txt"   
  52. cat "$geolocation_txt" > "$geolocation_file"   
  53. rm "$merged_log" "${merged_log}.sorted" "$geolocation_txt"   
  54. echo "Blacklist updated."   
  55. echo "saved to $geolocation_file." 
记得要在/www/server/nginx/conf/目录下面新建一个baidu_spider_ips.txt,这文件存放蜘蛛的IP,每行一个。比如:
  1. 116.179.32.1 
  2. 116.179.32.2 
  3. 116.179.32.3 
  4. 116.179.32.4 
  5. 116.179.32.5 
  6. 116.179.32.6 
  7. 116.179.32.7 
  8. 116.179.32.8 
  9. 116.179.32.9 
  10. 116.179.32.10 
  11. 116.179.32.11 
  12. 116.179.32.12 
  13. 116.179.32.13 
  14. 116.179.32.14 
  15. 116.179.32.15 
  16. 116.179.32.16 
  17. 116.179.32.17 
  18. 116.179.32.18 
  19. 116.179.32.19 
  20. 116.179.32.20 
  21. 116.179.32.21 
  22. 116.179.32.22 
  23. 116.179.32.23 
  24. 116.179.32.24 
  25. 116.179.32.25 
  26. 116.179.32.26 
  27. 116.179.32.27 
  28. 116.179.32.28 
  29. 116.179.32.29 
  30. 116.179.32.30 
  31. 116.179.32.31 
  32. 116.179.32.32 
  33. 116.179.32.33 
  34. 116.179.32.34 
另外提供一个将大部分蜘蛛的IP详情生成TXT的方法
  1. <?php   
  2. function cidrToIpRangeGenerator($cidr) {   
  3.     list($ip, $mask) = explode('/', $cidr);   
  4.     $ipInt = ip2long($ip);   
  5.     $maskInt = ~((1 << (32 - $mask)) - 1);   
  6.     $networkAddress = $ipInt & $maskInt;   
  7.     $broadcastAddress = $networkAddress | (~$maskInt);   
  8.     for ($currentIpInt = $networkAddress + 1; $currentIpInt < $broadcastAddress; $currentIpInt++) {   
  9.         yield long2ip($currentIpInt);   
  10.     }   
  11. }   
  12. function batchProcessCidrs($cidrs, $batchSize, $outputFile) {   
  13.     $file = fopen($outputFile, 'w');   
  14.     if (!$file) {   
  15.         die('无法打开文件');   
  16.     }   
  17.     $count = 0;   
  18.     $totalCidrs = count($cidrs);   
  19.     $batchCount = ceil($totalCidrs / $batchSize);     
  20.     echo "开始处理CIDR块...n";   
  21.     for ($batch = 0; $batch < $batchCount; $batch++) {   
  22.         $batchCidrs = array_slice($cidrs, $batch * $batchSize, $batchSize);   
  23.         foreach ($batchCidrs as $cidr) {   
  24.             foreach (cidrToIpRangeGenerator($cidr) as $ip) {   
  25.                 fwrite($file, $ip . PHP_EOL);   
  26.             }   
  27.             $count++;   
  28.             echo "已处理CIDR {$count}/{$totalCidrs}n";   
  29.         }   
  30.         sleep(10); // 暂停10秒   
  31.     }   
  32.     fclose($file);   
  33.     echo "所有IP地址范围已写入{$outputFile}文件。n";   
  34. }      
  35. $cidrs = [   
  36. //百度蜘蛛 
  37. '116.179.32.0/24'
  38. '180.76.15.0/24'
  39. '119.63.196.0/24'
  40. '115.239.212./24'
  41. '119.63.199.0/24'
  42. '122.81.208.0/22'
  43. '123.125.71.0/24'
  44. '180.76.4.0/24'
  45. '180.76.5.0/24'
  46. '180.76.6.0/24'
  47. '185.10.104.0/24'
  48. '220.181.108.0/24'
  49. '220.181.51.0/24'
  50. '111.13.102.0/24'
  51. '123.125.67.144/29'
  52. '123.125.67.152/31'
  53. '61.135.169.0/24'
  54. '123.125.68.68/30'
  55. '123.125.68.72/29'
  56. '123.125.68.80/28'
  57. '123.125.68.96/30'
  58. '202.46.48.0/20'
  59. '220.181.38.0/24'
  60. '123.125.68.80/30'
  61. '123.125.68.84/31'
  62. '123.125.68.0/24'
  63. //神马蜘蛛 
  64. '106.11.0.0/16'
  65. '42.156.0.0/16'
  66. '42.120.0.0/16'
  67. //头条蜘蛛 
  68. '111.225.148.0/24'
  69. '111.225.149.0/24'
  70. '220.243.135.0/24'
  71. '220.243.136.0/24'
  72. '60.8.123.0/24'
  73. '110.249.201.0/24'
  74. '110.249.202.0/24'
  75. //搜狗蜘蛛 
  76. '106.38.241.0/24'
  77. '43.250.200.0/24'
  78. '43.250.201.0/24'
  79. '58.250.125.0/24'
  80. '49.7.20.0/24'
  81. '49.7.21.0/24'
  82. '61.158.148.0/24'
  83. '61.158.208.0/24'
  84. '36.157.174.185'
  85. //360蜘蛛 
  86. '180.153.232.0/24'
  87. '180.153.234.0/24'
  88. '180.153.236.0/24'
  89. '180.163.220.0/24'
  90. '42.236.101.0/24'
  91. '42.236.102.0/24'
  92. '42.236.103.0/24'
  93. '42.236.10.0/24'
  94. '42.236.12.0/24'
  95. '42.236.13.0/24'
  96. '42.236.14.0/24'
  97. '42.236.15.0/24'
  98. '42.236.16.0/24'
  99. '42.236.17.0/24'
  100. '42.236.46.0/24'
  101. '42.236.48.0/24'
  102. '42.236.49.0/24'
  103. '42.236.50.0/24'
  104. '42.236.51.0/24'
  105. '42.236.52.0/24'
  106. '42.236.53.0/24'
  107. '42.236.54.0/24'
  108. '42.236.55.0/24'
  109. '42.236.99.0/24'
  110. //Bing蜘蛛 
  111. '40.77.169.0/24'
  112. '65.52.104.0/24'
  113. '65.52.108.0/22'
  114. '65.55.24.0/24'
  115. '65.55.52.0/24'
  116. '65.55.55.0/24'
  117. '65.55.213.0/24'
  118. '65.55.217.0/24'
  119. '131.253.24.0/22'
  120. '131.253.46.0/23'
  121. '40.77.167.0/24'
  122. '199.30.27.0/24'
  123. '157.55.13.0/24'
  124. '157.55.16.0/23'
  125. '157.55.18.0/24'
  126. '157.55.32.0/22'
  127. '157.55.36.0/24'
  128. '157.55.48.0/24'
  129. '157.55.109.0/24'
  130. '157.55.110.40/29'
  131. '157.55.110.48/28'
  132. '157.56.92.0/24'
  133. '157.56.93.0/24'
  134. '157.56.94.0/23'
  135. '157.56.229.0/24'
  136. '199.30.16.0/24'
  137. '207.46.12.0/23'
  138. '207.46.192.0/24'
  139. '207.46.195.0/24'
  140. '207.46.199.0/24'
  141. '207.46.204.0/24'
  142. '157.55.39.0/24'   
  143. ];    
  144. $batchSize = 100; // 设置批次大小   
  145. $outputFile = 'ip_ranges.txt';   
  146. batchProcessCidrs($cidrs, $batchSize, $outputFile); 
满满的干货,应该是大家都需要的吧!小编手打码字辛苦就知识付费下吧!不要经常都想着白嫖的!也算是给小编继续原创写作的动力。

【审核人:站长】

收藏   加好友   生成海报   分享
点赞(0)
打赏
Tags: shell 访问 计划 任务 禁止 脚本 宝塔

发布者资料

热门文章

技术文摘

查看更多技术文摘
首页
栏目
搜索
会员
投稿