在透明模式下,以下 iptable 规则用于将流量重定向到 squid。
iptables -I PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-ports 3128
据我所知,REDIRECT 将目标 IP 地址更改为本地接口的 IP。
那么当流量到达 squid 时,由于目标 IP 已经改变,squid 如何知道将其转发到哪里?
答案1
您说得对,使用REDIRECT
,Squid 无法看到原始的目标 IP;相反,它将解析客户端在Host:
HTTP 标头中提供的主机,这在 HTTP 1.1 中是强制性的。
答案2
这与网关非常相似。
当客户端主机不知道目标主机在哪里时,它会将数据包发送到默认网关。网关定义该数据包应发送到何处。
透明代理也一样。所有发往 xxx.xxx.xxx.xxx:80 的数据包都会被转移到端口 3128,而不是数据包头中提到的端口。Squid 分析数据包及其头 -src
以及dst
相应的端口,然后像网关一样提交数据包,或者如果之前缓存过则立即发送应答。
主要思想是目标端口存储在每个数据包内,而数据包可以在传输过程中被路由到不同的主机/端口。