泉州师范学院论坛

 找回密码
 注册会员

扫一扫,访问微社区

查看: 15|回复: 0

套CDN NGIN防止CC攻击防采集 宝塔面板识别CDN真实IP

[复制链接]
剑指寒江 发表于 2019-9-6 03:25:29 | 显示全部楼层 |阅读模式
CC 攻击和采集都是同个IP发起大量访问请求,这个会造成大量请求拥堵,导致服务器资源耗尽,CC攻击主要针对特定服务接口,属于实现 DoS 攻击的一种方式。
如果没有套上CDN,那其实防御思路非常简单,识别出访问量大的IP,直接用服务器的iptable防火墙封禁IP就行了,但是如果使用CDN,那所有访客都是通过CDN连接我们的服务器,这种情况下,服务器封禁IP的话,只能封到CDN的IP,无法阻止CDN后面的真实访客访问,对这部分有攻击行为的访客,只能通过CDN的防火墙,导入IP黑名单方式来屏蔽。
虽然服务器级别的封禁IP,在CDN下有难度,但是通过NGINX还是可以识别到单独的访问进程,通过识别出CDN后的真实IP访问,在处理这部分访问的时候,直接转给他502页面,不进行后续网页输出就行。
如果你服务器没有启用CDN,那可以参考这个文章,使用SHELL脚本+iptable封禁IP
说一下NGINX 流控,有两种方式:
  1. limit_req_zone:通过“漏桶”算法限制每个 IP 发起的请求频率。
  2. limit_conn_zone:限制每个 IP 发起的连接数。
复制代码

实践配置
一般NGINX 部分
配置error_log  /www/wwwlogs/nginx_error.log  error;
这样才能正确显示到被封禁的错误记录出来个FAIL2BAN使用
宝塔nginx配置文件位置:/www/server/nginx/conf/nginx.conf;
一般nginx的配置文件位置:/usr/local/nginx/conf/nginx.conf

然后在 http 部分中配置:
  1. map $http_x_forwarded_for  $clientRealIp
  2. {
  3.     ""    $remote_addr;
  4.     ~^(?P<firstAddr>[0-9.]+),?.*[        DISCUZ_CODE_25        ]nbsp;   $firstAddr;
  5. }
  6. limit_req_zone $clientRealIp zone=sym:10m rate=5r/s;
  7. limit_conn_zone $clientRealIp zone=conn_sym:10m;
复制代码
然后在需要流控的站点的 location 部分配置:

  1. limit_req zone=sym burst=5;
  2. limit_conn conn_sym 10;
复制代码

宝塔安装的NGINX按下面配置
Nginx管理-配置修改
find
  1. error_log  /www/wwwlogs/nginx_error.log  crit;
复制代码

change into
  1. error_log  /www/wwwlogs/nginx_error.log  error;
复制代码

然后在http部分
  1. include proxy.conf;
复制代码

下面增加
  1. map $http_x_forwarded_for  $clientRealIp
  2. {
  3.     ""    $remote_addr;
  4.     ~^(?P<firstAddr>[0-9.]+),?.*[        DISCUZ_CODE_27        ]nbsp;   $firstAddr;
  5. }
复制代码
find
  1. limit_conn_zone $binary_remote_addr zone=perip:10m;
复制代码
change into
  1. limit_conn_zone $clientRealIp zone=perip:10m;
复制代码
这样才能针对使用代理IP刷你的站的人的真实IP进行计数,达到每秒多少个就封禁访问
然后到需要进行防御的网站点设置-流量限制
这里启用流量限制,并将单IP并发数进行限制,一般如果网站页面不复杂设置为10就行。
接下来重启 NGINX 后当有超流客户端请求时将记录在 www/wwwroot/nginx_error.log(不是宝塔面板的话,NGINX默认错误日志在 /var/log/nginx/error.log) 中看到类似记录:
2018/04/27 14:25:27 [error] 6307#0: *1472746 limiting connections by zone "perip", client: 182.161.35.139, server: 104.153.102.68, request: "GET /index.php?10=8 HTTP/1.1"
此时请求已经被 NGINX 限流。

=============================
Nginx.conf配置文件详解

运行用户
user nobody;
启动进程,通常设置成和cpu的数量相等
worker_processes 1;

