nginx域名访问的白名单配置梳理

本文涉及的产品
.cn 域名,1个 12个月
简介:

在日常运维工作中,会碰到这样的需求:设置网站访问只对某些ip开放,其他ip的客户端都不能访问。可以通过下面四种方法来达到这种效果:
1)针对nginx域名配置所启用的端口(比如80端口)在iptables里做白名单,比如只允许100.110.15.16、100.110.15.17、100.110.15.18访问.但是这样就把nginx的所有80端口的域名访问都做了限制,范围比较大!

1
2
3
4
5
[root@china ~] # vim /etc/sysconfig/iptables
......
-A INPUT -s 100.110.15.16 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -s 100.110.15.17 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -s 100.110.15.18 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

2)如果只是针对nginx下的某一个域名进行访问的白名单限制,那么可以在nginx的配置文件里进行设置,利用$remote_addr参数进行访问的分发限制,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
[root@china vhosts] # cat testwww.wangshibo.com.conf
server {
         listen       80;
         server_name  testwww.wangshibo.com;
         root  /var/www/vhosts/testwww .wangshibo.com /httpdocs/main ;
 
 
         access_log   /var/www/vhosts/testwww .wangshibo.com /logs/access .log  main;
         error_log   /var/www/vhosts/testwww .wangshibo.com /logs/error .log;
 
 
         ##白名单设置,只允许下面三个来源ip的客户端以及本地能访问该站。主要是下面这三行
         if  ($remote_addr !~ ^(100.110.15.16|100.110.15.17|100.110.15.18|127.0.0.1)) {
          rewrite ^.*$  /maintence .php last;
         }
 
         location / {
             try_files $uri $uri/ @router;
             index  index.php;
         }
     
 
         error_page   500 502 503 504   /50x .html;
 
         location @router {
             rewrite ^.*$  /index .php last;
         }
 
 
         location ~ \.php$ {
             fastcgi_pass   127.0.0.1:9001;
             fastcgi_read_timeout 30;
             fastcgi_index  index.php;
             fastcgi_param  SCRIPT_FILENAME   /scripts $fastcgi_script_name;
             #include        fastcgi_params;
             include        fastcgi.conf;
         }
 
     }
 
 
错误页面内容设置:
[root@china vhosts] # cat /var/www/vhosts/testwww.wangshibo.com/main/maintence.html
<html>
< head >
<meta http-equiv= "Content-Type"  content= "text/html; charset=utf-8" >
<meta name= "viewport"  content= "width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" >
< /head >
<body>
网站临时维护中,请稍后访问...
< /body >
< /html >

3)也可以使用$http_x_forwarded_for参数进行访问的分发限制,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
server {
         listen       80;
         server_name  testwww.wangshibo.com;
         root  /var/www/vhosts/testwww .wangshibo.com /httpdocs/main ;
 
 
         access_log   /var/www/vhosts/testwww .wangshibo.com /logs/access .log  main;
         error_log   /var/www/vhosts/testwww .wangshibo.com /logs/error .log;
 
 
   ##白名单设置,只允许下面三个来源ip的客户端以及本地能访问该站。
        if  ($http_x_forwarded_for !~ ^(100.110.15.16|100.110.15.17|100.110.15.18|127.0.0.1)) {
            rewrite ^.*$   /maintence .php last;
         }
         
         
         location / {
             try_files $uri $uri/ @router;
             index  index.php;
         }
     
 
         error_page   500 502 503 504   /50x .html;
 
         location @router {
             rewrite ^.*$  /index .php last;
         }
 
 
         location ~ \.php$ {
             fastcgi_pass   127.0.0.1:9001;
             fastcgi_read_timeout 30;
             fastcgi_index  index.php;
             fastcgi_param  SCRIPT_FILENAME   /scripts $fastcgi_script_name;
             #include        fastcgi_params;
             include        fastcgi.conf;
         }
 
     }

4)还可以利用nginx的allow、deny参数进行访问限制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[root@china vhosts] # cat testwww.wangshibo.com.conf
server {
         listen       80;
         server_name  testwww.wangshibo.com;
         root  /var/www/vhosts/testwww .wangshibo.com /httpdocs/main ;
 
 
         access_log   /var/www/vhosts/testwww .wangshibo.com /logs/access .log  main;
         error_log   /var/www/vhosts/testwww .wangshibo.com /logs/error .log;
 
         ##白名单设置,只允许下面三个来源ip的客户端以及本地能访问该站。
         allow 100.110.15.16;
         allow 100.110.15.17;
         allow 100.110.15.18;
         allow 127.0.0.1;
         deny all;
 
         location / {
             try_files $uri $uri/ @router;
             index  index.php;
         }
     
 
         error_page   500 502 503 504   /50x .html;
 
         location @router {
             rewrite ^.*$  /index .php last;
         }
 
 
         location ~ \.php$ {
             fastcgi_pass   127.0.0.1:9001;
             fastcgi_read_timeout 30;
             fastcgi_index  index.php;
             fastcgi_param  SCRIPT_FILENAME   /scripts $fastcgi_script_name;
             #include        fastcgi_params;
             include        fastcgi.conf;
         }
 
     }

