10.nginx的访问控制及DDOS预防
1)访问控制配置
基于各种原因,Ningx有时要进行访问控制。
比如说,一般网站的后台都不能让外部访问,所以要添加 IP 限制,通常只允许公司的IP访问。
访问控制就是指只有符合条件的IP才能访问到这个网站的某个区域。
涉及模块:ngx_http_access_module
模块概述:允许限制某些 IP 地址的客户端访问。
对应指令:
allow
语法: allow address | CIDR | unix: | all;
默认值: —
作用域: http, server, location, limit_except
允许某个 IP 或者某个 IP 段访问。如果指定 unix,那将允许 socket 的访问。注意:unix 在 1.5.1 中新加入的功能,如果你的版本比这个低,请不要使用这个方法。

deny
语法: deny address | CIDR | unix: | all;
默认值: —
作用域: http, server, location, limit_except
禁止某个 IP 或者一个 IP 段访问。如果指定 unix,那将禁止 socket 的访问。注意:unix 在 1.5.1 中新加入的功能,如果你的版本比这个低,请不要使用这个方法。

示例说明:
server {
      listen 80;
     server_name forum.wangshibo.com;
     root /var/www/html;
     location / {
       deny 192.168.1.1;
       allow 192.168.1.0/24;
       allow 10.1.1.0/16;
       allow 103.10.67.56;
       deny all;
       }
}
规则按照顺序依次检测,直到匹配到第一条规则。
在这个例子里,只有 10.1.1.0/16 、192.168.1.0/24和103.10.67.56允许访问,但 192.168.1.1 除外。

如下实例:
1)先是多域名绑定一个目录后的301跳转至同一个域名
2)针对网站访问做来源ip白名单设置,并加上密码。(即用户认证配置)
[root@test-huanqiu vhosts]# cat test.conf

server {
     listen 80;
     server_name www.wangshibo.com web01.wangshibo.com hehe.wangshibo.com wangshibo.com;
     if ($host != 'www.wangshibo.com') {
     rewrite ^/(.*)$ http://www.wangshibo.com/$1 permanent;
     }
     root /var/www/html;
     index index.html index.php index.htm;
     access_log /usr/local/nginx/logs/image.log;
 
     allow  192.168.1.0/24;
     allow  124.65.197.154;
     deny  all;
     auth_basic "C1G_ADMID";
     auth_basic_user_file /usr/local/nginx/htpasswd;
}
htpasswd -c /usr/local/nginx/htpasswd wangshibo
New password:
Re-type new password:
Adding password for user wangshibo
访问站点http://www.wangshibo.com,效果如下:省略

ngx_http_access_module 配置允许的地址能访问,禁止的地址被拒绝。这只是很简单的访问控制,而在规则很多的情况下,使用 ngx_http_geo_module 模块变量更合适。
这个模块大家下来可以了解 : ngx_http_geo_module

*******************************************************************************************************************************************************

上面也用到了nginx的用户认证的配置,其中:
auth_basic 认证时的提示信息
auth_basic_user_file 认证时存放用户名和密码的文件

# htpasswd -c /usr/local/nginx/htpasswd wangshibo       //第一次设置认证的用户
# htpasswd /usr/local/nginx/htpasswd guohuihui           //追加认证的用户,后面再次追加认证用户时,不要加-c参数,否则就会覆盖之前添加的用户!

下面顺便看几个认证部分的配置:

location /admin/ {
auth_basic "Admin Auth.";
auth_basic_user_file /usr/local/nginx/htpasswd;
}
 
 
location /wangshibo/ {
proxy_pass http://www.guohuihui.com/heng/;
auth_basic "Test Auth.";
auth_basic_user_file /usr/local/nginx/htpasswd;
}
 
location ^~ /auth/ {
location ~ .*.(php|php5)?$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
auth_basic "Authorized users only";
auth_basic_user_file /usr/local/nginx/htpasswd;
}
 

