首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NGINX SSL passthrough不能正常工作?

NGINX SSL passthrough不能正常工作?
EN

Stack Overflow用户
提问于 2017-02-18 04:04:26
回答 1查看 581关注 0票数 0

我在Docker中有以下设置:

内网服务器<--> NGINX <-->公网服务器

我需要的NGINX服务器作为反向和SSL通过转发代理工作。我在网上找到了实现这一点的以下配置(请注意,对于转发代理,我总是将数据包发送到相同的目的地,即公共服务器,硬编码为proxy_pass):

代码语言:javascript
复制
stream {
        upstream backend {
                server <private server IP address>:8080;
        }
        # Reverse proxy
       server {
               listen 9090;
               proxy_pass backend;
       }

        # Forward proxy
        server{
                listen 9092;
                proxy_pass <public server IP address>:8080;
        }
}

我还没有尝试反向代理功能,因为转发代理已经给我带来了问题。特别是,当专用服务器尝试连接到公共服务器时,TLS会话将失败。

在公共服务器上,它说:

代码语言:javascript
复制
http: TLS handshake error from <PUBLIC_SERVER_IP>:49848: tls: oversized record received with length 20037

而在私有服务器上,它说:

代码语言:javascript
复制
Post https://<PUBLIC_SERVER_IP>:8080/subscribe: malformed HTTP response "\x15\x03\x01\x00\x02\x02\x16"

这是我在tshark上看到的:

代码语言:javascript
复制
PRIVATE_SRV ? NGINX   TCP 74 48044?9092 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=1209793579 TSecr=0 WS=128

NGINX ? PRIVATE_SRV   TCP 74 9092?48044 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=1209793579 TSecr=1209793579 WS=128

PRIVATE_SRV ? NGINX   TCP 66 48044?9092 [ACK] Seq=1 Ack=1 Win=29312 Len=0 TSval=1209793579 TSecr=1209793579

NGINX ? PUBLIC_SRV TCP 74 49848?8080 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=1209793579 TSecr=0 WS=128

PRIVATE_SRV ? NGINX   HTTP 161 CONNECT <PUBLIC_SRV_IP>:8080 HTTP/1.1 

NGINX ? PRIVATE_SRV   TCP 66 9092?48044 [ACK] Seq=1 Ack=96 Win=29056 Len=0 TSval=1209793580 TSecr=1209793580

PUBLIC_SRV ? NGINX   TCP 74 8080?49848 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=854036623 TSecr=1209793579 WS=128

NGINX ? PUBLIC_SRV TCP 66 49848?8080 [ACK] Seq=1 Ack=1 Win=29312 Len=0 TSval=1209793580 TSecr=854036623

NGINX ? PUBLIC_SRV HTTP 161 CONNECT <PUBLIC_SRV_IP>:8080 HTTP/1.1 

PUBLIC_SRV ? NGINX   TCP 66 8080?49848 [ACK] Seq=1 Ack=96 Win=29056 Len=0 TSval=854036623 TSecr=1209793580

PUBLIC_SRV ? NGINX   HTTP 73 Continuation

NGINX ? PUBLIC_SRV TCP 66 49848?8080 [ACK] Seq=96 Ack=8 Win=29312 Len=0 TSval=1209793581 TSecr=854036623

NGINX ? PRIVATE_SRV   HTTP 73 Continuation

PRIVATE_SRV ? NGINX   TCP 66 48044?9092 [ACK] Seq=96 Ack=8 Win=29312 Len=0 TSval=1209793581 TSecr=1209793581

PUBLIC_SRV ? NGINX   TCP 66 8080?49848 [FIN, ACK] Seq=8 Ack=96 Win=29056 Len=0 TSval=854036624 TSecr=1209793580

NGINX ? PUBLIC_SRV TCP 66 49848?8080 [FIN, ACK] Seq=96 Ack=9 Win=29312 Len=0 TSval=1209793581 TSecr=854036624

NGINX ? PRIVATE_SRV   TCP 66 9092?48044 [FIN, ACK] Seq=8 Ack=96 Win=29056 Len=0 TSval=1209793581 TSecr=1209793581

PRIVATE_SRV ? NGINX   TCP 66 48044?9092 [FIN, ACK] Seq=96 Ack=9 Win=29312 Len=0 TSval=1209793581 TSecr=1209793581

NGINX ? PRIVATE_SRV   TCP 66 9092?48044 [ACK] Seq=9 Ack=97 Win=29056 Len=0 TSval=1209793581 TSecr=1209793581

PUBLIC_SRV ? NGINX   TCP 66 8080?49848 [ACK] Seq=9 Ack=97 Win=29056 Len=0 TSval=854036624 TSecr=1209793581

你对如何调试有什么建议吗?我使用HTTPS POST的事实很重要吗?对于NGINX来说,我没有使用SSL的默认端口443有关系吗?

非常感谢你给我的帮助。

附注:如果我删除了NGINX代理,一切都会正常工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-18 05:10:51

我找到了问题所在。这实际上是一个代码问题。我正在使用Golang。问题是我将代理配置为:

代码语言:javascript
复制
*httpsCl = http.Client{
       Transport: &http.Transport{
            Proxy: http.ProxyURL(proxyUrl),
            TLSClientConfig: tlsConfig
       },
}

在这样做的过程中,私有服务器期望与代理进行通信,如果我们使用SSL通过,则该代理将无法工作。相反,我必须将代理配置为:

代码语言:javascript
复制
*httpsCl = http.Client{
                Transport: &http.Transport{
                        Dial: func(network, addr string) (net.Conn, error){
                                   return net.Dial("tcp", proxyUrl.Host)
                              },
                        TLSClientConfig: tlsConfig
                },
}

谢谢大家!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42306462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档