一、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 保存