我想通过在 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):

这是必要的,因为否则代理将无法确定请求应转发到哪个服务器。
但这些“智能 DNS”代理服务器到底是如何工作的呢?(有关一般信息,请参阅此处)
因为它们不需要 CONNECT 请求,所以它们似乎不需要 CONNECT 请求即可工作。但他们如何确定请求应转发到的服务器呢?下面是使用此类“智能 DNS”代理(IP 为 37.xxx)的 HTTPS 连接转储。(DNS 被操纵以指向该代理):

那么,这是如何运作的呢?此外,有没有办法在我的 VPS 上实现这一点(也许不是使用 Tinyproxy,而是使用其他软件)?
看起来tinyproxy不会真正透明地代理 HTTPS 连接,客户端必须使用该CONNECT方法,这意味着必须将其设置为使用代理。
无论如何,如果不安装 MITM 证书,您就无法透明地代理 HTTPS,否则每次访问都会给您带来证书错误或因此失败。
您可能需要更复杂的东西,例如squid.
| 归档时间: |
|
| 查看次数: |
2080 次 |
| 最近记录: |