正如标题所解释的,我正在尝试在独立于路由器的机器上设置 Squid 透明代理,并且也独立于我想要通过代理过滤的私有网络。
上下文可能是这样的:
路由器机器运行 CentOS 6.0,并应用了 iptables 策略。
WAN 接口为 eth0。接口 eth3 连接包含代理服务器的网络,eth2 是私有网络接口。
Iptables 规则用于接受私有网络内的流量。
Squid 版本为 3.5.2,运行在 CentOS 7.0 上。
重要的一点是:如果在客户端浏览器中手动配置并且 squid.conf 文件中没有透明标志,则代理可以完美运行。
当我尝试使代理透明时,问题开始出现。这是我已经尝试过的方法:在路由器的机器上,我应用了以下 iptables 规则:
$ iptables -t nat -I PREROUTING 1 -i eth2 -s 私有 IP -p tcp --dport 80 -j DNAT --to squid-ip:3128
我最初以为这样就足够了,因为手动配置时它工作得很好,现在唯一的区别是我需要将流量重定向到 squid 机器。但事情并没有像我预期的那样发展。
在路由器上使用 tcpdump 运行一些测试后,我意识到,如果没有透明标志,代理机器就知道如何通过路由器到达互联网并返回到客户端的机器(privateIP > router > proxyServer > router > internet | 然后再返回 | > router > proxyServer > router > privateIP)。
但是使用透明标志,数据包只能通过路由器到达代理,然后再返回到客户端的机器,完全忽略 squid.conf 文件阻止的一切,因此,没有数据包离开代理进入互联网(privateIP > router > proxyServer > router > privateIP)。似乎 squid 代理不知道如何处理传入流量,因此它无法正确处理请求,因为它已设置为透明,并且不在网关上。
我以为我需要一个 POSTROUTING 规则来执行 SNAT 并更改源地址,以便传入的互联网流量也能通过代理,但实际上没有数据包离开互联网,所以现在我被困住了。
也许当 Squid 不处于透明模式时它会自动执行某些操作,而当我将其设置为透明模式时则需要手动进行配置。
任何帮助,将不胜感激。
答案1
我目前有这个设置(或接近它)在工作,但有一些不同。我没有使用 CentOS,而是使用静态路由来捕获端口 80 上到我的 pfSense 网关的流量,并将其重定向到另一个运行 Squid 的基于 pfSense 的盒子。我的设置的不同之处在于,当 pfSense Squid 设置为执行透明代理时,它会监听端口 80 上的连接,而不是通常的 3128。您可以运行 netstat 并查看您的 Squid 是否在监听端口 80,然后尝试转发到该端口。
祝你好运。
答案2
如果代理和客户端之间有直接路径或通过另一个路由器,就会发生这种情况
- 客户端向google.com发送数据包(源:本地PC,目的地:google.com)
- 网关接收数据包,并将 Google 的 IP 替换为代理的 IP(源:本地 PC,目的地:Squid)
- Squid 服务器收到该数据包,由于这是三次 TCP 握手(SYN)的第一个数据包,因此它会生成一个 SYN-ACK 数据包(源:Squid,目的地:本地 PC)
- Squid服务器直接将上述数据包发送给PC。
- 本地 PC 收到来自 Squid 服务器的 SYN-ACK 数据包,注意到它从未要求与该服务器对话,并立即丢弃该数据包。
重复步骤 1-5 几次,直到连接最终超时。