我尝试让Caddy反向代理服务器在客户端和反向服务器之间中继TLS握手,但在代理刚收到TLS客户端hello时失败。Caddy v2.6.2
和Curl v7.87.0
在下面进行测试。
/etc/主机:
127.0.0.1 localhost back-server.local proxy-server.local
Caddyfile-back-server:
{ http_port 2015 }
back-server.local:2016
respond "Hello, world!"
Caddyfile-proxy-server:
{ http_port 2017 }
proxy-server.local:2018 {
reverse_proxy https://back-server.local:2016 {
header_up Host {upstream_hostport}
}
}
初步测试如下:
$ caddy start --config Caddyfile-back-server
$ caddy start --config Caddyfile-proxy-server
$ curl https://back-server.local:2016
Hello, world!
$ curl https://proxy-server.local:2018
Hello, world!
下一个测试中继TLS客户端hello失败。
$ curl --connect-to back-server.local:2016:proxy-server.local:2018 https://back-server.local:2016
curl: (35) ... internal error
从捕获的报文中可以看出,sni: back-server.local
是从TLS客户端hello发送到proxy-server的。local:2018,但是代理返回TLS服务器警报:内部错误,然后立即关闭连接。proxy-server之间没有任何通信。Localandback-server.local:2016.
可能有什么问题,如何使它工作?
Caddy服务器作为反向代理不使用SNI从TLS客户端hello进行相关的TLS传递到后端服务器,这是TLS正向代理的工作。Caddy L4插件用于L4路由,包括基于TLS sni的路由。
下面成功地解决了这个问题,另一个反向代理FRP也能够作为TLS正向代理。
/etc/主机
127.0.0.1 localhost back-server.local proxy-server.local
Caddyfile-back-server
{ http_port 2015 }
back-server.local:2016
respond "Hello, world!"
frps.ini
[common]
vhost_https_port = 2018
frpc.ini
[common]
[TLS passthrough]
type = https
local_port = 2016
custom_domains = back-server.local
然后测试通过预期。为了简单起见,所有的配置文件都放在PWD目录下。
$ caddy start --config Caddyfile-back-server
$ frps
$ frpc
$ curl --connect-to back-server.local:2016:proxy-server.local:2018 https://back-server.local:2016
Hello, world!