2)DDOS预防配置
DDOS的特点是分布式,针对带宽和服务攻击,也就是四层流量攻击和七层应用攻击,相应的防御瓶颈四层在带宽,七层的多在架构的吞吐量。
对于七层的应用攻击,还是可以做一些配置来防御的,使用nginx的http_limit_conn和http_limit_req模块通过限制连接数和请求数能相对有效的防御。
其中:
ngx_http_limit_conn_module    可以限制单个 IP 的连接数
ngx_http_limit_req_module      可以限制单个 IP 每秒请求数
配置方法:
(1)限制每秒请求数,即ip访问频率限制 
涉及模块:ngx_http_limit_req_module
通过漏桶原理来限制单位时间内的请求数,一旦单位时间内请求数超过限制,就会返回 503 错误。
配置范例:
http {
       limit_req_zone $binary_remote_addr zone=one:10m rate=20r/s;
...
       server {
...
      location ~ \.php$ {
          limit_req zone=one burst=5 nodelay;
          }
      }
}

配置说明(上一部分解释过的就不再解释):
定义一个名为one的limit_req_zone用来存储session,大小是10M内存,
以$binary_remote_addr 为key,限制平均每秒的请求为20个,
1M能存储16000个状态,rete的值必须为整数,
rate=20r/s表示限制频率为每秒20个请求;如果限制两秒钟一个请求,可以设置成30r/m。
限制每ip每秒不超过20个请求,漏桶数burst为5
brust的意思就是,如果第1秒、2,3,4秒请求为19个,
第5秒的请求为25个是被允许的。
但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。
nodelay,如果不设置该选项,严格使用平均速率限制请求数,
第1秒25个请求时,5个请求放到第2秒执行,
设置nodelay,25个请求将在第1秒执行。

(2)限制IP连接数(上面已经说明,这里直接写配置)
http {
       limit_conn_zone $binary_remote_addr zone=addr:10m;               //上面讲过
...
      server {
...
      location /ops/ {
      limit_conn addr 1;
         }
     }
}

总的来说:如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候。其中CC攻击(Challenge

Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包,
造成对方服务器资源耗尽,一直到宕机崩溃。
cc攻击一般就是使用有限的ip数对服务器频繁发送数据来达到攻击的目的。

nginx可以通过Http LimitReq Modul和Http LimitZone Module配置来限制ip在同一时间段的访问次数来防cc攻击。
1)Http LimitReq Modul用来限制连单位时间内连接数的模块,使用limit_req_zone和limit_req指令配合使用来达到限制。一旦并发连接超过指定数量,就会返回503错误。
2)Http LimitConn Modul用来限制单个ip的并发连接数,使用limit_zone和limit_conn指令

配置示例:
Http LimitReq Modul限制某一段时间内同一ip访问数
http{
......
      limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
......
     server{
...
     location {
......
       limit_req zone=allips burst=5 nodelay;
......
    }
......
   }
......
}

Http LimitZone Module 限制并发连接数实例
limit_zone只能定义在http作用域,limit_conn可以定义在http server location作用域
http{
...
    limit_conn_zone one $binary_remote_addr 10m;
......
    server{
......
    location {
......
      limit_conn one 20;
      limit_rate 500k;
......
     }
......
     }
......
}

