Squid 3.5:在拦截模式下防止转发循环

Squid 3.5:在拦截模式下防止转发循环

我在不同的机器上设置了路由器和拦截 HTTP squid 代理。客户端应按以下方式使用代理(无需了解):

客户端 -> 路由器 (DNATing 到代理服务器) -> 代理服务器 -> 路由器 -> 互联网

到达代理服务器的请求具有以下属性:

  • 源 IP 地址:原始客户端的 IP 地址
  • 源端口:原始客户端的端口
  • 目标IP地址:代理服务器的IP地址(192.168.4.50)
  • 目标端口:3380

不幸的是,squid 似乎试图将数据包转发到请求的目标地址,即代理服务器本身,从而导致无限循环。摘自cache.log

2015/12/18 14:11:50 kid1| WARNING: Forwarding loop detected for:

我如何配置 squid 来通过 DNS 解析 HTTP 请求中的主机名,然后将请求转发到默认 HTTP 端口 80 上解析的 IP 地址?

补充信息:

DNAT 由路由器上的 iptables 完成,规则如下: iptables -t nat -A PRE_VS_PROXY -p tcp --dport 80 -j DNAT --to-destination 192.168.4.50:3380

示例条目access.log

1450444309.741      0 192.168.4.50 TCP_MISS/403 4277 POST http://ocsp.digicert.com/ - HIER_NONE/- text/html
1450444309.742     46 192.168.4.46 TCP_MISS/403 4341 POST http://ocsp.digicert.com/ - ORIGINAL_DST/192.168.4.50 text/html

squid的有效配置:

http_access allow localhost manager
http_access deny manager

http_access deny to_localhost

cache deny all

http_access allow all
http_access deny all

http_port 3128
http_port 3380 intercept
http_port 3443 intercept

coredump_dir /var/squid/cache/squid
shutdown_lifetime 1 seconds

使用 tcpdump 查看 DNS 流量,我可以看到,当 squid 处理 HTTP 请求时实际上正在发出两个 DNS 请求:一个用于解析 HTTP 请求中的主机名,一个是请求的目标 IP 地址的反向查找。

答案1

我今天也遇到了类似的要求。经过一番挖掘,看起来这是 Squid 为防止易受攻击而提供的功能http://www.squid-cache.org/Advisories/SQUID-2011_1.txt

从以下位置读取代码https://github.com/squid-cache/squid/blob/master/src/peer_select.cc#L287。它有意避免在拦截模式下对主机进行 DNS 查找。

答案2

http://lartc.org/lartc.html#LARTC.COOKBOOK.SQUID将是一个很好的起点。

不要将 DNAT 发送到代理,而是通过标记数据包将流量路由到代理。来自代理的流量将使用不同的接口。该接口未应用此路由策略。

相关内容