设置
我目前有一个服务器和一个在云(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 获取证书?