You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx stream反向代理如何单独限制指定后端的客户端访问IP

结论

该需求完全可以实现。你当前的配置存在两处问题,修正后配合四层流量的访问控制规则,即可做到仅限制第四台服务器的访问来源IP,完全不影响其余三台服务器的正常访问。

现有配置的问题
  • 存在配置笔误:stream块内的SNI映射规则写错了,portal2.site.com、portal3.site.com、portal4.site.com目前全部被指向portal1_backend,会导致访问这三个域名的流量全打到第一台后端服务器,和你预先定义的upstream列表不匹配。
  • 访问控制规则位置错误:你目前把allow/deny规则写在了80端口的HTTP服务块中,这个规则只能拦截80端口的HTTP重定向请求,根本无法管控443端口四层stream模块转发的HTTPS流量,外部用户可以直接通过HTTPS访问第四台服务器,完全绕过你设置的IP限制。
修正后可直接使用的配置

先修正SNI映射的笔误,再在stream层针对访问第四台服务器的流量单独加IP白名单判断,其余流量完全保持原有逻辑:

stream {
        # SNI与后端的映射关系,修正原有笔误
        map $ssl_preread_server_name $name {
                portal1.site.com portal1_backend;
                portal2.site.com portal2_backend;
                portal3.site.com portal3_backend;
                portal4.site.com portal4_backend;
        }

        # 定义第四台服务器的IP白名单
        map $remote_addr $portal4_allowed {
            1.2.3.4 1;
            # 如需新增允许的IP,按上述格式逐行添加即可
            default 0;
        }

        upstream portal1_backend {
                server 10.1.1.1:443;
        }

        upstream portal2_backend {
                server 10.1.1.2:443;
        }

        upstream portal3_backend {
                server 10.1.1.3:443;
        }

        upstream portal4_backend {
                server 10.1.1.4:443;
        }

        # 用于拦截非法访问的空后端,绑定无服务的端口即可触发连接重置
        upstream stream_reject {
                server 127.0.0.1:19999 down;
        }

        server {
                listen 10.1.2.2:443;
                ssl_preread on;

                set $proxy_dest $name;
                # 仅当访问第四台服务器时校验IP白名单,其余站点直接转发不做限制
                if ($ssl_preread_server_name = "portal4.site.com") {
                        if ($portal4_allowed = 0) {
                                set $proxy_dest stream_reject;
                        }
                }

                proxy_pass $proxy_dest;
        }
}
http {
        server {
                listen 80;
                server_name portal1.site.com;

                location / {
                    return 301 https://$server_name$request_uri;
                }

                location /.well-known/ {
                        proxy_pass http://10.1.1.1:80;
                }
        }

        server {
                listen 80;
                server_name portal2.site.com;

                location / {
                        return 301 https://$server_name$request_uri;
                }

                location /.well-known/ {
                        proxy_pass http://10.1.1.2:80;
                }
        }

        server {
                listen 80;
                server_name portal3.site.com;

                location / {
                        return 301 https://$server_name$request_uri;
                }

                location /.well-known/ {
                        proxy_pass http://10.1.1.3:80;
                }
        }

        server {
                listen 80;
                server_name portal4.site.com;

                location / {
                        allow 1.2.3.4;
                        deny all;
                        return 301 https://$server_name$request_uri;
                }

                location /.well-known/ {
                        # 证书验证路径不做IP限制,保证Let's Encrypt续期正常
                        proxy_pass http://10.1.1.4:80;
                }
        }
}
配置生效逻辑
  • portal1、portal2、portal3三个站点的HTTP、HTTPS访问逻辑和原有配置完全一致,没有任何额外限制,不会影响现有业务运行。
  • portal4站点的访问控制规则:
    • 80端口下的.well-known证书验证路径不做IP限制,保证Let's Encrypt证书自动续期不受影响
    • 80端口下的其他路径仅允许白名单IP访问,非白名单IP直接返回403
    • 443端口的HTTPS请求仅对白名单IP转发到第四台后端,非白名单IP的连接会被直接重置,无法触达后端服务
  • 配置修改完成后,先执行nginx -t校验语法是否正确,确认无误后执行nginx -s reload重载配置即可生效。

内容的提问来源于stack exchange,提问作者Iain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:39:22