---------------------------------nginx中remote_addr和x_forwarded_for参数使用说明---------------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
做网站时经常会用到remote_addr和x_forwarded_for这两个头信息来获取客户端的IP,然而当有反向代理或者CDN的情况下,这两个值就不够准确了,需要调整一些配置。
 
1)什么是remote_addr
remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的
web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web
服务器就会把remote_addr设为这台代理机器的IP。
 
2)什么是x_forwarded_for
正如上面所述,当你使用了代理时,web服务器就不知道你的真实IP了,为了避免这个情况,代理服务器通常会增加一个叫做x_forwarded_for的头信息,把连接它的客户
端IP(即你的上网机器IP)加到这个头信息里,这样就能保证网站的web服务器能获取到真实IP
 
 
-------------------使用HAProxy做反向代理----------------------
通常网站为了支撑更大的访问量,会增加很多web服务器,并在这些服务器前面增加一个反向代理(如HAProxy),它可以把负载均匀的分布到这些机器上。你的浏览器访
问的首先是这台反向代理,它再把你的请求转发到后面的web服务器,这就使得web服务器会把remote_addr设为这台反向代理的IP,为了能让你的程序获取到真实的客户端
IP,你需要给HAProxy增加以下配置:
 
option forwardfor
它的作用就像上面说的,增加一个x_forwarded_for的头信息,把你上网机器的ip添加进去
 
 
 
------------------使用Nginx的realip模块--------------------
当Nginx处在HAProxy后面时,就会把remote_addr设为HAProxy的IP,这个值其实是毫无意义的,你可以通过nginx的realip模块,让它使用x_forwarded_for里的值。使用这
个模块需要重新编译Nginx,增加--with-http_realip_module参数
 
set_real_ip_from   10.1.10.0 /24 ;
real_ip_header     X-Forwarded-For;
上面的配置就是把从10.1.10这一网段过来的请求全部使用X-Forwarded-For里的头信息作为remote_addr
 
 
------------------将Nginx架在HAProxy前面做HTTPS代理---------------
网站为了安全考虑通常会使用https连接来传输敏感信息,https使用了ssl加密,HAProxy没法直接解析,所以要在HAProxy前面先架台Nginx解密,再转发到HAProxy做负载均
衡。这样在Web服务器前面就存在了两个代理,为了能让它获取到真实的客户端IP,需要做以下配置。
 
首先要在Nginx的代理规则里设定:
proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
这样会让Nginx的https代理增加x_forwarded_for头信息,保存客户的真实IP。
 
其次修改HAProxy的配置:
option     forwardfor except 10.1.10.0 /24
这个配置和之前设定的差不多,只是多了个内网的IP段,表示如果HAProxy收到的请求是由内网传过来的话(https代理机器),就不会设定x_forwarded_for的值,保证后面的
web服务器拿到的就是前面https代理传过来的。
 
 
 
-----------------为什么PHP里的HTTP_X_FORWARDED_FOR和Nginx的不一样------------------
当你的网站使用了CDN后,用户会先访问CDN,如果CDN没有缓存,则回源站(即你的反向代理)取数据。CDN在回源站时,会先添加x_forwarded_for头信息,保存用户的真实IP,
而你的反向代理也会设定这个值,不过它不会覆盖,而是把CDN服务器的IP(即当前remote_addr)添加到x_forwarded_for的后面,这样x_forwarded_for里就会存在两个值。
Nginx会使用这些值里的第一个,即客户的真实IP,而PHP则会使用第二个,即CDN的地址。为了能让PHP也使用第一个值,你需要添加以下fastcgi的配置。
 
fastcgi_param HTTP_X_FORWARDED_FOR $http_x_forwarded_for;
它会把nginx使用的值(即第一个IP)传给PHP,这样PHP拿到的x_forwarded_for里其实就只有一个值了,也就不会用第二个CDN的IP了。
 
忽略x_forwarded_for
 
其实,当你使用了Nginx的realip模块后,就已经保证了remote_addr里设定的就是客户端的真实IP,再看下这个配置
 
set_real_ip_from   10.1.10.0 /24 ;
real_ip_header     X-Forwarded-For;
它就是把x_forwarded_for设为remote_addr,而nginx里的x_forwarded_for取的就是其中第一个IP。
 
使用这些设置就能保证你的remote_addr里设定的一直都是客户端的真实IP,而x_forwarded_for则可以忽略了:)

---------------------------------下面简单说明下nginx location匹配规则-------------------------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
location匹配命令
~   表示执行一个正则匹配,区分大小写
~* 表示执行一个正则匹配,不区分大小写
^~ 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
=    进行普通字符精确匹配
@   定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
 
=前缀的指令严格匹配这个查询。如果找到,停止搜索。
所有剩下的常规字符串,最长的匹配。如果这个匹配使用^〜前缀,搜索停止。
正则表达式,在配置文件中定义的顺序。
如果第3条规则产生匹配的话,结果被使用。否则,如同从第2条规则被使用。
 
