nginx deny ip段低版本不支持deny和allow访问控制么

&&国之画&&&&&&
版权所有 京ICP备号-2
迷上了代码!文章数:85
评论数:42
访问量:36357
注册日期:
阅读量:5863
阅读量:12276
阅读量:319567
阅读量:1030930
51CTO推荐博文
一.访问控制模块详解Nginx的访问控制模块是ngx_http_access_module,实际上deny和allow指令属于ngx_http_access_module.我们想控制某个uri或者一个路径不让人访问,就需要依赖此模块.1.模块安装:编译安装nginx时不需要指定访问控制模块参数,这个模块已经内置在了nginx中,除非你安装中使用了--without-http_access_module。2.模块指令:允许:allow
Syntax:allow&address&|&CIDR&|&unix:&|&
Default:―
Context:http,&server,&location,&limit_except允许某个ip或者一个ip段访问.如果指定unix:,那将允许socket的访问.注意:unix在1.5.1中新加入的功能,如果你的版本比这个低,请不要使用这个方法。禁止:deny
Syntax:deny&address&|&CIDR&|&unix:&|&
Default:―
Context:http,&server,&location,&limit_except禁止某个ip或者一个ip段访问.如果指定unix:,那将禁止socket的访问.注意同上。3.官网实例:location&/&{
&&&&deny&&192.168.1.1;
&&&&allow&192.168.1.0/24;
&&&&allow&10.1.1.0/16;
&&&&allow&::/32;
&&&&deny&&
}解释:从上到下的顺序,类似iptables。匹配到了便跳出。如上的例子先禁止了192.168.1.1,接下来允许了3个网段,其中包含了一个ipv6,最后未匹配的IP全部禁止访问. &二.用户认证模块详解nginxd的用户认证模块是ngx_http_auth_basic_module,我们需要使用用户认证模块来控制用户访问特定页面.1.模块安装编译安装nginx时不需要指定访问控制模块参数,这个模块已经内置在了nginx中。2.模块指令:认证协议:
Syntax:auth_basic&string&|&
Default:auth_basic&
Context:http,&server,&location,&limit_except认证文件:
Syntax:auth_basic_user_file&
Default:―
Context:http,&server,&location,&limit_except3.官网实例:location&/&{
&&&&auth_basic&&&&&&&&&&&"closed&site";
&&&&auth_basic_user_file&conf/
}解释:采用基本认证模块,认证名称是closed site,认证文件存放在是nginx配置文件路径下的conf/htpasswd。三.对nginx的内置状态页的访问进行访问控制和用户认证。1.nginx内置状态页介绍nginx和php-fpm一样内建了一个状态页,对于想了解nginx的状态以及监控nginx非常有帮助。2.启用nginx status配置并只允许172.16.0.0/16的网段访问在虚拟主机里面加上location或者你希望能访问到的主机里面。[root@www&~]#&vim&/etc/nginx/extra/nginx-vhost.conf&
&&&&&&&&listen&&&*:80&default_
&&&&&&&&server_name&;
&&&&&&&&index&index.html&index.htm&;
&&&&&&&&root&&/www/vhosts/www1;
&&&&&&&&access_log&&/var/log/nginx/.log&main&;
&&&&&&&&location&/status&{
&&&&&&&&&&&&&&&&stub_status&
&&&&&&&&&&&&&&&&allow&172.16.0.0/16;
&&&&&&&&&&&&&&&&deny&
}2..重启nginx语法检查:[root@www&~]#&service&nginx&configtest
nginx:&the&configuration&file&/etc/nginx/nginx.conf&syntax&is&ok
nginx:&configuration&file&/etc/nginx/nginx.conf&test&is&successful重启nginx[root@www&~]#&service&nginx&restart
nginx:&the&configuration&file&/etc/nginx/nginx.conf&syntax&is&ok
nginx:&configuration&file&/etc/nginx/nginx.conf&test&is&successful
Stopping&nginx:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[&&OK&&]
Starting&nginx:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[&&OK&&]3.访问status页面:[root@www&~]#&curl&http://172.16.31.40/status
Active&connections:&1&
server&accepts&handled&requests
Reading:&0&Writing:&1&Waiting:&04.nginx status详解active&connections&C&活跃的连接数量
server&accepts&handled&requests&―&总共处理了6个连接&,&成功创建6次握手,&总共处理了5个请求
reading&―&读取客户端的连接数.
writing&―&响应数据到客户端的数量
waiting&―&开启&keep-alive&的情况下,这个值等于&active&C&(reading+writing),&意思就是&Nginx&已经处理完正在等候下一次请求指令的驻留连接.5.虚拟开启用户认证[root@www&~]#&vim&/etc/nginx/extra/nginx-vhost.conf&
&&&&&&&&listen&&&*:80&default_
&&&&&&&&server_name&;
&&&&&&&&index&index.html&index.htm&;
&&&&&&&&root&&/www/vhosts/www1;
&&&&&&&&access_log&&/var/log/nginx/.log&main&;
&&&&&&&&location&/status&{
&&&&&&&&&&&&&&&&stub_status&
&&&&&&&&&&&&&&&&auth_basic&"Nginx-status";
&&&&&&&&&&&&&&&&auth_basic_user_file&/etc/nginx/.
&&&&&&&&&&&&&&&&allow&172.16.0.0/16;
&&&&&&&&&&&&&&&&deny&
}6.创建用户认证文件[root@www&~]#&htpasswd&-c&-m&/etc/nginx/.htpasswd&status
New&password:&
Re-type&new&password:&
Adding&password&for&user&status
[root@www&~]#&ll&-a&/etc/nginx/.htpasswd&
-rw-r--r--&1&root&root&45&Dec&27&12:33&/etc/nginx/.htpasswd7.重启nginx服务[root@www&~]#&service&nginx&restart8.输入用户名密码访问nginx状态页:[root@www&~]#&curl&-u&status:status&http://172.16.31.40/status
Active&connections:&1&
server&accepts&handled&requests
Reading:&0&Writing:&1&Waiting:&0访问成功。至此,nginx的访问控制模块与用户认证模块及开启nginx内置状态页面的知识就介绍完毕了!本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)Nginx服务器限制IP访问的各种情况全解析
作者:低调小一
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Nginx服务器限制IP访问的各种情况全解析,包括限制同一IP在一段时间内的访问次数和全局限IP访问以及限制IP访问指定目录等情况,需要的朋友可以参考下
限制某个IP同一时间段的访问次数
如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候。其中CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包, 造成对方服务器资源耗尽,一直到宕机崩溃。
&& cc攻击一般就是使用有限的ip数对服务器频繁发送数据来达到攻击的目的,nginx可以通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同一时间段的访问次数来防cc攻击。
HttpLimitReqModul用来限制连单位时间内连接数的模块,使用limit_req_zone和limit_req指令配合使用来达到限制。一旦并发连接超过指定数量,就会返回503错误。
&& HttpLimitConnModul用来限制单个ip的并发连接数,使用limit_zone和limit_conn指令
这两个模块的区别前一个是对一段时间内的连接数限制,后者是对同一时刻的连接数限制
HttpLimitReqModul 限制某一段时间内同一ip访问数实例
#定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,
#以$binary_remote_addr 为key,限制平均每秒的请求为20个,
#1M能存储16000个状态,rete的值必须为整数,
#如果限制两秒钟一个请求,可以设置成30r/m
limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
location {
#限制每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秒执行。
limit_req zone=allips burst=5
HttpLimitZoneModule 限制并发连接数实例
limit_zone只能定义在http作用域,limit_conn可以定义在http server location作用域
#定义一个名为one的limit_zone,大小10M内存来存储session,
#以$binary_remote_addr 为key
#nginx 1.18以后用limit_conn_zone替换了limit_conn
#且只能放在http作用域
limit_conn_zone
one $binary_remote_addr 10m;
location {
limit_conn one 20;
#连接数限制
#带宽限制,对单个连接限数,如果一个ip两个连接,就是500x2k
limit_rate 500k;
服务器全局限IP
#vi nginx.conf
allow 10.57.22.172;
指定目录的IP访问限制
&&& 正则表达式中()和|的使用,()代表一个原则,|代表或
&&& nginx的location匹配规则中,有一条按照文件顺序进行正则匹配(ps:可以把需要匹配的目录放置在server模块开始的位置)
&&& allow和deny的使用
根目录/srv/
test1 / --
{hello.php,1.php,2.php}
对于test1,test2目录,只允许指定的192.168.1.101ip地址访问,禁止其它ip访问
对于其他目录的php程序,所有ip地址均可以访问
实现的nginx配置文件
#指定目录实行白名单访问机制
location ~ ^/(test1|test2)/ {
allow 192.168.1.101;
root /srv/;
fastcgi_param
include /etc/nginx/fastcgi_
fastcgi_pass
# proxy the PHP scripts to fpm
location ~ \.php$ {
root /srv/;
fastcgi_param
include /etc/nginx/fastcgi_
fastcgi_pass
  1. deny 一定要加一个ip,否则直接跳转到403,不往下执行了;如果403默认页是同一域名下,会造成死循环访问;
  2. allow的ip段
  从允许访问的段位从小到大排列,如127.0.0.0/24 下面才能是10.10.0.0/16
  24表示子网掩码:255.255.255.0
  16表示子网掩码:255.255.0.0
  8表示子网掩码:255.0.0.0
  3.结尾 表示除了上面allow的其他都禁止
代码如下:& deny 192.168.1.1;&&&&&&&&&& allow 127.0.0.0/24;&&&&&&&&&& allo w 192.168.0.0/16;&&&&&&&&&& allow 10.10.0.0/16;&&&&&&&&&&
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具linux(5)
本文来源于实验楼linux web运维(nginx)实战课程,原文链接:/courses/95,
对其进行总结回顾,如有侵权,私信删除。
1.什么是nginx
nginx是一款高性能的HTTP和反向代理服务器软件,下图是w3techs公布的全球网站服务器软件统计报告
2.为什么选择nginx
Nginx 和 Apache 相同点:
同是HTTP服务器软件,都采用模块化结构设计支持通用语言接口,如PHP,Python等支持正向代理和反向代理支持虚拟主机及ssl加密传输支持缓存及压缩传输支持URL重写模块多,扩展性强多平台支持
Nginx的优势
轻量级 安装文件小 运行时CPU内存使用率低性能强 支持多核,处理静态文件效率高,内核采用的poll模型最大可以支持50K并发连接支持热部署 同时启动速度快,可以在不间断服务的情况下对软件和配置进行升级负载均衡 支持容错和健康检查代理功能强大 支持无缓存的反向代理,同时支持IMAP/POP3/SMTP的代理
3.工作原理
Nginx由内核和一系列模块组成,内核提供web服务的基本功能,如启用网络协议,创建运行环境,接收和分配客户端请求,处理模块之间的交互。Nginx的各种功能和操作都由模块来实现。Nginx的模块从结构上分为核心模块、基础模块和第三方模块。
核心模块: HTTP模块、EVENT模块和MAIL模块基础模块: HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块第三方模块: HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块及用户自己开发的模块
这样的设计使Nginx方便开发和扩展,也正因此才使得Nginx功能如此强大。Nginx的模块默认编译进nginx中,如果需要增加或删除模块,需要重新编译Nginx,这一点不如Apache的动态加载模块方便。如果有需要动态加载模块,可以使用由淘宝网发起的web服务器Tengine,在nginx的基础上增加了很多高级特性,完全兼容Nginx,已被国内很多网站采用。
4.nginx 处理连接过程
& nginx 不会为每个连接派生进程或线程,而是由 worker 进程通过监听共享套接字接受新请求,并且使用高效的循环来处理数千个连接。Nginx 不使用仲裁器或分发器来分发连接,这个工作由操作系统内核机制完成。监听套接字在启动时就完成初始化,worker 进程通过这些套接字接受、读取请求和输出响应。
当 nginx 在启动后,会有一个 master 进程和多个 worker 进程。master进程主要用来管理worker进程,master 要做的就是:接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动重新启动新的 worker
主要完成如下工作:
读取并验证配置信息;创建、绑定及关闭套接字;启动、终止 worker 进程及维护 worker 进程的个数;无须中止服务而重新配置工作;控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本;重新打开日志文件;编译嵌入式 perl 脚本
对于基本的网络事件,则是放在 worker 进程中来处理了。多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求(一对一)。然而 nginx 没有专门地仲裁或连接分布的 worker,这项工作是由操作系统内核机制完成的。在启动时,创建一组初始的监听套接字,HTTP 请求和响应之时,worker 连续接收、读取和写入套接字。
worker 进程主要完成的任务包括:
接收、传入并处理来自客户端的连接;提供反向代理及过滤功能;nginx 任何能完成的其它任务
举例说明一个完整请求如何通过互相协作来实现的
既然 worker 进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供 80 端口的 http 服务时,一个连接请求过来,每个进程都有可能处理这个连接。那么问题来了,到底最后怎样处理,是由什么决定的呢?首先,每个 worker 进程都是从 master 进程 fork 过来,在 master 进程里面,先建立好需要 listen 的 socket(listenfd)之后,然后再 fork 出多个 worker 进程。所有 worker 进程的 listenfd 会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有
worker 进程会在注册 listenfd 读事件前抢 accept_mutex,抢到互斥锁的那个进程注册 listenfd 读事件,然后在读事件里调用 accept 接受该连接。当一个 worker 进程在 accept 这个连接之后,就开始读取请求、解析请求、处理请求。产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到:一个请求,完全由 worker 进程来处理,而且只在一个 worker 进程中处理。
也许你还有个疑问,那就是 nginx 采用多 worker 的方式来处理请求,每个 worker 里面只有一个主线程,那能够处理的并发数很有限啊,多少个 worker 就能处理多少个并发,何来高并发呢?然而,这就是 nginx 的高明之处,nginx 采用了异步非阻塞的方式来处理请求,也就是说,nginx 是可以同时处理成千上万个请求的。
异步非阻塞
异步的概念是和同步相对的,也就是不同事件之间不是同时发生的。非阻塞的概念是和阻塞对应的,阻塞是事件按顺序执行,每一事件都要等待上一事件的完成,而非阻塞是如果事件没有准备好,这个事件可以直接返回,过一段时间再进行处理询问,这期间可以做其他事情。
5.nginx 的优化
tcp_nodelay 配置 nginx 不要缓存数据,应该快速的发送小数据——这仅仅应该用于频繁发送小的碎片信息而无需立刻获取响应的、需要实时传递数据的应用中。
keepalive_timeout 指定了与客户端的 keep-alive 链接的超时时间。服务器会在这个时间后关闭链接。我们可以降低这个值,以避免让 worker 过长时间的忙碌。
2、logging setings
access_log 确定了 nginx 是否保存访问日志。将这个设置为关闭可以降低磁盘 IO 而提升速度。
error_log 设置 nginx 应当记录临界错误。
修改好配置文件以后,务必记得使用:
sudo service nginx reload
来使配置文件生效。
6.流量及并发连接数限制
1)指令使用及配置修改
我们需要在 http 的 server 中加一个 location,就好比之前我们做的简单的 echo 模块,格式为:
location /刚下好的测试文件夹/ {
root /刚才下载测试文件的目录/;
接下来就是调用命令实现流量限制。nginx 的模块中早就写好了对应的命令,我们只需要调用就好。
实现流量限制由两个指令 limit_rate 和 limit_rate_after 共同完成:
limit_rate
语法: limit_
默认值: limit_rate 0;
作用域: http, server, location, if in location
命令概述:限制向客户端传送响应的速率限制。参数 rate 的单位是字节/秒,设置为 0 将关闭限速。 nginx 按连接限速,所以如果某个客户端同时开启了两个连接,那么客户端的整体速率是这条指令设置值的 2 倍。
limit_rate_after
语法: limit_rate_
默认值: limit_rate_after 0;
作用域:http, server, location, if in location
设置不限速传输的响应大小。当传输量大于此值时,超出部分将限速传送。
作用范围:http,server,location,if inlocation
要是想了解更多,这里有更加详细的命令信息
讲了要使用的指令 我们接下来就实战配置
这是小编实验时的配置(传输量限制为 3m,速率限制为 20k/s):
(2)配置之前与配置之后的测试
接下来就是测试
wgethttp://本机地址/seven/seven.mp4
本机地址用 ifconfig 来查看
修改配置之前,速率没有限制:
修改配置之后,可见由于传输量大于 3m,超出部分的传输速率已经被限制在 20k/s:
也许你已经发现配置之后刚开始的时候传输速度很高,因为,传输量大于设定值的部分才会受到限制。这就说明,我们两个命令都发挥了作用,这也就完成了我们第一个实战。
2.实现并发连接数限制的具体配置
(1)指令使用及配置文件修改
这个的配置是基于 ngx_http_limit_zone_module 模块的,要简单完成并发限制,我们要涉及到 limit_conn_zone 和 limit_conn 这两个指令:
limit_conn_zone
语法: limit_conn_zone zone_name $variable the_size
默认值: no
作用域: http
本指令定义了一个数据区,里面记录会话状态信息。 variable 定义判断会话的变量;the_size 定义记录区的总容量。
limit_conn
语法: limit_conn zone_name the_size
默认值: no
作用域: http, server, location
指定一个会话最大的并发连接数。 当超过指定的最发并发连接数时,服务器将返回 &Service unavailable& (503)。
配置示例:
limit_conn_zone
$binary_remote_addr
zone=one:10m;
location /seven/ {
limit_conn
定义一个叫“one”的记录区,总容量为 10M,以变量 $binary_remote_addr 作为会话的判断基准(即一个地址一个会话)。 限制 /seven/ 目录下,一个会话只能进行一个连接。 简单点,就是限制 /seven/ 目录下,一个 IP 只能发起一个连接,多过一个,一律 503。
你可以注意到了,在这里使用的是$binary_remote_addr 而不是 $remote_addr。$remote_addr 的长度为 7 至 15 bytes,会话信息的长度为 32 或 64 bytes。 而 $binary_remote_addr 的长度为 4 bytes,会话信息的长度为 32 bytes。 当 zone 的大小为 1M 的时候,大约可以记录 32000 个会话信息(一个会话占用
32 bytes)。
由于环境的原因这里没有办法测试只是让大家了解,限制并发连接数 nginx 的对应模块的配置,如果大家有需要,可以进一步参照&这里有更详细的讲解。
7.访问控制及 DDOS 预防
1.访问控制配置
基于各种原因,我们要进行访问控制。比如说,一般网站的后台都不能让外部访问,所以要添加 IP 限制,通常只允许公司的 IP 访问。访问控制就是指只有符合条件的 IP 才能访问到这个网站的某个区域。
涉及模块:ngx_http_access_module
模块概述:允许限制某些 IP 地址的客户端访问。
对应指令:
语法: allow address | CIDR | unix: |
默认值: —
作用域: http, server, location, limit_except
允许某个 IP 或者某个 IP 段访问。如果指定 unix,那将允许 socket 的访问。注意:unix 在 1.5.1 中新加入的功能,如果你的版本比这个低,请不要使用这个方法。
语法: deny address | CIDR | unix: |
默认值: —
作用域: http, server, location, limit_except
禁止某个 IP 或者一个 IP 段访问。如果指定 unix,那将禁止 socket 的访问。注意:unix 在 1.5.1 中新加入的功能,如果你的版本比这个低,请不要使用这个方法。
配置范例:
location / {
deny192.168.1.1;
allow192.168.1.0/24;
allow10.1.1.0/16;
allow2001:0db8::/32;
规则按照顺序依次检测,直到匹配到第一条规则。 在这个例子里,IPv4 的网络中只有 10.1.1.0/16 和 192.168.1.0/24 允许访问,但 192.168.1.1 除外;对于 IPv6 的网络,只有 ::/32 允许访问。
ngx_http_access_module 配置允许的地址能访问,禁止的地址被拒绝。这只是很简单的访问控制,而在规则很多的情况下,使用 ngx_http_geo_module 模块变量更合适。这个模块大家下来可以了解 :&
2.DDOS 预防配置
DDOS 的特点是分布式,针对带宽和服务攻击,也就是四层流量攻击和七层应用攻击,相应的防御瓶颈四层在带宽,七层的多在架构的吞吐量。对于七层的应用攻击,我们还是可以做一些配置来防御的,使用 nginx 的 http_limit_conn 和 http_limit_req 模块通过限制连接数和请求数能相对有效的防御。
ngx_http_limit_conn_module 可以限制单个 IP 的连接数
ngx_http_limit_req_module 可以限制单个 IP 每秒请求数
配置方法:
(1). 限制每秒请求数
涉及模块:ngx_http_limit_req_module
通过漏桶原理来限制单位时间内的请求数,一旦单位时间内请求数超过限制,就会返回 503 错误。
配置范例:
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
~ \.php$ {
limit_req zone=one burst=5
必要配置说明(上一部分解释过的就不再解释):
$binary_remote_addr 二进制远程地址
rate=10r/s; 限制频率为每秒 10 个请求
burst=5 允许超过频率限制的请求数不多于 5 个,假设 1、2、3、4 秒请求为每秒 9 个,那么第 5 秒内请求 15 个是允许的;反之,如果第一秒内请求 15 个,会将 5 个请求放到第二秒,第二秒内超过 10 的请求直接 503,类似多秒内平均速率限制。
nodelay 超过的请求不被延迟处理,设置后 5(不延时)+10(延时)个请求在 1 秒内处理。(这只是理论数据,最多的情况)
(2).限制 IP 连接数
上一章讲过,我们就直接写出来
limit_conn_zone $binary_remote_addr zone=addr:10m; //上面讲过
location /操作目录/ {
limit_conn addr 1;
(3).白名单设置
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;
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 的会话状态中 --& 受到限制。
3.动手测试 DDOS 预防配置
下面我们就来测一下刚刚的配置是否起到了作用。
1.安装所有测试所需的软件(源码安装 nginx,apt 安装 php5-fpm,apt 安装 apach-u) 为了便于修改配置文件,这里选择源码安装 nginx:
wget http://labfile./nginx-1.7.9.tar.gz
接下来编译安装。
sudo apt-get install apache2-utils
sudo apt-get install php5-fpm
安装好以后 分别启动 php5 和 nginx。
2.写一个测试的 php 文件,修改 nginx 配置文件,使其能正常访问。
在/home/shiyanlou 目录下写一个 test.php,内容如下:
nginx 配置文件修改:
最后展示:
3.使用命令 ab 测试,修改配置文件前后(连接数和请求数分开测试)。
什么都没修改之前:
测试条件:
测试结果:
修改了配置文件图(记得重启 nginx)测试条件也要一样:
最后测试结果图:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:908次
排名:千里之外nginx+php 限制每个站点的目录范围,防止跨站 - 开源中国社区
当前访客身份:游客 [
当前位置:
今天偶然发现,在php脚本中可以访问服务器上任何目录。
顿时一身冷汗啊。。
于是就上百度谷歌了半天,一开始就找到了一个php.ini中的open_basedir参数,设置这个参数即可限定php脚本的访问范围。
我们针对每个站点,需要php能够访问该站点所在目录以及/tmp/临时目录。
SO..看到有人这么写
open_basedir=.:/tmp/ &
冒号的作用是隔开多个路径,这里面根据字面理解,第一个点就代表当前目录。
看起来是很完美了,OK,保存配置,重启php-fpm
结果nginx 报502错误。
研究了一会,发现 . 这种相对路径写法,至少在nginx+phpfastcgi下是行不通的。
好吧,暂时妥协
open_basedir=/home/wwwroot/:/tmp/
这样总行了,将php限制在所有站点的父目录,这样至少阻止了php访问服务器上web目录以外的目录。
到了这里,还是有隐患的,只要wwwroot下任意一个站点被拿到webshell,那么其他站点将不能幸免.
不甘心哪,度娘是找不到有用的信息了,都是些垃圾复制粘贴,于是去了谷歌。
搜了一下,找到一个遇到同样问题的鬼佬,里面有人给了一个方法,成功解决。
那就是在nginx 每个server下,加上
fastcgi_param &PHP_VALUE &&open_basedir=$document_root:/tmp/&;&
重启nginx,成功!你也可以把这行代码放到fastcgi.conf里,前提是你得在server{}中包含它。
至此,nginx + php5.3 是没有问题了。
然后我又在另外一台vps上,环境是php5.2 发现此方法不生效。
所以在这里请教高手,看看能不能得到一个简单的解决方案!
共有16个答案
<span class="a_vote_num" id="a_vote_num_
那阻止了之后访问那个不被允许的目录提示什么? 403?
--- 共有 1 条评论 ---
如果php中屏蔽了错误提示后,是没有任何显示的。错误提示会告诉你open_basedir的范围
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
前几天也被这个问题搞得头疼,特别是有多个站点的虚拟主机。悲催的是服务器php是5.2.x,还不能升级。。。后来加了个apahce做后端来解决。5.3.x以上,对于这个问题解决还是很方便的。
--- 共有 1 条评论 ---
本来还打算下一台server用5.2呢,很多老的程序用的zend optimizer加密,5.3跑不起来蛋疼。
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
老车. 原来你是搞PHP的!
--- 共有 1 条评论 ---
老车是谁啊?
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
fastcgi又不是mod_php, & mod_php由apache直接调用,用户权限全部归属宿主apache, 所有站都是同一个www-data在跑,那当然存在跨站问题了。&
而fastcgi里web服务器只做数据中转,php由第三方独立进程在跑, 不同的站点用不同的用户/组启动相应的fastcgi进程组, 怎么可能会存在跨站
最怕的是明明用的fastcgi, 还像mod_php那样所有网站用同一个用户组启动fastcgi进程组, &那真叫自作孽......
--- 共有 4 条评论 ---
(3年前)&nbsp&
一直用的是mod_php,它和fastcgi有什么区别?谢谢
(3年前)&nbsp&
网站a, groupadd+useradd一个a/a, 创建一个/web/site_a的目录,权限归属于a:a,
用这个a用户启动相应的fastcgi进程(比如fpm),
网站b就照这样操作b:b, c就c:c
(3年前)&nbsp&
求教,怎么为不同的站点启用不同的用户,并且将浏览权限限制在站点目录内
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
引用来自“勇者天空”的答案
fastcgi又不是mod_php, & mod_php由apache直接调用,用户权限全部归属宿主apache, 所有站都是同一个www-data在跑,那当然存在跨站问题了。&
而fastcgi里web服务器只做数据中转,php由第三方独立进程在跑, 不同的站点用不同的用户/组启动相应的fastcgi进程组, 怎么可能会存在跨站
最怕的是明明用的fastcgi, 还像mod_php那样所有网站用同一个用户组启动fastcgi进程组, &那真叫自作孽......
运行php-fpm进程用户和网站目录用户相同 明显不安全.
如果攻击者利用PHP程序漏洞上传WebShell脚本,马上就可以修改网站文件,
这样跟在Win上开发一样,脚本对网站目录完全可写,权限简直是形同虚设.
nginx和php-fpm以nginx用户运行就很合适.
另外,请问php-fpm.conf该怎么配置多用户,而且配置后该怎么重启?
不同虚拟主机用不同用户,然后开PHP安全模式就足矣应付跨站问题.
--- 共有 2 条评论 ---
: 使用低权限账户来执行脚本是绝对正确的做法,例如上面同学提到的和httpd账户保持一致,因为,网站拥有者账户是作为网站文件的管理员账户,而httpd进程所属账户的权限则代表了普通来访者的权限,也即是匿名账户无需认证即可访问到你网站所需要具备的权限,而这两者之间是应该严格划分的,否则你搞再多安全措施也是白搭。
(3年前)&nbsp&
问一下,如果是nobody的话,那么php如何修改文件?很多时候是需要用php操作文件的啊。
安全模式开启后,会影响到很多功能吗?
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
引用来自“eechen”的答案引用来自“勇者天空”的答案 fastcgi又不是mod_php, & mod_php由apache直接调用,用户权限全部归属宿主apache, 所有站都是同一个www-data在跑,那当然存在跨站问题了。&
而fastcgi里web服务器只做数据中转,php由第三方独立进程在跑, 不同的站点用不同的用户/组启动相应的fastcgi进程组, 怎么可能会存在跨站
最怕的是明明用的fastcgi, 还像mod_php那样所有网站用同一个用户组启动fastcgi进程组, &那真叫自作孽...... 运行php-fpm进程用户和网站目录用户相同 明显不安全.
如果攻击者利用PHP程序漏洞上传WebShell脚本,马上就可以修改网站文件,
这样跟在Win上开发一样,脚本对网站目录完全可写,权限简直是形同虚设.
默认nginx和php-fpm以nobody用户运行就很合适.
另外,请问php-fpm.conf该怎么配置多用户,而且配置后该怎么重启?
不同虚拟主机用不同用户,然后开PHP安全模式就足矣应付跨站问题.
: 在缓存cache和上传upload目录设置权限为777, 这样 apache/mod_php 和 nginx/fastcgi 都能对这些目录进行写操作, 为了避免这些可写的目录被上传 WebShell PHP脚本执行, 可以在这些目录禁止解析PHP并且拒绝外部访问PHP文件, 比如 Apache 可以在这些目录的.htaccess中加入: php_flag engine off &Files ~ &\.php$&& order allow,deny deny from all &/Files&
<span class="a_vote_num" id="a_vote_num_
PHP安全模式:&
安全模式比对的是脚本的拥有者是否和被操作的文件的拥有者,相同才会执行, 而且安全模式还会禁用掉部分函数: http://cn2.php.net/manual/zh/features.safe-mode.functions.php
其实不用安全模式,在对应虚拟主机配置open_basedir做目录树限制更简单, 这样PHP所能打开的文件限制在指定的目录树,也能起到防护作用. 接着用disable_functions手动指定需要禁用的函数也很方便.
--- 共有 2 条评论 ---
: 手动管理只能麻烦点了, 不过像BlueHost这些虚拟主机商应该有自己的管理面板, 在用户购买后自动生成这些主机配置.
(3年前)&nbsp&
5.3的php.ini支持
[HOST=XXX]
open_basedir=
[HOST=BBBB]
open_basedir=
这种形式的参数来对每个域名设置open-basedir..
就是操作起来麻烦,一个个站点去添加
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
引用来自“eechen”的答案引用来自“eechen”的答案引用来自“勇者天空”的答案 fastcgi又不是mod_php, & mod_php由apache直接调用,用户权限全部归属宿主apache, 所有站都是同一个www-data在跑,那当然存在跨站问题了。&
而fastcgi里web服务器只做数据中转,php由第三方独立进程在跑, 不同的站点用不同的用户/组启动相应的fastcgi进程组, 怎么可能会存在跨站
最怕的是明明用的fastcgi, 还像mod_php那样所有网站用同一个用户组启动fastcgi进程组, &那真叫自作孽...... 运行php-fpm进程用户和网站目录用户相同 明显不安全.
如果攻击者利用PHP程序漏洞上传WebShell脚本,马上就可以修改网站文件,
这样跟在Win上开发一样,脚本对网站目录完全可写,权限简直是形同虚设.
默认nginx和php-fpm以nobody用户运行就很合适.
另外,请问php-fpm.conf该怎么配置多用户,而且配置后该怎么重启?
不同虚拟主机用不同用户,然后开PHP安全模式就足矣应付跨站问题.
: 在缓存cache和上传upload目录设置权限为777, 这样 apache/mod_php 和 nginx/fastcgi 都能对这些目录进行写操作, 为了避免这些可写的目录被上传 WebShell PHP脚本执行, 可以在这些目录禁止解析PHP并且拒绝外部访问PHP文件, 比如 Apache 可以在这些目录的.htaccess中加入: php_flag engine off &Files ~ &\.php$&& order allow,deny deny from all &/Files&
有时cache缓存目录里的php脚本是需要解析的,这时不能禁用解析,但需要禁止外部访问该目录,这时可以在htaccess中添加:
&Limit GET POST PUT& Order Allow,Deny Deny from All &/Limit&
--- 共有 2 条评论 ---
: Nginx有HttpAccessModule模块http://wiki.nginx.org/HttpAccessModule
(3年前)&nbsp&
可是不用apache环境,只用nginx
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
是版本问题吧。5.3以上都支持你这方法&
--- 共有 1 条评论 ---
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
找到方案没?
--- 共有 2 条评论 ---
: 你的5.2也是nginx+php-fpm?
(3年前)&nbsp&
5.2仍然没有找到好的办法
(3年前)&nbsp&
更多开发者职位上
有什么技术问题吗?
吾爱的其它问题}

我要回帖

更多关于 apache allow deny 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信