在 NGINX 中根据用户真实 IP 进行限制

nginx,根据,用户,真实,ip,进行,限制 · 浏览次数 : 1374

小编点评

由于 F5 在代理请求中进行 X-Forwarded-For 头设置,导致 deny 指令不生效,您需要在 F5 配置中设置 X-Forwarded-For 头。 以下是您需要配置的步骤: 1. 打开 F5 配置页面。 2. 在 `server` 块中添加以下配置: ``` proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; if ($proxy_add_x_forwarded_for !~ "192\\.168\\.1[45]") { return 403; } ``` 3. 保存并重启 F5 服务。 **注意:** 1. `192.168.14.*` 和 `192.168.15.*` 这两个 IP 地址是 F5 允许访问的 IP 地址。 2. 此配置只适用于与 F5 之间直接通信的请求。如果您的请求通过代理,则需要在代理的配置中设置 X-Forwarded-For 头。

正文

需求

需要根据用户的真实 IP 进行限制, 但是 NGINX 前边还有个 F5, 导致 deny 指令不生效.

阻止用户的真实 IP 不是 192.168.14.*192.168.15.* 的访问请求.

实现

最简单的实现如下:

📓 前置条件:

需要 nginx 前边的 load balancer 设备(如 F5)开启 X-Forwarded-For 支持.

proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

if ($proxy_add_x_forwarded_for !~ "192\.168\.1[45]")  {
    return 403;
}      

说明如下:

  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 获取请求头 X-Forwarded-For 中的用户真实 IP, 并附加到 $proxy_add_x_forwarded_for 变量
  • if...
    • (...) 变量 $proxy_add_x_forwarded_for 不匹配正则 192\.168\.1[45] (即 192.168.14.*192.168.15.*)
    • return 403, 如果上边的条件满足, 返回 403
    • 即: 如果真实IP不是 192.168.14.*192.168.15.*, 返回403.

如果有更复杂的需求, 可以参考这个示例:

proxy_set_header HOST $http_host;
proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

if ($http_host ~ "yourdomain.hypernode.io:8443")  {
  set $block_me_now A;
}
 
if ($proxy_add_x_forwarded_for != YOURIP) {
  set $block_me_now "${block_me_now}B";
}
 
 
if ($block_me_now = AB) {
    return 403;
    break;
}

为啥 deny 配置不起作用?

🤔 疑问: 为啥以下的配置不起作用?

allow 192.168.14.0/24;
allow 192.168.15.0/24;
deny all;

根据nginx官方文档, deny 指令是根据「client address」进行限制的.

📓 引用:

The ngx_http_access_module module allows limiting access to certain client addresses.

而「client address」对应的变量是: $remote_addr

📓 引用:

$remote_addr:
​ client address

关于 $remote_addr:

是 nginx 与客户端进行 TCP 连接过程中,获得的客户端真实地址. Remote Address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求

remote_addr 代表客户端的 IP,但它的值不是由客户端提供的,而是服务端根据客户端的 ip 指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的 web 服务器(Nginx,Apache 等)就会把 remote_addr 设为你的机器IP,如果你用了某个代理(其实 F5 就是这个反向代理),那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样 web 服务器就会把 remote_addr 设为这台代理机器的 IP。

但是实际某些特殊场景中,我们即使有代理,也需要将 $remote_addr 设置为真实的用户 IP,以便记录在日志当中,当然 nginx 是有这个功能,但是需要编译的时候添加 --with-http_realip_module 这个模块,默认是没有安装的。(我也没有安装)

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

与在 NGINX 中根据用户真实 IP 进行限制相似的内容:

在 NGINX 中根据用户真实 IP 进行限制

需求 需要根据用户的真实 IP 进行限制, 但是 NGINX 前边还有个 F5, 导致 deny 指令不生效. 阻止用户的真实 IP 不是 192.168.14.* 和 192.168.15.* 的访问请求. 实现 最简单的实现如下: :notebook: 前置条件: 需要 nginx 前边的 lo

nginx自定义负载均衡及根据cpu运行自定义负载均衡

转载请注明出处: 1.nginx如何自定义负载均衡 在Nginx中,可以通过配置文件自定义负载均衡策略。具体步骤如下: 首先,在Nginx配置文件中定义一个upstream模块,并设置负载均衡策略和后端服务器列表,例如: upstream myapp { server backend1.exampl

[转帖]Nginx/LVS/HAProxy负载均衡软件的优缺点详解

转载:http://www.ha97.com/5646.html PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下。 一般对负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术。具体的应

[转帖]如何在 NGINX 中安全地分发 SSL 私钥

https://my.oschina.net/u/5246775/blog/7812621 原文作者:Owen Garrett of F5 原文链接:如何在 NGINX 中安全地分发 SSL 私钥 转载来源:NGINX 官方网站 NGINX 唯一中文官方社区 ,尽在 nginx.org.cn 本文介

[转帖]查看请求在nginx中消耗的时间

需求:查看请求在nginx中消耗的时间,不包括程序响应时间。 1.声明日志的格式,在nginx配置文件nginx.conf里的http下添加如下内容: log_format test '$remote_addr - $remote_user [$time_local] "$request" ' '$

[转帖]关于nginx 反向代理upstream中的 keepalive配置

一、关于nginx upstream 在nginx的模块中,分为3种类型,分别是handler,filter和upstream,其中upstream可以看做一种特殊的handler,它主要用来实现和后端另外的服务器进行通信,由于在nginx中全部都是使用非阻塞,并且是一个流式的处理,所以upstre

[转帖]Nginx上传文件大小限制(请求报文过大)413 Request Entity Too Large

在nginx使用过程中,上传文件的过程中,通常需要设置nginx报文大小限制。避免出现413 Request Entity Too Large。 于是奇葩的问题被我们遇到了,详细配置请参考下面。我们的问题是,无论client_max_body_size设置在哪里,nginx -s reload后,依

[转帖]nginx配置文件中listen后面的backlog配置

http://www.04007.cn/article/323.html publish:February 25, 2017 -Saturdayby 04007 本站原创文章,转载请注明文章出处:www.04007.cn 在对nginx的配置时,我们会设置的它的监听端口。比如:Linsten 80;

[转帖]将nginx.conf文件的内容拆分成多个

nginx的如果有多个server模块都配置在同一个nginx.conf文件会显得比较臃肿,后续维护起来也会比较困难,所以可以将内容写入到多个配置文件中然后在nginx.conf文件中通过include命令引入。 1.nginx.conf配置文件内容 user nginx; worker_proce

[转帖]Nginx服务器性能调优

Worker 相关worker设置比较简单,只需要设置正确的数量。 Worker Processes 如果您的站点流量不大,Nginx,数据库和Web应用程序都运行在同一台服务器上。则在/etc/nginx/nginx.conf中,设置worker_processes 1; 如果您的站点流量比较大或