🔗 检测到主机头伪造
🔗 症状
SECURITY ALERT: Host header forgery detected on ... (local IP does not match any domain IP)
SECURITY ALERT: By user agent: ...
SECURITY ALERT: on URL: ...
🔗 解释
这是在 Squid-3.2 中添加的一项新安全功能生成的警报,旨在保护网络免受恶意 Web 脚本劫持。
正如咨询 SQUID-2011:1 中所述,这些脚本能够绕过浏览器安全措施,并通过网络传播感染。它们通过伪造经过拦截代理的 HTTP 流量中的Host: 头来实现这一点。
拦截端口 443 时,在生成的 CONNECT 请求中使用的客户端 SNI 值可以执行此检查。如果该 SNI 名称未解析到目标服务器 IP,则会输出此消息并停止 TLS。
为了避免此漏洞,Squid 已解析了客户端假定正在联系的域名,并确定 HTTP 请求的目标 IP 不属于该域名。
三行引用的第一行
- local=(数据包目标 IP)客户端正在连接的域的地址,
- remote=(数据包源 IP)正在建立连接的客户端的地址,以及警报原因。
在这种情况下,它是“本地 IP 与任何域名 IP 不匹配”。
启用 host_verify_strict 后,可以触发其他检查来发出警报。
第二行和第三行不言自明。
🔗 修复
使用 WPAD/PAC 协议自动配置浏览器代理,而不是拦截流量
或
使用 Active Directory(R) GPO自动配置浏览器代理,而不是拦截流量。
或
手动配置浏览器
所有这些方法都会使客户端浏览器代理了解代理。这会导致浏览器发送格式不同的 HTTP 请求,从而避免安全漏洞和显示警报的检查。
您还可以根据警报中提到的详细信息确定客户端已被劫持或感染。在这种情况下,正确的修复可能涉及其他操作来清除感染,此处不作介绍。
🔗 规避方法
截至 2012 年 5 月,Squid-3.2.0.18 将会把未能通过这些验证检查的流量传递给客户端预期的同一源。但会禁用缓存、路由错误恢复和对等路由,以确保安全。未来打算安全地支持这些流量的功能。
实际上没有变通方法。只有修复。尽管网络中可能有一些配置会导致警报不应发生而发生。
以下详细信息是 NAT 拦截或 TPROXY 代理的强制性配置。其中一些之前似乎是可选的,因为旧的 Squid 错误现已修复。
- 确保 NAT 在与 Squid 相同的框上执行。
Squid必须能够访问 NAT 系统关于原始目标 IP 的记录。没有这些信息,所有流量都会收到 409 HTTP 错误并记录此警报。
在与路由器不同的机器上运行 Squid 时,请使用策略路由或隧道将流量传递给 squid。不要在流量到达 Squid 之前在路由器机器上执行目标 NAT(DNAT、REDIRECT、端口转发)。 - 确保 Squid 使用的 DNS 服务器与客户端使用的 DNS 服务器相同。
某些流行的 CDN 托管网络使用负载均衡系统来确定 DNS 查询响应中返回哪些网站 IP。这些是基于查询 DNS 解析器的 IP。如果 Squid 和客户端使用不同的解析器,则结果不同的可能性会增加。这可能导致此警报。 - 确保您的 DNS 服务器遵守该域名 IP 轮换 TTL。
某些 CDN 网络通过在每个 TTL 周期中轮换一组 IP 来进行负载均衡。将网站 IP 存储时间超过 TTL 允许时间违反了 DNS 协议,从而会定期产生不正确的 DNS 响应。此警报只是该违规行为造成的更明显的副作用之一。 -
确保不直接使用商业 8.8.8.8 服务。
此服务以在每次查询时轮换查找结果而闻名——比它服务的区域的 TTL 快得多。
如果您确实需要使用此服务,则应设置一个本地 DNS 解析器,该解析器使用它作为上游转发器。本地网络机器可以使用该本地解析器访问 DNS。
这些是可选的,可能无法实现,但工作正常时很有用
- 启用 EDNS(扩展 DNS 巨型数据包)和大型 UDP 数据包支持。
- 一些流行的域名托管在比常规 DNS 查询响应能容纳更多的 IP 上。它们的响应可能会出现不一致,因为 IP 会出现在常规 DNS 数据包显示的少量 IP 中并消失。
- Squid-3.2 可以尝试使用 EDNS 获取这些域名所有 IP 的大型数据包,方法是设置 dns_packet_max 指令。这降低了 Squid 丢失客户端正在连接的 IP 的几率,但要求您的解析器支持 EDNS,并且网络支持巨型数据包。
- 限制 HTTP 持久(keep-alive)连接
- 由于 CDN 的问题基本上是它们的 DNS 响应变化太快,HTTP 连接的寿命很长,可能会超过这种变化并导致误报。
- 可以将 client_lifetime 配置为较短的时间,以减少这些不匹配的发生。默认的 1 天已针对 DNS 推荐的最佳实践 TTL 进行调整。
- 或者,可以将 client_persistent_connections 设置为off以完全禁用 HTTP keep-alive。
🔗 其他原因
通过dnsmasq工具或通过其他 DNS 技巧在 DNS 层执行拦截,从而更改了客户端在域名查找时收到的目标 IP。
在这些情况下,Squid-3.2 的劫持保护将把流量传递给客户端的目标 IP 地址,而不重定向到任何特定其他 IP。需要额外的目标 NAT 配置来识别数据包并确保它们被传递到正确的站点,而不管任何其他详细信息。
类别: 知识库
导航: 站点搜索、站点页面、类别、🔼 向上