原因:
今天升级一台 Ubuntu, 安装了 600MB。 所以去找类似 Microsoft WSUS 这样的应用。
APT-Cacher-NG Server 介绍:
- 可作为中间代理服务器,缓存从官方软件源下载的软件包
- 当局域网内其他机器需要相同软件包时,直接从缓存中提供,无需重复从互联网下载
- 支持多种软件包格式,包括 .deb、.rpm 等
- 可以统一管理软件包的更新和分发
- 适合有多台 Linux 服务器需要更新的环境
- 支持 SSL/TLS 加密连接
- 有详细的访问日志
- 有 Web 界面监控状态
- 有过期策略,自动清理旧包
- 等
官网:Apt-Cacher NG - Software Package Download Proxy
工作原理:
- 客户端请求软件包
- apt-cacher-ng 检查本地缓存
- 如果缓存中存在,直接返回
- 如果不存在,从官方源下载并缓存
- 向客户端分发软件包
实践环境:
网络拓扑:
代码见附件1
3台 Ubuntu 主机: ub1, ub2, ub3 都是 TLS desktop 24.04
Apt-Cacher-ng Server 运行在 ub1
条件:只缓存 24.04 发行的软件升级包
配置步骤:
这个很简单 略...
一、在 ub1
1. 安装 apt-cacher-ng
sudo apt update
sudo apt install apt-cacher-ng
2. 编辑配置文件
sudo vi /etc/apt-cacher-ng/acng.conf
# 基本设置
CacheDir: /var/cache/apt-cacher-ng
LogDir: /var/log/apt-cacher-ng
SupportDir: /usr/lib/apt-cacher-ng
Port: 3142
ReportPage: acng-report.html
ExThreshold: 4
LocalDirs: acng-doc /usr/share/doc/apt-cacher-ng
# 镜像配置
Remap-ubuntu: deb.ubuntu.com/ubuntu/ ubuntu/
Remap-security: security.ubuntu.com/ubuntu/ ubuntu/
# 文件匹配的规则
VfilePattern: \.deb|\.tar\.gz|\.tgz|\.dsc|\.udeb|\.diff\.gz|Release|Packages|Sources|Release\.gpg|InRelease|Commands.*|\.cnf|Translation-.*|Components|by-hash
PfilePattern = .*(deb|dsc|tar(\.gz|\.bz2|\.xz)|diff(\.gz|\.bz2|\.xz)|debian\.tar\.(gz|xz)|[a-z]+\.tar\.(gz|bz2|xz)|tar|tgz|tar\.gz|cnf)$
# 下载重试
DlMaxRetries: 5
解释,文件匹配规则:
1)主要作用是:
- 控制哪些文件需要被缓存
- 区分易变文件和永久文件的缓存策略
- 确保重要的包文件和元数据能被正确缓存
- 优化存储空间的使用
2)目的:
- 提高缓存效率
- 节省存储空间
- 确保关键文件被正确缓存
- 避免缓存不必要的文件
VfilePattern (Volatile file pattern): 用于匹配易变的文件模式
- .deb - Debian 软件包文件
- .tar\.gz|\.tgz - 压缩的归档文件
- .dsc - Debian 源码包描述文件
- .udeb - 微型 Debian 包(主要用于安装器)
- .diff\.gz - 补丁文件
- Release - 仓库发布信息
- Packages - 包含软件包列表
- Sources - 源代码包信息
- Release\.gpg - 数字签名文件
- InRelease - 内联签名的发布文件
- Commands.* - 命令相关文件
- .cnf - 配置文件
- Translation-.* - 翻译文件
- Components - 仓库组件信息
- by-hash - 基于哈希的文件访问
PfilePattern (Permanent file pattern): 用于匹配需要永久缓存的文件模式
- .deb - Debian 包
- .dsc - 源码包描述
- .tar(.gz|.bz2|.xz) - 各种压缩格式的 tar 文件
- .diff(.gz|.bz2|.xz) - 各种压缩格式的差异文件
- debian.tar.(gz|xz) - Debian 专用压缩包
- [a-z]+.tar.(gz|bz2|xz) - 任何字母开头的压缩包
- tar|tgz|tar.gz - 各种 tar 格式
- cnf - 配置文件
3. 设置开机自启动,并启用服务
sudo systemctl enable apt-cacher-ng
sudo systemctl start apt-cacher-ng
二、 ub2 和 ub3上使用代理
1. 编辑配置文件
sudo vi /etc/apt/apt.conf.d/01proxy
Acquire::http::Proxy "http://ub1:3142";
2. 仓库配置文件:/etc/apt/sources.list.d/ubuntu.sources
Types: deb deb-src
URIs: http://archive.ubuntu.com/ubuntu
Suites: jammy jammy-updates jammy-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
- 定义软件包的下载来源
- 确保下载软件通过 GPG 签名
- 允许系统获取更新和安全补丁
3. 测试配置
sudo apt update
三、如果 ub1 有 ufw 防火墙
sudo ufw allow from 《你的局域网段, 例:192.168.6.0/24 》 to any port 3142
允许来自 192.168.0.0/24 网段的客户端(图中的 ub2 和 ub3)访问 3142 端口
四、WEB 管理界面
选中这三项, 点 "Start Mirroring"
总结:
软件的配置很简单。最大益处是省掉重复的下载时间,网络流量的节省,只安装有签名的软件。
在一台 24 小时运行的主机上安装, 写个脚本可以软件部署在执行脚本的主机上。
另,如果有安装 tailscale, 会有路由问题要解决。 配置 tailscale 的 ACL, 见我以前文章有粘贴。
不记得有没有改过这个文件:3. /etc/apt/sources.list.d/tailscale.list
deb [signed-by=/usr/share/keyrings/tailscale-archive-keyring.gpg] https://pkgs.tailscale.com/stable/ubuntu noble main
Tailscale 的官方软件仓库,用于 tailscale 软件升级
附件1:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Home Network Diagram</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/10.6.1/mermaid.min.js"></script>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
margin: 0;
background-color: #f5f5f5;
}
.container {
background-color: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
</style>
</head>
<body>
<div class="container">
<div class="mermaid">
graph TD
I((Internet)) --- R[Router]
R --- UB1[ub1:Ubuntu<br>apt-cacher-ng<br>>server]
R --- UB2[ub2:Ubuntu]
R --- UB3[ub3:Ubuntu]
style I fill:#fff,stroke:#333,stroke-width:2px
style R fill:#f96,stroke:#333,stroke-width:2px
style UB1 fill:#9cf,stroke:#333,stroke-width:4px,width:150px,height:100px
style UB2 fill:#9cf,stroke:#333,stroke-width:4px,width:100px,height:100px
style UB3 fill:#9cf,stroke:#333,stroke-width:4px,width:100px,height:100px
</div>
</div>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
</body>
</html>