我有一台通过 SSH 连接的远程计算机,我想通过连接客户端的网络代理某些域。
我认为在客户端上设置一个简单的代理(如 nginx)并使用反向 SSH 隧道就足够了 - 但没有运气,现在想知道是否可行。
我的计划是:
使用 连接到我的遥控器。
ssh [email protected] -R 443:localhost:443
远程将在其 中有条目
/etc/hosts
,循环返回某些域
service-1.example.com 127.0.0.1
service-2.example.com 127.0.0.1
- 客户端上的代理将接收这些请求并根据
Host
标头对其进行代理。
没有按计划进行:
最初我以为这就像使用 proxy_pass/反向代理设置 nginx 一样简单,但是它不会转发 SSL 内容,需要自签名证书。
我考虑添加类似的模块代理连接模块但是我一直在努力编译 nginx(MacOS),花了几个小时试图弄清楚要获取哪个版本的源代码、从哪里获取它、哪个版本的 OpenSSL、pcre、gcc、clang 等——最后我毫无进展。
我甚至不确定,也不知道这是否是我需要的?
知道实现这一目标的最简单方法是什么吗?
答案1
最初我以为这就像使用 proxy_pass/反向代理设置 nginx 一样简单,但是它不会转发 SSL 内容,需要自签名证书。
您无法根据“Host:”标头转发 SSL 内容,因为“Host:”标头位于 SSL(TLS)连接内部,除非代理终止并解密 SSL,否则代理无法看到它。
解密流量并保持原始服务器证书完好无损是不可能的;这几乎是工作SSL 和 TLS 来使这种情况不可能发生。
相反,您需要一个基于 TLS SNI(服务器名称指示)扩展转发连接的代理。sniproxy 和 HAproxy 是两个选项。
(HTTP CONNECT 代理将是非-透明,因为它要求客户端明确发送指定目标主机:端口的 HTTP CONNECT 请求。)