(3)限速白名单设置(可参考:nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录
http_limit_conn和

http_limit_req模块限制了单IP单位时间内的连接和请求数,但是如果Nginx前面有lvs或者haproxy之类的负载均衡或者反向代理,nginx
获取的都是来自负载均衡的连接或请求,这时不应该限制负载均衡的连接和请求,就需要 geo 和 map 模块设置白名单:
geo $whiteiplist {
     default 1;
     10.11.15.1610;
}
map $whiteiplist$limit {
     1 $binary_remote_addr;
     0 "";
}
limit_req_zone $limit zone=one:10m rate=10r/s;
limit_conn_zone $limit zone=addr:10m;

geo 模块定义了一个默认值是 1 的变量 whiteiplist,当在 ip 在白名单中,变量 whiteiplist 的值为 0,反之为1.
对上面设置的逻辑关系解释:
如果在白名单中--> whiteiplist=0 --> $limit="" --> 不会存储到 10m 的会话状态(one 或者 addr)中 --> 不受限制;
反之,不在白名单中 --> whiteiplist=1 --> $limit=二进制远程地址 -->存储进 10m 的会话状态中 --> 受到限制。

(4)动手测试DDOS预防配置
下面来测一下上面说到的配置是否起到了作用。
安装nginx+php环境
写一个测试的PHP文件,修改nginx配置文件,使其能正常访问。
在/home/shiyanlou目录下写一个test.php,内容如下:
[root@server_web1 ~]# vim /home/shiyanlou/test.php
<?php
phpinfo ();
?>

nginx配置文件参数

location ~ \.php$ {

  root /home/shiyanlou;

  fastcgi_split_path_info ^(.+\.php)(/.+)$;

  fastcgi_pass unix:/var/run/php5-fpm.sock;

  fastcig_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

  include fastcgi_params;

  }

访问:localhost/test.php

用ab命令测试,比较修改nginx配置文件前后的测试结果(连接数和请求数分开测试)

ab -n 10 -c 2 http://172.17.0.2/test.php

对nginx配置做修改(添加http和php配置),重启,然后再进行测试

http{

  limit_conn_zone $binary_remote_addr zone=addr:1m;

  limit_req_zone $binary_remote_addr zone=one:1m rate=5r/5;

}

location ~ \.php$ {

  limit_conn addr 1;

  limit_req zone=one burst=5 nodelay;

}

ab -n 10 -c 2 http://172.17.0.2/test.php

11.访问白名单
参考:nginx访问白名单设置以及根据$remote_addr分发

12.nginx的上传下载设置
参考:nginx限制上传大小和超时时间设置说明/php限制上传大小

13.nginx目录浏览及其验证功能
参考:nginx下目录浏览及其验证功能配置记录

14.Nginx下禁止指定目录运行php脚本文件

非常简单,直接通过location条件匹配定位后进行权限禁止。
 
在server配置段中增加下面的的配置:
 
1)如果是单个目录
location ~* ^/uploads/.*\.(php|php5)$ { 
    deny all;
 
2)如果是多个目录
location ~* ^/(attachments|uploads)/.*\.(php|php5)$ {
   deny all;
 
注意:这段配置文件一定要放在下面配置的前面才可以生效。
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
 
配置完后记得重启Nginx生效。
 
------------------------------------------------------------------------------
如果是Apache下禁止指定目录运行PHP脚本,在虚拟主机配置文件中增加php_flag engine off指令即可,配置如下
"/website/uploads"
  Options FollowSymLinks 
  AllowOverride None 
  Order allow,deny 
  Allow from all  
  php_flag engine off
 

nginx的详解(四)的更多相关文章

  1. Nginx高性能服务器安装、配置、运维 (3) —— Nginx配置详解

    四.Nginx 配置详解 YUM方式安装的Nginx默认配置文件放在/etc/nginx目录下,使用Vim编辑/etc/nginx/nginx.conf: ---------------------- ...

  2. Nginx Rewrite详解

    Nginx Rewrite详解 引用链接:http://blog.cafeneko.info/2010/10/nginx_rewrite_note/ 原文如下: 在新主机的迁移过程中,最大的困难就是W ...

  3. nginx之旅(第一篇):nginx下载安装、nginx启动与关闭、nginx配置文件详解、nginx默认网站

    一.nginx下载安装 版本nginx 1.15.5 系统环境centos7.5(本机ip192.168.199.228) 关闭selinux 和防火墙firewall 1.下载 wget http: ...

  4. Nginx系列(10)- Nginx配置文件详解

    nginx文件结构 ... #全局块 events { #events块 ... } http #http块 { ... #http全局块 server #server块 { ... #server全 ...

  5. .NET DLL 保护措施详解(四)各操作系统运行情况

    我准备了WEB应用程序及WinForm应用程序,分别在WIN SERVER 2012/2008/2003.Win7/10上实测,以下为实测结果截图: 2012 2008 2003 WIN7 WIN10 ...

  6. logback -- 配置详解 -- 四 -- <filter>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

  7. nginx配置详解(转)

    Nginx 配置文件详解 user nginx ; #用户 worker_processes 8; #工作进程,根据硬件调整,大于等于cpu核数 error_log logs/nginx_error. ...

  8. Nginx配置详解 http://www.cnblogs.com/knowledgesea/p/5175711.html

    Nginx配置详解 序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭借开源的力量,已经接近成熟与完善. Nginx功能丰富,可作 ...

  9. pika详解(四) channel 通道

    pika详解(四) channel 通道   本文链接:https://blog.csdn.net/comprel/article/details/94662394 版权 ​ channel通道 通道 ...

  10. [转]反向代理过程与Nginx特点详解

    原文链接:<Nginx搭建反向代理服务器过程详解> 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内 ...

随机推荐

  1. Vue.js - day7

    使用mui的tab-top-webview-main完成分类滑动栏 兼容问题 和 App.vue 中的 router-link 身上的类名 mui-tab-item 存在兼容性问题,导致tab栏失效, ...

  2. ES-windos环境搭建(1)

    前言 由于elasticsearch为Java开发,所以它还依赖Java JDK环境,并且对版本还有要求,需要1.8(含)以上.我们首先来配置Java JDK环境. JDK简介 JDK是Java语言的 ...

  3. SVN上传文件过程中出现错误“不知道这样的主机”

    在虚拟机中安装完成VisualSVN Server,并且在本地客户端也安装好了TortoiseSVN,在上传文件到服务器的过程中出现错误“不知道这样的主机”,如下图: 地址https://admin- ...

  4. Android 实现九宫格、点击图片放大全屏浏览等

    项目GitHub地址https://github.com/tikeyc/TNinePlaceGridView_Android https://github.com/tikeyc/TikeycAndro ...

  5. 判断后台service是否在运行

    public static boolean isServiceRunning(Context mContext,String className) { boolean isRunning = fals ...

  6. SVN提交文件冲突怎么办?

    SVN文件遇到冲突怎么解决: 1. 文件出现这个图标提示后,你先把这个文件备份,备份到其他目录. 2. 把SVN目录下的这个文件还原为服务器上的最新版本或者直接删除重新更新到最新版本. 3. 把你备份 ...

  7. 明白这十个故事-->你也就参悟了人生 .

    1.断箭 不相信自己的意志,永远也做不成将军.  春秋战国时代,一位父亲和他的儿子出征打仗.父亲已做了将军,儿子还只是马前卒.又一阵号角吹响,战鼓雷鸣了,父亲庄严地托起一个箭囊,其中插着一只箭.父亲郑 ...

  8. Java MVC 增删改查 实例

    需求:实现增加新部门的功能,对应数据库表示Oracle的dept表 一.Java MVC 增 实现: 1.视图层(V):注册部门 deptAdd.jsp 在注册新部门页面只需输入“部门名称”和“城市” ...

  9. LR中webservice服务测试的脚本

    Action(){ /* 测试QQ是否在线的功能接口 输入参数:QQ号码 String,默认QQ号码:8698053. 返回数据:String,Y = 在线:N = 离线:E = QQ号码错误:A = ...

  10. NBUT 1115 Cirno's Trick (水)

    题意: 给出多个double数,去掉其最小的和最大的,再对余下的求均值. 思路: 再输入时将最大和最小去掉,顺便统计非最值的和,输出时除一下个数即可. #include <bits/stdc++ ...