全局错误日志及PID文件
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;

pid logs/nginx.pid;
工作模式及连接数上限
events {
worker_connections 1024;#单个后台worker process进程的最大并发链接数
}
设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#设定mime类型,类型由mime.type文件定义
include mime.types;
default_type application/octet-stream;
#设定日志格式
#access_log logs/access.log main;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
#必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#tcp_nopush on;
#连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
#服务器设置的最大上传文件大小
client_max_body_size 200m;
#开启gzip压缩
gzip on;
gzip_comp_level 2;
gzip_types text/css application/javascript application/json;
gzip_disable “MSIE [1-6].”;

#设定负载均衡的服务器列表
upstream collectionBackend {
#本机上的Squid开启7002端口
server 127.0.0.1:7002;
}

server {
#侦听80端口
listen 80;
#定义使用localhost访问
server_name localhost;

#默认值90s, nginx连接到后端服务器的连接超时时间        
proxy_connect_timeout 90;

#设置了发送请求给upstream服务器的超时时间。超时设置不是为了整个发送期间,而是在两次write操作期间。如果超时后,upstream没有收到新的数据,nginx会关闭连接
proxy_send_timeout 90;

设置与代理服务器的读超时时间。它决定了nginx会等待多长时间来获得请求的响应。这个时间不是获得整个response的时间,而是两次reading操作的时间。
proxy_read_timeout 90;

nginx设置目录浏览及中文乱码问题解决方案:
#charset koi8-r;

#设定日志格式
#access_log logs/host.access.log main;

在这个location配置段中,如果URL请求“/public/logo.gif”,那么nginx将会在服务器上查找“F:/workspace/cloud/bv-frontend-dev/public/logo.gif”文件,即请求的URL中location后面的部分会被追加到alias指定的目录后面,而location后面的“/public”路径将会被自动丢弃。
location /public/ {
alias F:/workspace/cloud/bv-frontend-dev/public/;
}

location / {
#rewrite的主要功能是实现RUL地址的重定向
rewrite ‘^/simple/.*.(html)$’ /simple-index/simple.html last;

rewrite ‘^/simple/.*config.js$’ /simple-index/config.js last;

rewrite ‘^/simple/./custom/(.)’ /simple-index/custom/$1 last;

rewrite ‘^/simple/./api/(.)’ /api/$1 last;

rewrite ‘^/simple/custom/(.*)’ /simple-index/custom/$1 last;

rewrite ‘^/simple/api/(.*)’ /api/$1 last;

alias同上含义:
alias F:/workspace/bestvike/collection-handle/static/;
index index.html;
}

location /simple-index {
alias F:/workspace/bestvike/collection-handle/static/;
}

location /resources/ {
rewrite ‘^/resources/simple/(.*.html)$’ /simple-index/simple/$1 last;
alias F:/workspace/bestvike/collection-handle/static/simple/;
}

location /api/ {

proxy_set_header:允许重新定义或者添加发往后端服务器的请求头.该值可以包含文本、变量和它们的组合。在没有定义proxy_set_header时会继承之前定义的值。默认情况下,只有两个字段被重定义:proxy_set_header Host $proxy_host 和 proxy_set_header Connection close

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header REMOTE-HOST $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass URL,URL为要设置的被代理服务器的地址,包含传输协议、主机名称或IP地址加端口号、URI等要素。
proxy_pass http://collectionBackend/api/;
}

error_page:当发生错误的时候能够显示一个预定义的地址,实际上产生了一个内部跳转(internal redirect),当访问出现500、502、503、504的时候就能返回50x.html中的内容。同时我们也可以自己定义这种情况下的返回状态码。

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

rewrite后常用的正则表达式:
b.png





泉州师院论坛域名: www.Qzubbs.com 手机浏览器照样访问。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

关于我们|免责声明|学校风景|企业招聘|二手市场|违规帐号|手机论坛|手机论坛|京ICP备10001858号|广告联系

Copyright 1958-2018 泉州大学 泉州师范学院 - 相聚西岸阳光,相遇、相识、相知;一起邂逅骄傲,梦想,未来!

GMT+8, 2019-9-18 16:08 , Processed in 0.043766 second(s), 10 queries , Gzip On, MemCached On.

快速回复 返回顶部 返回列表