我在Docker中有以下设置:
私人服务器< - > NGINX< - >公共服务器
我需要NGINX服务器作为SSL passthrough的反向和转发代理。我在网上找到了以下配置来实现这一点(请注意,对于转发代理,我总是将数据包发送到同一目的地,公共服务器,在proxy_pass中硬编码):
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会话失败。
在公共服务器上它说:
http: TLS handshake error from <PUBLIC_SERVER_IP>:49848: tls: oversized record received with length 20037
在私人服务器上它说:
Post https://<PUBLIC_SERVER_IP>:8080/subscribe: malformed HTTP response "\x15\x03\x01\x00\x02\x02\x16"
这就是我用tshark看到的:
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吗?
非常感谢您给予我的所有帮助。
P.S。 如果我删除NGINX代理,一切正常。
答案 0 :(得分:1)
我发现了这个问题。这实际上是一个代码问题。我正在使用Golang。问题是我将Proxy配置为:
*httpsCl = http.Client{
Transport: &http.Transport{
Proxy: http.ProxyURL(proxyUrl),
TLSClientConfig: tlsConfig
},
}
并且这样做私有服务器期望与Proxy通信,如果我们使用SSL passthrough则该代理不起作用。相反,我必须将代理配置为:
*httpsCl = http.Client{
Transport: &http.Transport{
Dial: func(network, addr string) (net.Conn, error){
return net.Dial("tcp", proxyUrl.Host)
},
TLSClientConfig: tlsConfig
},
}
全部谢谢!