Squid Web Cache Wiki

Squid Web Cache 文档

🔗 如何让 Windows 更新缓存?

Windows 更新通常(但不总是)使用 HTTP Range-Offsets(也称为文件分块范围)来并行下载 Microsoft 更新存档的片段,或使用随机访问算法来减少网络流量。某些版本的 Squid 目前对 Range 的处理或存储效果不佳。

需要结合多种配置选项来强制缓存范围请求。尤其是在处理大型对象时。

:information_source: 由于下面提到的速度缓慢问题,我们建议特殊处理服务包

🔗 防止过早或频繁替换

一旦您完成了上述操作以缓存更新,您就会遇到某些软件经常强制进行完整对象重新加载而不是重新验证的问题。这会将缓存的内容推出,并非常频繁地获取新对象。

当时流传的一个想法是使用 refresh_pattern 正则表达式配置来实现 WU 缓存。我决定在我的 squid 代理中测试这个想法,以及一两个其他想法(其他想法彻底失败,但 WU 缓存效果非常好)。

这个想法基本上是这样的:

refresh_pattern microsoft.com/.*\.(cab|exe|ms[i|u|f]|asf|wm[v|a]|dat|zip) 4320 80% 43200

最初的想法在理论上似乎有效,但在实践中却非常无用——更新会在 30 分钟后过期,存在下载不一致以及一系列问题。因此,查看 HTTP 响应和 refresh_pattern 的文档,发现可以添加一个额外的子句。它是这样改变的:

refresh_pattern -i microsoft.com/.*\.(cab|exe|ms[i|u|f]|[ap]sf|wm[v|a]|dat|zip) 4320 80% 43200 reload-into-ims
refresh_pattern -i windowsupdate.com/.*\.(cab|exe|ms[i|u|f]|[ap]sf|wm[v|a]|dat|zip) 4320 80% 43200 reload-into-ims

现在,这一行告诉我们缓存来自 microsoft.com 的所有 .cab、.exe、.msu、.msf、.asf、.psf、.wma、…… 到 .zip 文件,对象在缓存中的生命周期为 4320 分钟(即 3 天)到 43200 分钟(即 30 天)。每个下载的对象都会被添加到缓存中,然后当请求到达时,它会指示不能使用缓存副本,并将其转换为 if-modified-since 检查,而不是新的副本重新加载请求。

所以,将其添加到原始的 Squid 配置中,关于 refresh_pattern,我们得到:

# Add one of these lines for each of the websites you want to cache.

refresh_pattern -i microsoft.com/.*\.(cab|exe|ms[i|u|f]|[ap]sf|wm[v|a]|dat|zip) 4320 80% 43200 reload-into-ims

refresh_pattern -i windowsupdate.com/.*\.(cab|exe|ms[i|u|f]|[ap]sf|wm[v|a]|dat|zip) 4320 80% 43200 reload-into-ims

refresh_pattern -i windows.com/.*\.(cab|exe|ms[i|u|f]|[ap]sf|wm[v|a]|dat|zip) 4320 80% 43200 reload-into-ims


# DONT MODIFY THESE LINES
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

这应该可以限制系统每分钟下载数万亿次 Windows 更新。它将分发 Windows 更新,并将它们存储在 squid 缓存中。

我还建议分配 30 到 60GB 的 cache_dir 大小,这样您就可以下载大量的 Windows 更新和其他内容,然后您将不会遇到任何主要的缓存存储或缓存分配问题,或任何其他与缓存相关的问题。

🔗 为什么通过 Squid 这么慢?

许多缓存维护者使用的解决方法是设置上述配置,并在范围请求通过时强制 Squid 获取整个对象。

:information_source: 问题的加剧(讽刺的是,也导致了一些减速)是,一些 Microsoft 服务器可能告诉您的 Squid 不要存储存档文件。这意味着 Squid 每次需要任何小片段时都会拉取整个存档。

您需要使用更小的值来测试您的 squid 配置,用于 range_offset_limit 绕过,以查看哪种能为您提供最佳结果。

尝试强制缓存 Windows 更新时偶尔会出现的另一个症状是服务包。

:information_source: 如果 quick_abort_minquick_abort_maxquick_abort_pct 设置为中止不完整的下载,并且客户端在下载了几乎但未完全下载服务包后关闭。后续请求的客户端通常会因等待 Squid 从头开始重新下载整个对象而超时。这自然会导致问题在后续重启尝试中重复出现。

🔗 如何阻止 Squid 为 Windows 更新弹出身份验证框?

将以下内容添加到您的 squid.conf 中,假设您已将 localnet 定义为您的本地客户端。它‘必须’ 添加到顶部附近,在任何需要身份验证的 ACL 之前。