location 匹配的优先级(与location在配置文件中的顺序无关)
= 精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。
普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。
^~ 则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
最后匹配理带有 "~" "~*" 的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。
location = / {                      # 只匹配"/".
[ configuration A ]
}
 
location / {                         # 匹配任何请求,因为所有请求都是以"/"开始,但是更长字符匹配或者正则表达式匹配会优先匹配
[ configuration B ]
}
 
location ^~  /images/  {            # 匹配任何以 /images/ 开始的请求,并停止匹配 其它location
[ configuration C ]
}
 
location ~* \.(gif|jpg|jpeg)$ {          # 匹配以 gif, jpg, or jpeg结尾的请求. 但是所有 /images/ 目录的请求将由 [Configuration C]处理.
[ configuration D ]
}
***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************
分类:  Nginx
本文转自散尽浮华博客园博客,原文链接:http://www.cnblogs.com/kevingrace/p/6086652.html ,如需转载请自行联系原作者
相关文章
|
17天前
|
应用服务中间件 BI nginx
Nginx的location配置详解
【10月更文挑战第16天】Nginx的location配置详解
|
10天前
|
应用服务中间件 API nginx
nginx配置反向代理404问题
【10月更文挑战第18天】本文介绍了使用Nginx进行反向代理的配置方法,解决了404错误、跨域问题和302重定向问题。关键配置包括代理路径、请求头设置、跨域头添加以及端口转发设置。通过调整`proxy_set_header`和添加必要的HTTP头,实现了稳定的服务代理和跨域访问。
nginx配置反向代理404问题
|
4天前
|
应用服务中间件 网络安全 PHP
八个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
Nginx 是一个高效的 HTTP 服务器和反向代理,擅长处理静态资源、负载均衡和网关代理等任务。其配置主要通过 `nginx.conf` 文件完成,但复杂设置可能导致错误。本文介绍了几个开源的 Nginx 可视化配置系统,如 Nginx UI、VeryNginx、OpenPanel、Ajenti、Schenkd nginx-ui、EasyEngine、CapRover 和 NGINX Agent,帮助简化和安全地管理 Nginx 实例。
|
5天前
|
Web App开发 算法 应用服务中间件
nginx开启局域网https访问
【10月更文挑战第22天】为了调试WebRTC功能,需要在局域网内搭建HTTPS协议。具体步骤包括:在已部署Nginx和安装OpenSSL的环境中生成私钥、证书签名请求和自签名证书;将生成的文件放置到Nginx的证书目录并修改Nginx配置文件,最后重启Nginx服务。注意,自签名证书不受第三方机构认可,如需正式使用,需向CA申请签名。
|
14天前
|
缓存 负载均衡 应用服务中间件
Nginx配置
【10月更文挑战第22天】在实际配置 Nginx 时,需要根据具体的需求和环境进行调整和优化。同时,还需要注意配置文件的语法正确性和安全性。
35 7
|
23天前
|
前端开发 JavaScript 应用服务中间件
终极 Nginx 配置指南
本文介绍了Nginx的基本配置及其优化方法。首先,通过删除注释简化了Nginx的默认配置文件,使其更易于理解。接着,文章将Nginx配置文件分为全局块、events块和http块三部分进行详细解释。此外,还提供了如何快速上线网站、解决前端history模式404问题、配置反向代理、开启gzip压缩、设置维护页面、在同一IP上部署多个网站以及实现动静分离的具体配置示例。最后,附上了Nginx的基础命令,包括安装、启动、重启和关闭等操作。
|
24天前
|
缓存 负载均衡 安全
Nginx常用基本配置总结:从入门到实战的全方位指南
Nginx常用基本配置总结:从入门到实战的全方位指南
221 0
|
29天前
|
应用服务中间件 Linux nginx
Jetson 环境安装(四):jetson nano配置ffmpeg和nginx(亲测)之编译错误汇总
这篇文章是关于在Jetson Nano上配置FFmpeg和Nginx时遇到的编译错误及其解决方案的汇总。
78 4
|
30天前
|
编解码 Ubuntu 应用服务中间件
Jetson 环境安装(三):jetson nano配置ffmpeg和nginx(亲测)
本文介绍了在NVIDIA Jetson Nano上配置FFmpeg和Nginx的步骤,包括安装、配置和自启动设置。
119 1
Jetson 环境安装(三):jetson nano配置ffmpeg和nginx(亲测)
|
27天前
|
负载均衡 应用服务中间件 nginx
Nginx的6大负载均衡策略及权重轮询手写配置
【10月更文挑战第9天】 Nginx是一款高性能的HTTP服务器和反向代理服务器,它在处理大量并发请求时表现出色。Nginx的负载均衡功能可以将请求分发到多个服务器,提高网站的吞吐量和可靠性。以下是Nginx支持的6大负载均衡策略:
115 7
下一篇
无影云桌面