一、Nginx访问限制

限制访问请求


TCP泛洪攻击(与服务进行三次握手,发送虚假IP给服务器,使得服务器好像是有人访问,把真正要访问的用户堵在外面,无法访问,服务器分出多个子进程处理请求,网络资源的消耗) 有效防御: 公司硬件防火墙 > 网络安全产品 > 个人(Nginx访问限制)

模块:ngx_http_limit_req_module

测试:

-------未开启请求限制--------
1. 安装压力测试工具: yum install -y httpd-tools

2. 域名解析 vim /etc/hosts  
            # 192.168.7.131(本机IP)   a.com

3. 模拟访问请求: ab -n 100 -c 10 http://a.com/    #向a.com网站发起100次请求,分10次发送
   观察: Complete requests: 100    #100次请求已成功
         Failed requests: 0    #失败0次

-------开启请求限制--------  
定义: vim /etc/nginx/nginx.conf
        http{
             limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
             #binary(以二进制方式存储用户IP地址) req_zone(策略名,自定义) 
             #10m(在内存中启动10m空间,用于存放用户IP地址,可以存下1千万个IP)
             #rate=1r/s(超过一秒的请求都会被丢弃,1秒发一个,根据需求调动)
        }
引用: vim /etc/nginx/conf.d/a.com.conf
        server {
        location / {
            root /a.com;
            index index.html index.htm;
            limit_req zone=req_zone;      #引用上方的策略名
            #limit_req zone=req_zone burst=5;
            #limit_req zone=req_zone burst=5 nodelay; 
                 }
          }
          
4. 重启服务,再次测试: ab -n 100 -c 10 http://a.com/ 
    观察: Complete requests: 1    #1次请求已成功
          Failed requests: 99    #失败99次
    原因:因为服务器处理请求时毫秒级,限制1秒一次。

5. 观察错误日志: tail -f /var/log/nginx/error.log
    发现大量error

限制连接数量

目的:通过IP地址,限制链接(TCP)。但是实验环境无法测试(用到多台主机)

模块:ngx_http_limit_conn_module

测试:

定义:vim  /etc/nginx/nginx.conf
    http {
    limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
    }
引用:vim /etc/nginx/conf.d/a.com.conf
    server {
    location / {
        ...
        limit_conn conn_zone 1;
        }
    }
使用压力测试工具:  ab -n 100 -c 10 http://服务器IP地址/
效果不明显。
作业:去了解开源压力测试工具

二、Nginx访问控制

控制IP地址

目的:对访问的主机IP进行控制,允许与拒绝主机进行访问( allow / deny )。

模块:ngx_http_access_module

范围:

测试:

vim /etc/nginx/conf.d/a.com.conf
    server {
  allow 192.168.178.1;   #放行,白名单
  allow 192.168.178.131; #放行
  deny all;  #拒绝一切
}
重启生效: systemctl  restart  nginx

使用不在白名单中的IP访问a.com:  访问不成功

注意:避免与之前实验冲突,注释limit_req zone=req_zone; 
     因为访问请求时页面有两个元素(两次请求),而我们限制一次请求,导致我们刷新两次后出现503错误。

控制用户

目的:开启网站身份认证后,对用户的登陆进行控制

模块:ngx_http_auth_basic_module

测试

--------建立认证文件--------
1. yum -y install httpd-tools

2. htpasswd -cm /etc/nginx/conf.d/passwd user10   # 后面按照提示输入密码
        # -c 创建文件    user10  自定义用户名
3. htpasswd -m /etc/nginx/conf.d/passwd user20   #因为文件也存在,所以-m就可以了

4. cat /etc/nginx/conf.d/passwd  #观察口令文件是否生成。已生成
    user10:$apr1$UE/tLtDM$nVm686kAMYb/ArqQDUi8U/
    user20:$apr1$bmn0E/gK$enkXKb2V5uFvUy9wdIHlP.
    
--------启用认证--------
vim  /etc/nginx/conf.d/a.com.conf
    server{
            auth_basic "nginx access test!";    #提示消息
            auth_basic_user_file /etc/nginx/conf.d/passwd;    #引用认证文件
    }

重启生效: systemctl  restart  nginx

浏览器访问a.com: http://a.com/    #输入用户名与密码即可 前提a.com要先做好域名解析
在真实计算机上做好域名解析
C:\Windows\System32\drivers\etc\hosts   
输入:
 
 192.168.67.131(虚拟机IP)     a.com   保存