• Nginx访问控制


    1.访问控制

    涉及模块: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 中新加入的功能,如果你的版本比这个低,请不要使用这个方法。

    location / {
        deny  192.168.1.1;
        allow 192.168.1.0/24;
        allow 10.1.1.0/16;
        allow 2001:0db8::/32;
        deny  all;
    }
    

    2.DDOS预防

    DDOS 的特点是分布式,针对带宽和服务攻击,也就是四层流量攻击和七层应用攻击,相应的防御瓶颈四层在带宽,七层的多在架构的吞吐量。对于七层的应用攻击,我们还是可以做一些配置来防御的,使用 nginx 的 http_limit_conn 和 http_limit_req 模块通过限制连接数和请求数能相对有效的防御。

    ngx_http_limit_conn_module 可以限制单个 IP 的连接数

    ngx_http_limit_req_module 可以限制单个 IP 每秒请求数


    ngx_http_limit_req_module模块通过漏桶原理来限制单位时间内的请求数,一旦单位时间内请求数超过限制,就会返回503错误。配置需要在两个地方设置:

    nginx.conf的http段内定义触发条件,可以有多个条件 在location内定义达到触发条件时nginx所要执行的动作

    ngx_http_limit_req_module模块通过漏桶原理来限制单位时间内的请求数,一旦单位时间内请求数超过限制,就会返回503错误。配置需要在两个地方设置:
    
    nginx.conf的http段内定义触发条件,可以有多个条件 在location内定义达到触发条件时nginx所要执行的动作
    

    参数说明

    $binary_remote_addr 二进制远程地址,这个参数就些这个就好了,不需要改
    zone=one:10m 定义zone名字叫one,并为这个zone分配10M内存,用来存储会话(二进制远程地址),1m内存可以保存16000会话
    rate=10r/s; 限制频率为每秒10个请求
    burst=5 允许超过频率限制的请求数不多于5个,假设1、2、3、4秒请求为每秒9个,那么第5秒内请求15个是允许的,反之,如果第一秒内请求15个,会将5个请求放到第二秒,第二秒内超过10的请求直接503,类似多秒内平均速率限制。
    nodelay 超过的请求不被延迟处理,设置后15个请求在1秒内处理。

    3.白名单配置

    http_limit_conn 和 http_limit_req 模块限制了单 IP 单位时间内的连接和请求数,但是如果 Nginx 前面有 lvs 或者 haproxy 之类的负载均衡或者反向代理,nginx 获取的都是来自负载均衡的连接或请求,这时不应该限制负载均衡的连接和请求,就需要 geo 和 map 模块设置白名单。

    geo $whiteiplist  {
            default 1;
            10.11.15.161 0;
        }
    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.案例配置:

    修改/etc/nginx/nginx.conf

    http {
    
            ##
            # Basic Settings
            ##
            limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; //加入这行
            ....
            ....
    

    修改/etc/nginx/sites-available/default

        location ~ .php$ {
                    limit_req zone=one burst=5 nodelay;   //加入这行
                    root /usr/share/nginx/html;
                    fastcgi_split_path_info ^(.+.php)(/.+)$;
                    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    
                    # With php5-cgi alone:
                    #fastcgi_pass 127.0.0.1:9000;
                    # With php5-fpm:
                    fastcgi_pass unix:/var/run/php5-fpm.sock;
                    fastcgi_index index.php;
                    include fastcgi_params;
            }
    
  • 相关阅读:
    Android 图表控件的使用
    使用kotlin开发android
    Servlet 使用介绍(3)
    Servlet 使用介绍(2)
    Servlet 使用介绍(1)
    Android 中的style和Theme的使用
    Java Web工程目录结构
    IP地址解析
    Android 音视频深入 十六 FFmpeg 推流手机摄像头,实现直播 (附源码下载)
    Android 音视频深入 十五 FFmpeg 推流mp4文件(附源码下载)
  • 原文地址:https://www.cnblogs.com/tomtellyou/p/10764797.html
Copyright © 2020-2023  润新知