广告位联系
返回顶部
分享到

NGINX白名单的几种方法实现介绍

nginx 来源:互联网 作者:佚名 发布时间:2026-08-30 18:02:06 人浏览
摘要

1、需求 网关:172.16.0.48反向代理到 Nginx:172.16.0.32Nginx只允许来源是网关 172.16.0.48 访问,拒绝所有其它 IP。 关键点:经过代理转发,Nginx 拿到的源 IP,默认不是真实客户端,而是网关 172.16.0

1、需求

网关:172.16.0.48 反向代理到 Nginx:172.16.0.32 Nginx 只允许来源是网关 172.16.0.48 访问,拒绝所有其它 IP。

关键点:经过代理转发,Nginx 拿到的源 IP,默认不是真实客户端,而是网关 172.16.0.48,直接用 allow/deny 就可以实现。 注意区分两种场景:①四层转发(TCP 代理);②七层 HTTP 代理。

2、处理方案

方案一:Nginx ngx_http_access_module(七层 HTTP,最常用)

场景:网关是 HTTP 反向代理,把 http 请求转发给 172.16.0.32 的 Nginx。编辑 nginx server/location 块:

1

2

3

4

5

6

7

8

9

10

11

12

13

server {

    listen 80;

    server_name _;

 

    # 只放行网关,其余全部拒绝

    allow 172.16.0.48;

    deny all;

 

    location / {

        root html;

        index index.html;

    }

}

??重要前提:网关是直接 http 代理访问 nginx,没有做 X?Forwarded?For 篡改访问控制;此时 nginx 看到的 remote_addr 就是172.16.0.48。 不要拿 $http_x_forwarded_for 做访问控制!这个 header 客户端可以伪造,不安全。

验证配置 & 重载

1

2

nginx -t

nginx -s reload

多 IP 白名单配置

原理:allow 可以写多条,从上到下匹配,最后 deny all; 拒绝其余所有 IP。 依然记住:allow/deny 匹配的是 $remote_addr(TCP 真实连接源 IP),不要用 X?Forwarded?For 做权限校验。

直接写多条 allow(写在 server /location 块内)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

server {

    listen 80;

    server_name _;

 

    # 白名单IP列表

    allow 172.16.0.48;

    allow 172.16.0.49;

    allow 172.16.0.50;

    # 也支持网段

    allow 192.168.1.0/24;

 

    deny all; # 不在上面白名单全部拒绝403

 

    location / {

        root html;

        index index.html;

    }

}

方案二:防火墙层面(系统 iptables/firewalld,网络层,更彻底)

直接在 Nginx 服务器172.16.0.32操作系统防火墙限制,不管 Nginx 配置,网络层面只允许172.16.0.48访问 80/443,其它 IP 全部 drop。

1

2

3

4

5

6

7

8

9

# 删除80、443公开放行

firewall-cmd --permanent --remove-service=http

firewall-cmd --permanent --remove-service=https

 

# 仅允许网关访问80、443

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.16.0.48/32" port protocol="tcp" port="80" accept'

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.16.0.48/32" port protocol="tcp" port="443" accept'

 

firewall-cmd --reload

  • 优点:就算 Nginx 配置被篡改,外部 IP 依然无法访问服务;
  • 缺点:操作系统层面,需要服务器权限。

方案三:Nginx stream 模块(网关是四层 TCP 代理,stream 块)

如果网关是四层 TCP 转发,Nginx 用stream处理 tcp 流量,ngx_stream_access_module做 IP 限制:

1

2

3

4

5

6

7

8

stream {

    server {

        listen 80;

        allow 172.16.0.48;

        deny all;

        proxy_pass backend;

    }

}

3、坑点提醒

  • ? 错误:拿 $http_x_forwarded_for 做 allow 判断。 X?Forwarded?For 是 HTTP 头,外网用户可以随便伪造,不能用来做访问控制;$remote_addr才是 TCP 真实连接来源 IP。
  • 如果网关做的是 SNAT,Nginx 看到源永远网关 IP,allow 172.16.0.48;deny all直接生效。
  • 如果网络中间还有其他设备(负载均衡、交换机)做源 NAT,那 remote_addr 就不是网关,访问控制会失效,需要排查网络链路。

调试如何看 Nginx 拿到的真实 TCP 源 IP

在 nginx 日志格式加上$remote_addr,看日志确认连接来源 IP:

1

2

3

4

log_format main '$remote_addr - $remote_user [$time_local] "$request" '

                '$status $body_bytes_sent "$http_referer" '

                '"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

执行 tail -f /var/log/nginx/access.log,确认请求过来时remote_addr是172.16.0.48。

1、需求

网关:172.16.0.48 反向代理到 Nginx:172.16.0.32 Nginx 只允许来源是网关 172.16.0.48 访问,拒绝所有其它 IP。

关键点:经过代理转发,Nginx 拿到的源 IP,默认不是真实客户端,而是网关 172.16.0.48,直接用 allow/deny 就可以实现。 注意区分两种场景:①四层转发(TCP 代理);②七层 HTTP 代理。

2、处理方案

方案一:Nginx ngx_http_access_module(七层 HTTP,最常用)

场景:网关是 HTTP 反向代理,把 http 请求转发给 172.16.0.32 的 Nginx。编辑 nginx server/location 块:

1

2

3

4

5

6

7

8

9

10

11

12

13

server {

    listen 80;

    server_name _;

 

    # 只放行网关,其余全部拒绝

    allow 172.16.0.48;

    deny all;

 

    location / {

        root html;

        index index.html;

    }

}