acl windowsupdate dstdomain windowsupdate.microsoft.com
acl windowsupdate dstdomain .update.microsoft.com
acl windowsupdate dstdomain download.windowsupdate.com
acl windowsupdate dstdomain redir.metaservices.microsoft.com
acl windowsupdate dstdomain images.metaservices.microsoft.com
acl windowsupdate dstdomain c.microsoft.com
acl windowsupdate dstdomain www.download.windowsupdate.com
acl windowsupdate dstdomain wustat.windows.com
acl windowsupdate dstdomain crl.microsoft.com
acl windowsupdate dstdomain sls.microsoft.com
acl windowsupdate dstdomain productactivation.one.microsoft.com
acl windowsupdate dstdomain ntservicepack.microsoft.com

acl CONNECT method CONNECT
acl wuCONNECT dstdomain www.update.microsoft.com
acl wuCONNECT dstdomain sls.microsoft.com

http_access allow CONNECT wuCONNECT localnet
http_access allow windowsupdate localnet

上述配置对于其他自动更新站点(如防病毒供应商)也很有用,只需将他们的域名添加到 acl 即可。

:information_source: 如果您有 squid 在 localhost 端口上监听,并且有其他软件在前(例如 dansGuardian),您可能需要允许 localhost 地址,以便前端服务能够中继请求。

    ...
    http_access allow CONNECT wuCONNECT localnet
    http_access allow CONNECT wuCONNECT localhost
    http_access allow windowsupdate localnet
    http_access allow windowsupdate localhost

🔗 使用 netsh 进行代理配置

作者:Yuri Voinov

语法

netsh winhttp set proxy ProxyName:80 "<local>"

C:\> netsh winhttp set proxy 192.168.1.100:3128 "localhost;192.168.1.100"

要重置 WinHTTP 的代理设置,请使用

C:\> netsh winhttp reset proxy

🔗 带 SSL-Bump 和 Windows 更新的 Squid

作者:Yuri Voinov

在现代的 Squid 设置中,Windows Update 无法检查更新,并出现错误“WindowsUpdate_80072F8F” 或类似错误。

WU 现在使用自己的固定 SSL 证书,必须进行拼接才能工作。当您使用嗅探器时,可以看到许多 IP 地址,它们具有相对较大的子网。这会导致 Squid-3.4 出现问题,并在使用 Squid-3.5 或更高版本时导致严重问题。

要使用拼接,您需要知道服务器的名称,但是递归 DNS 查询不会给出结果。

要通过 Squid 拼接 WU 检查,您只需要拼接以下 MS 服务器:

update.microsoft.com
update.microsoft.com.akadns.net 

在实际设置中使用,请创建 url.nobump 文件

# WU (Squid 3.5.x and above with SSL Bump)
# Only this sites must be spliced.
update\.microsoft\.com
update\.microsoft\.com\.akadns\.net 

像这样将此文件作为 Squid ACL 添加:

acl DiscoverSNIHost at_step SslBump1
acl NoSSLIntercept ssl::server_name_regex -i "/usr/local/squid/etc/url.nobump"
ssl_bump splice NoSSLIntercept
ssl_bump peek DiscoverSNIHost
ssl_bump bump all

这样您就不需要知道所有更新服务器的 IP 地址了。

:information_source: 注意: 在某些国家/地区,WU 可能会通过 Akamai 产生 SQUID_X509_V_ERR_DOMAIN_MISMATCH 错误。为了使 WU 工作,您可能需要将以下内容添加到您的 Squid 配置中:

    acl BrokenButTrustedServers dstdomain "/usr/local/squid/etc/dstdom.broken"
    acl DomainMismatch ssl_error SQUID_X509_V_ERR_DOMAIN_MISMATCH
    sslproxy_cert_error allow BrokenButTrustedServers DomainMismatch
    sslproxy_cert_error deny all

and add this to **dstdom.broken**:

    download.microsoft.com
    update.microsoft.com
    update.microsoft.com.akadns.net
    update.microsoft.com.nsatc.net

:information_source: 根据您的 Squid 配置,您可能需要将您的 Squid 的密码套件配置更改为以下之一:

    sslproxy_cipher HIGH:MEDIUM:RC4:3DES:!aNULL:!eNULL:!LOW:!MD5:!EXP:!PSK:!SRP:!DSS

and add this one to your bumped port's configuration:

    cipher=HIGH:MEDIUM:RC4:3DES:!aNULL:!eNULL:!LOW:!MD5:!EXP:!PSK:!SRP:!DSS

3DES and RC4 required to connect to WU and - **attention** - Skype
assets site.

:warning: 由于上面的拼接,某些更新无法缓存。

:warning: 添加 3DES,尤其是 RC4,会通过客户端和 WU/Skype 等网站产生潜在的弱密码套件。请小心!

🔗 另请参阅

回到 FAQ 索引

导航: 网站搜索网站页面分类🔼 向上