我在不同的机器上设置了路由器和拦截 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 发送到代理,而是通过标记数据包将流量路由到代理。来自代理的流量将使用不同的接口。该接口未应用此路由策略。