tinyproxy无法转发Connect方法

时间:2016-03-25 05:45:12

标签: http https proxy http-proxy transparentproxy

我正在尝试为所有类型的框架(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流量?

3 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:2)

要通过代理服务器透明地转发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的端口。

使用此配置后,计算机上的每个客户端都将透明地使用代理,而无需为每个客户端调整配置。

答案 2 :(得分:1)

您无法使用HTTPS透明代理。这违背了SSL的全部目的。如果您尝试转发端口443(SSL / HTTPS),则会出现SSL连接错误,因为不允许Man-in-the-Middle攻击。

我认为解决方法是手动配置浏览器以指向TinyProxy实例,但这会破坏透明代理的全部目的,因为您正在配置客户端。