通过 DNS 代理强制使用 HTTPS /“智能 DNS”如何与 HTTPS 配合使用?

tr0*_*r01 5 proxy https ssl

我想通过在 VPS 上运行的代理强制将 HTTP(S) 流量从我的家庭网络发送到某些网站。

我安装tinyproxy在 VPS 上,在端口 上运行8080。在我的电脑上我正在运行

sudo ssh -i /home/user/.ssh/id_rsa -nNT -L 80:localhost:8080 -L 443:localhost:8080 remoteuser@vps
Run Code Online (Sandbox Code Playgroud)

本地访问代理。当我在 Firefox 设置中配置localhost:80为代理时,一切正常(HTTP 和 HTTPS)。

但由于我不希望所有流量都通过该代理,因此我将其添加到我的电脑中/etc/hosts

127.0.0.1     server.example 
Run Code Online (Sandbox Code Playgroud)

server.example是为 HTTP 和 HTTPS 配置的 Web 服务器的名称。

访问http://server.example正常,但https://server.example在 Firefox 中打开失败并出现错误

SSL_ERROR_RX_RECORD_TOO_LONG
Run Code Online (Sandbox Code Playgroud)

curl通过 HTTPS 访问页面也失败:

curl: (35) error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
Run Code Online (Sandbox Code Playgroud)

据我了解,此问题是由 tinyproxy 使用纯 HTTP 响应 HTTPS 请求引起的。

首先,理论上可以实现我想要的吗?那些所谓的“智能 DNS”服务似乎正是这样做的。

这个问题是由我的设置引起的还是tinyproxy无法做到这一点?是否有不同的代理服务器能够做到这一点?

编辑:目前我正在我的 PC 上运行 SSH 隧道,并且 DNS 修改也在本地,但我想稍后将其部署在我的路由器上,以便来自我网络的任何设备的流量都通过此代理。

EDIT2:正如 @SteffenUllrich 在评论中所写,当通过 HTTP 代理路由 HTTPS 时,客户端首先在握手发生之前发送未加密的 CONNECT 请求。请参阅此处(到 VPS 的 SSH 隧道正在运行10.0.5.4):

https://i.stack.imgur.com/Hh5WL.png

这是必要的,因为否则代理将无法确定请求应转发到哪个服务器。

但这些“智能 DNS”代理服务器到底是如何工作的呢?(有关一般信息,请参阅此处

因为它们不需要 CONNECT 请求,所以它们似乎不需要 CONNECT 请求即可工作。但他们如何确定请求应转发到的服务器呢?下面是使用此类“智能 DNS”代理(IP 为 37.xxx)的 HTTPS 连接转储。(DNS 被操纵以指向该代理):

https://i.stack.imgur.com/NzDrX.png

那么,这是如何运作的呢?此外,有没有办法在我的 VPS 上实现这一点(也许不是使用 Tinyproxy,而是使用其他软件)?

Law*_*ceC 1

看起来tinyproxy不会真正透明地代理 HTTPS 连接,客户端必须使用该CONNECT方法,这意味着必须将其设置为使用代理。

无论如何,如果不安装 MITM 证书,您就无法透明地代理 HTTPS,否则每次访问都会给您带来证书错误或因此失败。

您可能需要更复杂的东西,例如squid.