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的连接会被直接重置,无法触达后端服务
- 80端口下的
- 配置修改完成后,先执行
nginx -t校验语法是否正确,确认无误后执行nginx -s reload重载配置即可生效。
内容的提问来源于stack exchange,提问作者Iain
相关产品推荐
相关产品推荐

