我想通过在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
):
这是必要的,否则代理将无法确定请求应该转发到哪个服务器。
但是,这些“智能DNS”代理服务器究竟如何工作呢? (一般信息见这里 )
因为他们不需要CONNECT请求,他们似乎没有工作。 但是他们怎么能确定请求应该被转发的服务器呢? 这是使用这种“智能DNS”代理(IP为37.xxx)的HTTPS连接的转储。 (DNS被操纵指向该代理):
那么,这是如何工作的? 此外,有没有办法在我的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)或直接连接,具体取决于目标。