6

我正在尝试为所有类型的帧(HTTP、HTTPS)设置透明代理,我正在使用 tinyproxy 来执行此操作。我已经设置了我的路由器以将所有传入和传出帧重定向(使用 NAT)到 tinyproxy(正在侦听端口 8888)。

我尝试访问 HTTPS 网站 ( https://www.google.com/ ),但出现 SSL 连接错误。查看 tinyproxy 日志,我看到以下内容:

CONNECT   Mar 24 23:34:27 [22533]: Connect (file descriptor 11): 128.112.94.38 [128.112.94.38]
CONNECT   Mar 24 23:34:27 [22533]: Request (file descriptor 11): 
WARNING   Mar 24 23:34:27 [22533]: Could not retrieve all the headers from the client
INFO      Mar 24 23:34:27 [22533]: Read request entity of 103 bytes

tinyproxy 文档说,只要我在tinyproxy.conf文件中设置以下行,Connect 帧的转发应该透明地工作:

# ConnectPort: This is a list of ports allowed by tinyproxy when the
# CONNECT method is used.  To disable the CONNECT method altogether, set
# the value to 0.  If no ConnectPort line is found, all ports are
# allowed (which is not very secure.)
#
# The following two ports are used by SSL.
ConnectPort 443
ConnectPort 563

我还尝试删除所有ConnectPort行以查看是否有效(无效)。有谁知道为什么我无法透明地转发 HTTPS 流量?

4

3 回答 3

3

要通过代理服务器(没有中间人)透明地转发 TLS 流量,您需要一个proxifier。如果您的浏览器或其他一些客户端不知道它正在通过代理服务器进行通信,则它不会使用 CONNECT 方法通过代理建立连接。这就是代理器正在为您做的事情。

对于 Linux,例如redsocks。对于我运行 Raspbian 的 Raspberry Pi,默认存储库中有一个包。要安装它,请键入:

sudo apt-get install redsocks

下面是一个示例/etc/redsocks.conf

redsocks {
    /* `local_ip' defaults to 127.0.0.1 for security reasons,
     * use 0.0.0.0 if you want to listen on every interface.
     * `local_*' are used as port to redirect to.
     */
    local_ip = 0.0.0.0;
    local_port = 12345;

    // `ip' and `port' are IP and tcp-port of proxy-server
    // You can also use hostname instead of IP, only one (random)
    // address of multihomed host will be used.
    ip = [proxy ip];
    port = [proxy port];


    // known types: socks4, socks5, http-connect, http-relay
    type = http-connect;

    // login = "foobar";
    // password = "baz";
 }

要转发 TLS 流量,请使用该http-connect类型。对于常规 HTTP 流量,请使用http-relay. 您需要为每个单独的 redsocks 部分。

然后你需要一个 iptables 规则来将 TLS 流量重定向到 redsocks 服务

sudo iptables -A PREROUTING -t nat -p tcp --dport 443 -j REDIRECT --to-port 12345

同样,将 HTTP 流量从端口 80 重新路由到您用于 http-relay 的端口。

有了这个配置,您机器上的每个客户端都将透明地使用代理,而无需为每个客户端调整配置。

于 2017-10-21T12:56:05.643 回答
3

您没有在正常网络意义上使用术语“帧”(L2),TCP 或 HTTP/HTTPS 连接(L6/7)是在这里使用的更好术语。

tinyproxy将在透明模式下处理 HTTP 代理请求连接(其中CONNECT一种类型)或非代理 HTTP 请求(您可以在显示的功能列表中确认已启用tinyproxy -h)。

当浏览器配置为使用代理时,它会相应地修改其出站请求。在透明模式下,浏览器不知道代理(并且不能配置一个)。该ConnectPort选项列出了客户端CONNECT在正常代理模式下允许访问的端口(以防止滥用)。

如果您tinyproxy在 HTTPS 的透明模式下使用,则没有CONNECT,更重要的是没有标头(这就是您看到该错误的原因)并且没有 URL。通常主机/端口部分可以从目标 IP、端口和 SNI 扩展中推断/推断——因为tinyproxy依赖于一些外部防火墙来重定向(更改目标 IP)到它的连接,它没有完整的请求信息。

这个时候tinyproxy只能作为一个透明的 HTTP 代理使用,文档有点模糊。如果没有 HTTPS 检查(即解密 TLS 连接)来访问客户端请求,它甚至不能成为简单的 TCP 连接转发器。其他代理squid也支持 TLS 检查 ( sslbump)。

于 2017-05-17T16:49:03.460 回答
2

您不能使用 HTTPS 进行透明代理。这违背了 SSL 的全部目的。如果您尝试转发端口 443 (SSL/HTTPS),那么您将收到 SSL 连接错误,因为不允许中间人攻击。

我想一种解决方法是手动配置浏览器以指向 TinyProxy 实例,但这超出了透明代理的全部目的,因为您正在配置客户端。

于 2017-09-20T17:26:39.133 回答