关于代理这块

前言

简单写一下关于代理这一块的自定义的一些心得。

正文

一般情况下,我们使用nginx代理,这是反向代理。

然后有些情况下,我们需要正向代理,比如本地需要根据不同用户代理到不同的地区。

那么这个就需要我们自定义我们的代理。

这里用c#的一个库举例:Titanium.Web.Proxy

在了解到正向代理有两种,一个是代理中间人模式,一种是透传模式。

首先介绍一下透传模式:

在 透传代理(Forward Proxy) 模式下,Titanium.WebProxy 是否要求 被代理方(客户端或目标服务器)自行解密 HTTPS 流量,取决于代理的具体配置:

  1. 透传 HTTPS 流量(不解密)

当设置 ForwardToUpstreamGateway = true 时:

代理行为:

代理仅作为 隧道(Tunnel),直接转发客户端的原始 HTTPS 流量到目标服务器。

不解析、不修改、不解密 HTTPS 内容。

客户端与目标服务器之间仍保持端到端加密。

被代理方的解密责任:

客户端:需要自行完成 TLS 握手(如浏览器验证服务器证书、协商密钥)。

目标服务器:需要正常解密客户端发送的 HTTPS 请求。

性能影响:

代理无加解密开销,性能接近直接连接。

适用于仅需转发流量、无需监控或修改内容的场景。

这种情况呢,这种情况就是建立了两个tcp,一个tcp来数据了直接丢给另外一方。

我们来看下它是如何建立这个两个连接的。

首先客户端发起connect 代理请求来验证,

然后代理方进行验证后,和connect的host服务器进行建立隧道,简单理解为建立tcp连接吧。

然后这个时候代理方就会返回给客户端代理成功了。

这时候就打通隧道了。后面客户端就直接可以和服务器通信了。

如果遇到根据不同用户需要转到不同的代理,那么在connect的时候,就不建立到host服务器的连接,而是建立和下一级代理服务器的连接。

proxyServer.BeforeRequest += (sender, e) => 
{
    if (e.HttpClient.Request.Method == "CONNECT")
    {
        e.CustomUpstreamProxy = new ExternalProxy 
        {
            Host = GetSecondaryProxyByUser(e.HttpClient.Session.SessionId),
            Port = 8080
        };
        e.DisableInterception = true; // 保持透传
    }
};

二级代理的要求:

proxyServer.BeforeRequest += (sender, e) => 
{
    if (e.HttpClient.Request.Method == "CONNECT")
    {
        e.CustomUpstreamProxy = new ExternalProxy 
        {
            Host = GetSecondaryProxyByUser(e.HttpClient.Session.SessionId),
            Port = 8080
        };
        e.DisableInterception = true; // 保持透传
    }
};

当建立connect的时候,设置CustomUpstreamProxy ,那么就会连接到下一级代理。

这就是透传模式,建立两个tcp进行转发,就像一条隧道一样。

这就是https的透传,那有没有http透传呢?

但是好像没有怎么听到http透传呢? 这是怎么回事呢?

首先达到http透传是可以实现的,只要不拦截,其实是http是一致的。

Get example.com HTTP/1.1
Host: example.com
Proxy-Authorization: Basic dXNlcjpwYXNz  # 代理认证(可选)

如果http 是长连接的话,也是第一个需要带上Proxy-Authorization,其他时候不需要认证,那么其实是可以和https一样可以达到隧道的效果的。

那么为什么http 大多数时候不做隧道,而做拦截呢?

可以但不实用:
HTTP 代理技术上可以不解析请求,但会失去核心价值,仅适用于极简场景。

设计权衡:
HTTP 的明文特性与代理功能的强耦合,使得解析成为默认选择。

替代方案:
如需完全透传,应使用隧道(如 CONNECT)或原始 TCP 代理,而非 HTTP 代理。

MITM 中间人代理模式。

就是捕获到流量后,根据请求,自己请求后,然后返回给客户端。

简单介绍一下。

posted @ 2025-06-26 14:57  敖毛毛  阅读(83)  评论(0)    收藏  举报