我正在开展一个安全项目,该项目需要远程访问的透明代理。我已经设置了一个运行 Ubuntu 18.04 的 Azure VM,其中 squid 作为透明代理运行。我只关心通过代理路由外部 HTTP 流量。将连接到代理的客户端配置了一个 DNS 服务器,该服务器会将所有请求伪装成 VM 的 IP。
配置的问题在于squid 不会根据 HTTP 请求的Host
标头透明地代理 HTTP 请求,而是尝试连接到其原始目标 IP 地址(即回到自身)。因此,当访问 HTTP 网站时(使用http://scratchpads.org(作为示例)在客户端上观察到以下错误:
The following error was encountered while trying to retrieve the URL: http://scratchpads.org/
Connection to 10.0.1.4 failed
The system returned: (111) Connection refused
其中 10.0.1.4 是虚拟机的内部 IP。
为了测试目的,squid 配置保持最低限度:
http_access allow all
http_port 3129
http_port 3128 intercept
VM 上通过 squid 转发外部流量的 iptables 配置如下:
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
尝试访问该网站时的 squid 访问日志如下:
1614856056.293 0 [request source IP] TCP_MISS/503 4310 GET http://scratchpads.org/ - ORIGINAL_DST/10.0.1.4 text/html
1614856056.619 0 [request source IP] TCP_MISS/503 4218 GET http://scratchpads.org/favicon.ico - ORIGINAL_DST/10.0.1.4 text/html
我已检查 DNS 请求在虚拟机上是否正确解析,并且来自该机器的流量未通过 squid 路由(如预期),因此不存在转发循环。squid 启动日志、缓存日志或访问日志中也没有错误。我还尝试了各种 squid ACL 和 iptables 配置(设置 DNAT 和伪装规则),但均无效。
有谁知道如何根据 HTTP 请求的Host
标头将其代理到其原始目的地,而不是返回到透明代理的 IP?
答案1
事实证明,使用 squid 无法做到这一点出于一些好的理由。我通过将 Privoxy 设置为“拦截”模式解决了这个问题,这正是我所需要的。