我正在开发一个需要可远程访问的透明代理的安全项目。我已经设置了一个运行 Ubuntu 18.04 的 Azure VM,鱿鱼作为透明代理运行。我只关心通过代理路由外部 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 是 VM 的内部 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 请求是否在 VM 上正确解析,并且来自机器的流量没有通过 squid 路由(如需要),因此没有转发循环。squid 启动日志、缓存日志或访问日志中也没有错误。我还尝试了各种 squid ACL 和 iptables 配置(设置 DNAT 和伪装规则),但均无效。
有谁知道我怎样才能根据标头将 HTTP 请求代理到其原始目的地Host
,而不是返回到透明代理的 IP?