NGINX TCP 反向代理以不同的方式解析查询

NGINX TCP 反向代理以不同的方式解析查询

设置

我目前有一个服务器和一个在云(Oracle云基础设施)中运行的mongodb数据库。

问题

我与数据库的连接受选定数量的静态 IP 约束。这意味着我无法从每个客户端连接到我的数据库。

尝试的解决方案

因此,我想使用我的服务器(具有静态 IP)作为我的 mongodb 流量的反向代理。

根据各种 stackoverflow 帖子,即这篇文章是关于在反向代理后面设置 nginx 的这篇文章是关于强制 nginx 重新解析请求

我已经能够设置一个可以工作的配置。

  resolver 194.168.4.100 valid=15s;
  
  server {
    set $mongo "<MY_OCID>.<MY_REGION>.oraclecloudapps.com:27017";
    listen 27017 so_keepalive=on;
    listen 27017 udp; #listen to UDP just in case
    proxy_connect_timeout 2s;
    proxy_pass    $mongo;
    proxy_timeout 10m;
  }

问题是什么?

使用代理数据库不起作用或者无法连接。

我收到错误:MongoNetworkError: Client network socket disconnected before secure TLS connection was established

经过大量测试,尝试发出 mongosh 请求并使用 tcpdump 访问所有流量后,我遇到了障碍。

查看 tcpdump 日志,我发现唯一的区别是 DNS 解析。

没有代理:

cache1.service.<service_provider>.net.domain > laptop.55079: [udp sum ok] 51937 q: A? 
<MY_OCID>.<MY_REGION>.oraclecloudapps.com. 3/0/1 
<MY_OCID>.<MY_REGION>.oraclecloudapps.com. A <IP>, 
<MY_OCID>.<MY_REGION>.oraclecloudapps.com. A <IP>, 
<MY_OCID>.<MY_REGION>.oraclecloudapps.com. A <IP>  ar: . OPT UDPsize=512 (145)

然后就可以正确解析并建立正确的连接。

使用代理:

cache1.service.<service_provider>.net.domain > laptop.39421: [udp sum ok] 62642 q: A? 
<MY_OCID>.<MY_REGION>.oraclecloudapps.com. 3/0/0 
<MY_OCID>.<MY_REGION>.oraclecloudapps.com. A <IP>, 
<MY_OCID>.<MY_REGION>.oraclecloudapps.com. A <IP>, 
<MY_OCID>.<MY_REGION>.oraclecloudapps.com. A <IP> (134)

这无法解决。缺少一条附加记录。

但所有 IP 均已正确解析。

问题

有人知道 NGINX 解析地址的方式是否与正常请求不同吗?我不确定我是否能做到这一点。

附加信息

我知道 Oracle Cloud 需要 TLS(可选 mTLS)身份验证才能正常工作。

因此,我的错误可能是因为我的代理没有使用 TLS 连接,而只是传递 TCP 数据。我该如何使用此设置来设置正确的证书?可能吗?

  server {
    set $mongo "<MY_OCID>.<MY_REGION>.oraclecloudapps.com:27017";
    listen 27017 ssl so_keepalive=on;
    ssl_certificate /path/to/some/ssl/cert.pem
    ssl_certificate /path/to/some/ssl/cert.key
    proxy_connect_timeout 2s;
    proxy_pass    $mongo;
    proxy_timeout 10m;
  }

我可以自行签署这样的证书吗?或者我必须以某种方式从 Oracle 获取证书?

相关内容