nginx如何根据用户真实IP限源

 更新时间:2025年11月06日 08:57:21   作者:zlwuaiai  
文章介绍了Nginx限制IP访问的方式,包括通过remote_addr、X-Real-IP和X-Forwarded-For头文件获取用户真实IP的方法,并详细说明了如何配置Nginx以实现基于白名单的访问控制

一、背景介绍

1、正常情况,nginx 限制ip访问方式:(根据remote_addr限制)

# nginx http\server 块中配置
allow 192.168.6.0/16;
# allow all;
deny 1.2.3.4/32;
# deny all;

2、当经过waf或者cdn等代理后(remote_addr总是waf或者cdn等上一步代理地址)

3、确认上层代理是否将用户IP传递到http_x_forwarded_for中

4、一般http_x_forwarded_for中第一个地址为用户IP,为了避免被人篡改,暂不采取直接拿第一个地址作为用户真实IP

二、基础知识介绍

1、remote_addr

HTTP协议没有IP的概念,Remote Address来自于TCP连接,表示与服务端建立TCP连接的设备IP,因此,Remote Address无法伪造。

注意,这里的客户端指的是直接请求Nginx的客户端,非间接请求的客户端。

用户客户端–发送请求->Nginx1 --转发请求–>Nginx2->后端服务器

默认情况下,针对Nginx1而言,remote_addr为用户客户端IP,对Nginx2而言,$remote_addr则为Nginx1的IP。

2、X-Real-IP

HTTP代理用于表示与它产生TCP连接的设备IP,可能是其他代理,也可能是真正的请求端。

用途:当本机 Nginx 处于反向代理后端时可以获取到用户的真实IP地址。

realip 功能介绍

使用:realip 功能需要 Nginx 添加 ngx_http_realip_module 模块,默认情况下是不被编译,如果需要添加,请在编译时添加 --with-http_realip_module 选项开启它。

realip 作用域

set_real_ip_from、real_ip_header 和 real_ip_recursive 都可以用于 http、 server、location 区域配置。

realip 部分参数解释

set_real_ip_from:设置反向代理服务器,即信任服务器IP

real_ip_header X-Forwarded-For:用户真实IP存在X-Forwarded-For请求头中

real_ip_recursive:

	off:会将real_ip_header指定的HTTP头中的最后一个IP作为真实IP

	on:会将real_ip_header指定的HTTP头中的最后一个不是信任服务器的IP当成真实IP

3、X-Forwarded-For

Nginx追加上去的,但前面部分来源于nginx收到的请求头,这部分内容不是很可信。符合IP格式的才可以使用,否则容易引发XSS或者SQL注入漏洞。

每次经过proxy转发都会有记录,格式就是 client1,proxy1,proxy2,以逗号隔开各个地址,由于它是非rfc标准,所以默认是没有的,需要强制添加。

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

追加一个X-Forwarded-For的值,实际上当你搭建两台nginx在不同的ip上,并且都使用了这段配置,那你会发现在web服务器端通过request.getAttribute(“X-Forwarded-For”)获得的将会是客户端ip和第一台nginx的ip。

4、deny机制

Nginx的deny和allow指令是由ngx_http_access_module模块提供,Nginx安装默认内置了该模块。

语法

语法:allow/deny address | CIDR | unix: | all

它表示,允许/拒绝某个ip或者一个ip段访问.如果指定unix:,那将允许socket的访问。

注意:unix在1.5.1中新加入的功能。

在nginx中,allow和deny的规则是按顺序执行的。

allow 指令

1、允许哪些 IP 访问,all 表示允许所有;

2、作用域 http / server / location / limit_except ;

deny 指令

​1、禁止哪些 IP 访问,all 表示禁止所有;

2、作用域 http / server / location / limit_except ;

运行机制

根据remote_addr参数限制允许还是拒绝

三、当前场景问题

1、real_ip获取用户真实IP

经过waf代理,remote_addr 为waf出口地址

  • 开启real_ip,取X-Forwarded-For中最后一个ip作为real_ip
  • 设置信任ip(中间代理服务器出口地址,本场景为waf出口地址),设置后real_ip在取值时候会过滤掉 X-Forwarded-For中信任的ip
  • 本场景作用域为http
set_real_ip_from 2.2.2.2;
set_real_ip_from 2.2.2.3;
real_ip_header X-Forwarded-For;
real_ip_recursive on;

2、赋值给remote_addr,使得deny生效

本场景此处作用域为location

proxy_set_header X-Real-IP $remote_addr;

3、如何限制用户访问

本场景此处作用域为location,写在上一步之后

include whitelist.conf;

其中whitelist.conf路径为nginx.conf同级目录中,文件中写入内容为:

allow 112.17.28.67    ;
allow 112.17.79.152/29;
deny all;

四、测试

1、检查配置文件

nginx -t

2、重新加载nginx

nginx -s reload

3、测试白名单中有的地址能否访问

4、测试白名单中没有的地址能否访问

五、注意

一定要检查配置文件地址跟改动的配置文件地址是否一致,否则会导致更改失效

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • nginx设置资源请求目录的方式详解

    nginx设置资源请求目录的方式详解

    最近有一个需求.就是url指定路径下访问服务器的静态资源,这篇文章主要给大家介绍了关于nginx设置资源请求目录的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • nginx缓存以及清除缓存的使用

    nginx缓存以及清除缓存的使用

    本文主要介绍了nginx缓存以及清除缓存的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Nginx使用反向代理实现负载均衡过程解析

    Nginx使用反向代理实现负载均衡过程解析

    这篇文章主要介绍了Nginx使用反向代理实现负载均衡过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • nginx中封禁ip和允许内网ip访问的实现示例

    nginx中封禁ip和允许内网ip访问的实现示例

    Nginx不仅仅只是一款反向代理和负载均衡服务器,本文主要介绍了nginx中封禁ip和允许内网ip访问的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    2022-03-03
  • nginx镜像构建的知识点及方法步骤详解

    nginx镜像构建的知识点及方法步骤详解

    这篇文章主要为大家介绍了nginx镜像构建的知识点详解,<BR>有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • nginx做代理转发前端请求到后端的代码示例

    nginx做代理转发前端请求到后端的代码示例

    Nginx作为反向代理服务器,可以有效处理请求并转发到后端服务器,这篇文章主要介绍了nginx做代理转发前端请求到后端的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • nginx 配置location匹配规则实例讲解

    nginx 配置location匹配规则实例讲解

    在本篇文章里小编给大家整理的是关于nginx 配置location匹配规则实例讲解内容,需要的朋友们学习下。
    2020-03-03
  • Nginx学习之静态文件服务器配置方法

    Nginx学习之静态文件服务器配置方法

    本篇文章主要介绍了Nginx学习之静态文件服务器配置方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • centos7 docker 修改Nginx文件过程详解

    centos7 docker 修改Nginx文件过程详解

    这篇文章主要介绍了centos7 docker 修改Nginx文件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 深度详解什么是Nginx正向代理与反向代理

    深度详解什么是Nginx正向代理与反向代理

    这篇文章主要介绍了Nginx正向代理与Nginx反向代理的区别,比较易懂,需要的朋友可以参考下
    2023-03-03

最新评论