我正在尝试为所有类型的框架(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流量?
答案 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实例,但这会破坏透明代理的全部目的,因为您正在配置客户端。