使用 nginx,如何限制对每个预读主机名或上游的代理 TCP 资源的访问?

Cas*_*sey 6 nginx

nginx文档指南表明您可以在stream块内执行基于 ip 的白名单/黑名单。

但是,对于使用 ssl 预读读取的某些主机名,我无法找到基于 ip 的allow/deny连接方法。

情况

我有一个 nginx 盒子,它代理专用网络上的许多服务。其中一些服务应该暴露在网络之外,而另一些则不应该。这个 nginx box 代理内部和外部连接。

# TCP proxying with SSL passthrough & vhosts
stream {
        map $ssl_preread_server_name $name {
            public.example.com      public;
            private.example.com     private;
            default                 default_upstream;
        }

        upstream public {
                server 10.0.0.2:443;
        }

        upstream private {
                server 10.0.0.3:443;
        }

        upstream default_upstream {
                server 10.0.0.4:443;
        }

        server {
                listen      443;
                proxy_pass  $name;
                ssl_preread on;
        }
}
Run Code Online (Sandbox Code Playgroud)

如何将基于 ip 的阻塞应用到仅指向的连接private.example.com

Ale*_*hev 2

我找到了一种解决您问题的简单方法。您应该使用额外的server块来过滤 IP。所以,你的配置应该如下所示:

# TCP proxying with SSL passthrough & vhosts
stream {
        map $ssl_preread_server_name $name {
            public.example.com      public;
            private.example.com     private;
            default                 default_upstream;
        }

        upstream public {
                server 10.0.0.2:443;
        }

        upstream private {
                #server 10.0.0.3:443;
                server 127.0.0.1:444;
        }

        upstream default_upstream {
                server 10.0.0.4:443;
        }

        server {
                listen      444;
                proxy_pass  10.0.0.3:443;
                ssl_preread on;
                deny  192.168.1.1;
                allow 192.168.1.0/24;
                allow 10.1.1.0/16;
                deny  all;
        }

        server {
                listen      443;
                proxy_pass  $name;
                ssl_preread on;
        }
}
Run Code Online (Sandbox Code Playgroud)