【问题标题】:How to stop nginx pass through from resolving upstream to IP如何阻止 nginx 传递从解析上游到 IP
【发布时间】:2022-03-02 22:17:39
【问题描述】:

我是 nginx 反向代理配置的新手。我们需要设置代理服务器以将请求路由到需要 IP 白名单的远程服务器。也有两种方式的 SSL。

我们一直在努力解决这个问题。以下是配置:

server {
   listen 80;
   server_name myserver.com;
   return 302 https://myserver.com;
}

server {
   listen 443;
   server_name myserver.com;

   ssl on;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   ssl_prefer_server_ciphers on;
   ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; 
   ssl_certificate           /etc/nginx/keys/my-net.crt;
   ssl_certificate_key       /etc/nginx/keys/my-net.key;
   access_log /var/log/nginx/access.log;
   error_log /var/log/nginx/error.log;

   location / {
        resolver 8.8.8.8;
        set $backend "https://remoteserver.com";
        proxy_pass $backend;

        proxy_ssl_server_name on;
        proxy_ssl_trusted_certificate /home/ubuntu/myfile.pem;
        proxy_ssl_session_reuse off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for; 
   }
}

我们面临的问题是代理服务器正在将域名解析为 IP,因为 SSLhandshake 失败。我们需要停止这个并点击域名,因为证书在域名上。

error.log 中的错误

2022/03/02 14:10:02 [error] 27012#27012: *8 SSL_do_handshake() failed (SSL: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:SSL alert number 40) while SSL与上游握手,客户端:,服务器:,请求:“POST HTTP/1.1”,上游:“https:”,主机:“” 2022/03/02 14:10:02 [alert] 27012#27012: *8 socket() 在连接到上游时失败(97:协议不支持地址系列),客户端:,服务器:,请求: “POST /gateway/api/txb/v1/payments/transfer-payment HTTP/1.1”,上游:“https://[IPv6]:443/”,主机:“”

已经在这里尝试了解决方案,但没有运气 - How to stop nginx from resolving upstream to ip?

【问题讨论】:

  • “我们一直在努力解决这个问题。” - 我不清楚这是什么。请描述您面临的实际障碍,而不是仅仅陈述一些不具体的“问题”并转储配置。
  • 已更新。感谢您指出。
  • “我们面临的问题是...... SSLhandshake 失败了。” - 那是你的问题。 "... 代理服务器正在将域名解析为 IP,因为..." - 这只是您假设它失败的原因。假设您已经拥有proxy_ssl_server_name on,这个假设是错误的。由于其他(未知)原因,它失败了。请检查服务器上的 curl、openssl s_client .. 或类似名称,是否可以从服务器访问 https://remoteserver.com
  • 在问题中也添加了错误消息。从 nginx 到目标服务器的 CURL 按预期工作。同样,假设的原因是错误日志在 URL 中显示 IP 而不是主机名。谢谢!
  • nginx 必须将域解析为 IP 地址才能连接到上游。但这不是您链接的问题中讨论的问题的重点,而是 nginx 没有使用 SNI 在 TLS 握手中发送域名。这已通过使用 proxy_ssl_server_name on; 解决 - 这也显示在您的配置中。所以这看起来像是一个不同的问题,与您在标题中声称的内容无关。与来自 curl 的成功连接相比,看到来自 nginx 的失败连接的数据包捕获会很有趣。另请查看上游日志以获取错误信息。

标签: nginx ssl nginx-reverse-proxy


【解决方案1】:

您需要在使用proxy_set_heder 设置标题后关闭proxy_pass_request_headers 并监听ssl listen 443 ssl;

server {
   listen 80;
   server_name myserver.com;
   return 302 https://myserver.com;
}

server {
   listen 443 ssl; 
   server_name myserver.com;

   ssl on;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   ssl_prefer_server_ciphers on;
   ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; 
   ssl_certificate           /etc/nginx/keys/my-net.crt;
   ssl_certificate_key       /etc/nginx/keys/my-net.key;
   access_log /var/log/nginx/access.log;
   error_log /var/log/nginx/error.log;

   location / {
        resolver 8.8.8.8;
        set $backend "https://remoteserver.com";
        proxy_pass $backend;

        proxy_ssl_server_name on;
        proxy_ssl_trusted_certificate /home/ubuntu/myfile.pem;
        proxy_ssl_session_reuse off;
        proxy_pass_request_headers off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for; 
   }
}

【讨论】:

  • 试过这个,但似乎发生了同样的事情:(由于安全问题,IP被删除)[错误]11879#11879:* 45 SSL_do_handshake()失败(SSL:错误:14094410:SSL例程: ssl3_read_bytes:sslv3 警报握手失败:SSL 警报编号 40)在 SSL 与上游握手时,客户端:>,服务器:myserver.com,请求:“POST /gateway/api/txb/v1/payments/transfer-payment HTTP/1.1”,上游:“115.112.85.180:443/gateway/api/txb/v1/payments/transfer-payment”,主机:“myserver.com”
  • 你需要听ssl listen 443 ssl;
  • 是,但问题依旧。
猜你喜欢
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多