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

我想通过在VPS上运行的代理强制HTTP(S)stream量通过我家networking中的某些网站。

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

 sudo ssh -i /home/user/.ssh/id_rsa -nNT -L 80:localhost:8080 -L 443:localhost:8080 remoteuser@vps 

在本地访问代理。 当我configurationlocalhost:80作为代理在Firefox的设置一切工作正常(HTTP和HTTPS)。

但是因为我不希望所有的stream量通过这个代理,所以我把它添加到了我的电脑的/etc/hosts

 127.0.0.1 server.example 

server.example是为HTTP和HTTPSconfiguration的Web服务器的名称。

访问http://server.example工作,而在Firefox中打开https://server.example失败,错误

 SSL_ERROR_RX_RECORD_TOO_LONG 

还通过HTTPS curl页面失败:

 curl: (35) error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol 

据我所知,这个问题是由tinyproxy响应HTTPS请求与普通的HTTP引起的。

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

这是我的设置造成的问题还是tinyproxy而不是不能做到这一点? 是否有一个不同的代理服务器是有能力的?

编辑:目前我正在我的PC上运行SSH隧道和DNS修改也是本地,但我想稍后部署在我的路由器,以便从我的networking的任何设备的stream量通过此代理。

编辑2:正如@SteffenUllrich在评论中写道,当HTTPS通过HTTP代理路由时,客户端在握手发生之前首先发送未encryption的CONNECT请求。 看到这里(SSH隧道到VPS正在运行在10.0.5.4 ):

https://i.imgur.com/hPtPY3h.png

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

但是,这些“智能DNS”代理服务器究竟如何工作呢? (一般信息见这里 )

因为他们不需要CONNECT请求,他们似乎没有工作。 但是他们怎么能确定请求应该被转发的服务器呢? 这是使用这种“智能DNS”代理(IP为37.xxx)的HTTPS连接的转储。 (DNS被操纵指向该代理):

https://i.imgur.com/hyOHejm.png

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

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

您无法透明地代理HTTPS而无需安装MITM证书,否则每次访问都会导致证书错误或由于此原因而失败。

你可能需要更复杂的东西,如squid

但是,这些“智能DNS”代理服务器究竟如何工作呢? 他们不需要CONNECT请求,他们似乎没有工作。

我认为这些智能DNS代理通过从普通HTTP的HTTP请求中提取目标域来工作。 对于HTTPS,他们可能会在TLS握手开始时从ClientHello消息中的SNI TLS扩展中提取域。

一个类似的设置可以用鱿鱼代理来构build。 此代理可以configuration为在中央路由器上用作透明代理。 由于所有的客户端都使用这个路由器作为网关,因此相关端口上的stream量(80,443用于http和https)可以通过数据包过滤规则redirect到代理服务器,即不需要特殊的DNS设置。

然后,代理可以从HTTP头(普通HTTP)或ClientHello(HTTPS)中提取真实目标,而不会破坏SSLencryption – 请参阅squid:SSL Peek And Splice了解详细信息。 鱿鱼代理也可以configuration为具有不同的上游代理(如您的VPS)或直接连接,具体取决于目标。