??重要前提:网关是直接 http 代理访问 nginx,没有做 X?Forwarded?For 篡改访问控制;此时 nginx 看到的 remote_addr 就是172.16.0.48。 不要拿 $http_x_forwarded_for 做访问控制!这个 header 客户端可以伪造,不安全。

验证配置 & 重载

1

2

nginx -t

nginx -s reload

多 IP 白名单配置

原理:allow 可以写多条,从上到下匹配,最后 deny all; 拒绝其余所有 IP。 依然记住:allow/deny 匹配的是 $remote_addr(TCP 真实连接源 IP),不要用 X?Forwarded?For 做权限校验。

直接写多条 allow(写在 server /location 块内)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

server {

    listen 80;

    server_name _;

 

    # 白名单IP列表

    allow 172.16.0.48;

    allow 172.16.0.49;

    allow 172.16.0.50;

    # 也支持网段

    allow 192.168.1.0/24;

 

    deny all; # 不在上面白名单全部拒绝403

 

    location / {

        root html;

        index index.html;

    }

}

方案二:防火墙层面(系统 iptables/firewalld,网络层,更彻底)

直接在 Nginx 服务器172.16.0.32操作系统防火墙限制,不管 Nginx 配置,网络层面只允许172.16.0.48访问 80/443,其它 IP 全部 drop。

1

2

3

4

5

6

7

8

9

# 删除80、443公开放行

firewall-cmd --permanent --remove-service=http

firewall-cmd --permanent --remove-service=https

 

# 仅允许网关访问80、443

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.16.0.48/32" port protocol="tcp" port="80" accept'

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.16.0.48/32" port protocol="tcp" port="443" accept'

 

firewall-cmd --reload

  • 优点:就算 Nginx 配置被篡改,外部 IP 依然无法访问服务;
  • 缺点:操作系统层面,需要服务器权限。

方案三:Nginx stream 模块(网关是四层 TCP 代理,stream 块)

如果网关是四层 TCP 转发,Nginx 用stream处理 tcp 流量,ngx_stream_access_module做 IP 限制:

1

2

3

4

5

6

7

8

stream {

    server {

        listen 80;

        allow 172.16.0.48;

        deny all;

        proxy_pass backend;

    }

}

3、坑点提醒

  • ? 错误:拿 $http_x_forwarded_for 做 allow 判断。 X?Forwarded?For 是 HTTP 头,外网用户可以随便伪造,不能用来做访问控制;$remote_addr才是 TCP 真实连接来源 IP。
  • 如果网关做的是 SNAT,Nginx 看到源永远网关 IP,allow 172.16.0.48;deny all直接生效。
  • 如果网络中间还有其他设备(负载均衡、交换机)做源 NAT,那 remote_addr 就不是网关,访问控制会失效,需要排查网络链路。

调试如何看 Nginx 拿到的真实 TCP 源 IP

在 nginx 日志格式加上$remote_addr,看日志确认连接来源 IP:

1

2

3

4

log_format main '$remote_addr - $remote_user [$time_local] "$request" '

                '$status $body_bytes_sent "$http_referer" '

                '"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

执行 tail -f /var/log/nginx/access.log,确认请求过来时remote_addr是172.16.0.48。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • NGINX白名单的几种方法实现介绍
    1、需求 网关:172.16.0.48反向代理到 Nginx:172.16.0.32Nginx只允许来源是网关 172.16.0.48 访问,拒绝所有其它 IP。 关键点:经过代理转发,Nginx 拿
  • Nginx中Brotli的安装实现
    一、引言:为什么 Gzip 不再是终极答案? 在 Web 性能优化领域,Gzip 统治了二十余年。但随着网页体积的膨胀和移动端网络的普及,Gzip 的压
  • nginx配置https+域名访问springboot接口的教程

    nginx配置https+域名访问springboot接口的教程
    目标 通过nginx配置,实现通过https+域名访问springboot部署的tomcat接 实现步骤 1、首先申请证书 下载适用于ngxin版本的证书(.PEM格式) 2、下载
  • nginx多域名及https配置全过程(Tomcat服务器)

    nginx多域名及https配置全过程(Tomcat服务器)
    主域名配置 二级域名配置 详细配置 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 4
  • 如何配置内存文件系统tmpfs作为 Nginx 临时目录彻
    要让 Nginx 临时目录彻底脱离磁盘 I/O,关键不是挂个内存盘,而是把所有会触发同步写、小文件刷盘、跨设备 rename 的临时路径,全部精准替
  • 怎么在Nginx中配置集群级别的全局限流策略
    在 Nginx 中实现集群级别的全局限流,本质是突破单机限制,让多个 Nginx 实例共享同一套限流状态。但需明确:Nginx 原生的limit_req_zone和lim
  • nginx:stable镜像的使用及说明
    nginx:stable镜像的使用 以前使用的nginx:stable-alpine 但是https加载很慢,所以尝试换成nginx:stable,结果不仅https 快了,页面加载和接口调用都快了
  • Nginx使用upstream后端接口报 400
    upstream模块介绍 Nginx的负载均衡功能依赖于ngx_http_upsteam_module模块,所支持的代理方式包括proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass和
  • 查看nginx是否已经启动的实现方式
    在 Ubuntu 或其他 Linux 系统上,要查看 Nginx 是否已经启动,您可以使用以下几种方法之一: 方法一:使用systemctl命令 Nginx 通常作为 systemd 服
  • 在Ubuntu上安装Nginx的实现过程
    在Ubuntu系统中从源码安装Nginx可以让您自定义Nginx的编译选项和模块,以满足特定需求。 以下是详细的步骤指南: 前提条件 更新系统包列表
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计