Squid 拦截代理陷入转发循环

Squid 拦截代理陷入转发循环

我正在尝试使用 Squid 设置调试代理,主要是为了测试我们自己的客户端通信库的各种代理类型(我们的客户端的一种可能性是连接到外部拦截和过滤代理服务)。

我们的网络设置如下:

[客户端设备/浏览器] -- [代理,仅公共 IP] -- [目标网站,例如 Google、Facebook 等]

测试设置时,从 Linux 客户端执行此操作可以正常工作(因为端口 8991 未设置拦截):

$ curl --proxy http://<squidserverip>:8991 http://www.example.com/

但是,此版本会从 Squid 发出“访问被拒绝”错误页面(因为端口 8990 设置了拦截):

$ curl --proxy http://<squidserverip>:8990 http://www.example.com/

在 Squid 服务器上,我在 cache.log 中看到以下内容:

2015/03/11 20:10:44 kid1| WARNING: Forwarding loop detected for:
GET / HTTP/1.1
User-Agent: curl/7.26.0
Host: www.example.com
Accept: */*
Via: 1.1 <servername> (squid/3.4.8)
X-Forwarded-For: <client-source-ip>
Cache-Control: max-age=259200
Connection: keep-alive

在这些示例中,出于安全原因,我混淆了实际请求(使用占位符名称/标题)。

我的 squid.conf 目前看起来像这样(删除了注释行和空白行):

acl SSL_ports port 443
acl SSL_ports port 8443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl Safe_ports port 8443
acl CONNECT method CONNECT
acl SSL method CONNECT
http_access allow manager localhost
http_access deny manager
http_access allow localhost
http_access allow all
http_reply_access allow all
http_port 8990 intercept   ssl-bump cert=/etc/squid3/certificate.pem generate-host-certificates=on
http_port 8991
https_port 8443 cert=/etc/squid3/certificate.pem key=/etc/squid3/certificate.pem ssl-bump intercept generate-host-certificates=on  dynamic_cert_mem_cache_size=4MB options=ALL
ssl_bump none localhost
ssl_bump client-first all
sslproxy_flags DONT_VERIFY_PEER
sslproxy_cert_error allow all
sslcrtd_program /usr/lib/squid3/ssl_crtd -s /var/lib/ssl_db -M 4MB
sslcrtd_children 5
netdb_filename none
coredump_dir /var/spool/squid3
pinger_enable off
cache deny all
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320
query_icmp off
always_direct allow all
never_direct allow all

根据我通过 Google 进行的搜索,我得出的结论是,拦截功能需要我使用 iptables 设置一些自定义路由,但我尝试过的各种配置都没有给出任何结果。

我们似乎能够从客户端很好地连接到 Squid(在所有三个端口上,包括 https_port 的 SSL 握手),但我无法在执行拦截的两个端口上成功执行请求。

任何帮助都将不胜感激,无论是为我们的网络配置提供正确的 iptables 设置,还是对 squid.conf(或服务器上的其他配置文件)进行必要的更改。

相关内容