使用 nginx 屏蔽传出连接的 IP 地址

使用 nginx 屏蔽传出连接的 IP 地址

我们有一个业务需求,即通过单个 IP 地址传输来自多个处理服务器的所有传出连接。

我们的设置如下:

我们有一个 nginx 服务器,它充当传入 http 请求的负载平衡器。然后,我们还有多个 Web 服务器,它们连接到处理服务器,而处理服务器又连接到我们客户的数据库。

客户端 --> 负载均衡器 --> Web 服务器 --> 流程服务器 --> 数据库

客户端 <-- 负载均衡器 <-- Web 服务器 <-- 流程服务器 <-- 数据库

目前,我们为客户提供一份 IP 地址列表,供他们添加到数据库白名单中。但是,随着我们规模的扩大,这份白名单将变得越来越长,而我们的客户则需要再次更新他们的白名单。

所需设置

为了解决这个问题,我们希望将所有传出连接都通过另一个 nginx 服务器,这将屏蔽我们处理服务器的 IP 地址。这样,我们现在就只有一个 IP 地址可供客户列入白名单。

客户端 --> 负载均衡器 --> Web 服务器 --> 进程服务器 --> IP 屏蔽 --> 数据库

客户端<-- 负载均衡器<-- Web 服务器<-- 进程服务器<-- IP 屏蔽<-- 数据库

这仅通过 nginx 就可以实现吗?如果可以,我们需要采取哪些步骤来实现这一点?

答案1

另一个可能的解决方案是使用 NAT。在这种情况下,掩蔽服务器将是配置了网络地址转换的路由器。在这种情况下,您不需要在 node.js 配置中更改客户数据库 IP,但您应该更改网络,可能是所有进程服务器上的路由配置,并配置一个配置了 NAT 的网关

答案2

您所问的问题在 nginx 1.9.0 版及以上版本中均可实现。他们添加了 tcp(而非 http)代理支持。从 1.9.13 版开始,他们还添加了 udp 代理。阅读https://www.nginx.com/resources/admin-guide/tcp-load-balancing/#upstreamhttps://nginx.ru/en/docs/stream/ngx_stream_proxy_module.html

棘手的部分是区分传入的连接(IP 掩码 nginx),以决定连接到哪个数据库。在 HTTP 代理中,您可以使用主机名。在 tcp 代理中,您应该监听不同的端口或不同的 IP 地址。nginx.conf:

worker_processes  4;

error_log  /var/log/nginx/error.log;

events { worker_connections  1024; }
stream {
        server {
           listen 3307;
           proxy_pass client2.db.dev:3306;
           proxy_buffer_size 16k;
        }
        server {
           listen 3308;
           proxy_pass client1.db.dev:3306;
           proxy_buffer_size 16k;
        }
}

相关内容