Debian系统中使用apt-cacher-ng作为本地包缓存代理时,默认情况下客户端与缓存服务器之间的数据传输是明文HTTP协议,这意味着在局域网甚至跨网段环境中,软件包文件和元数据都可能被嗅探截获。要实现加密传输,核心方案是在apt-cacher-ng前端部署TLS/SSL加密层,配合客户端的HTTPS源配置和证书信任机制,让整个apt缓存链路走加密通道。下面我会从原理、配置、证书生成、客户端适配到安全加固,一步步把这套方案讲透。
一、为什么apt-cacher-ng需要加密传输
apt-cacher-ng本身是一个轻量级的代理缓存服务,它监听在3142端口(默认),以HTTP方式接收客户端的包请求,然后从上游镜像源下载并缓存,再返回给内网其他机器。这个过程中,传输的内容包括:.deb二进制包、Packages索引文件、Release签名文件等。虽然Release文件本身有GPG签名可以验证完整性,但包内容在传输过程中是裸奔的。如果你的网络环境中存在ARP欺骗、交换机镜像、或者不可信的中继节点,攻击者可以篡改缓存内容、注入恶意软件包,甚至通过流量分析推断你的系统架构和软件版本。所以,给apt-cacher-ng加上TLS加密不是锦上添花,而是生产环境的基本要求。
二、整体架构思路
实现加密传输有两种主流路径。第一种是在apt-cacher-ng前面挂一个反向代理(比如Nginx或Caddy),由反向代理终结TLS连接,然后以HTTP方式转发给后端的apt-cacher-ng。这种方式最灵活,证书管理集中在反向代理层,apt-cacher-ng本身不用动。第二种是直接让apt-cacher-ng监听HTTPS端口,但apt-cacher-ng原生不支持TLS,所以需要借助stunnel这类工具做TLS隧道封装。实际生产中,第一种方案更主流、更易维护,下面我以Nginx反向代理方案为主线来讲。
三、生成自签名CA证书和服务器证书
加密传输的前提是有可信的证书。在内网环境中,你可以用自签名CA来签发服务器证书,这样既不需要购买商业证书,又能保证加密强度。首先创建CA私钥和根证书:
openssl genrsa -out ca-key.pem 4096 openssl req -new -x509 -days 3650 -key ca-key.pem -out ca-cert.pem -subj "/CN=Debian Apt CA/O=Internal/C=CN"
然后生成apt-cacher-ng服务器的私钥和证书签名请求:
openssl genrsa -out server-key.pem 2048 openssl req -new -key server-key.pem -out server-csr.pem -subj "/CN=apt-cache.internal.lan"
用CA签发服务器证书,注意要加上Subject Alternative Name(SAN),否则客户端验证会报错:
openssl x509 -req -days 1825 -in server-csr.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile <(echo "subjectAltName=DNS:apt-cache.internal.lan,IP:192.168.1.100")
这里192.168.1.100替换成你apt-cacher-ng服务器的实际内网IP,DNS名称也要和客户端配置中使用的主机名一致。证书生成后,把ca-cert.pem分发到所有需要连接的客户端机器上。
四、配置Nginx反向代理终结TLS
在apt-cacher-ng所在的Debian服务器上安装Nginx:
apt install nginx -y
创建Nginx站点配置文件/etc/nginx/sites-available/apt-cache:
server {
listen 443 ssl http2;
server_name apt-cache.internal.lan;
ssl_certificate /etc/ssl/certs/server-cert.pem;
ssl_certificate_key /etc/ssl/private/server-key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5:!RC4;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:3142;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_connect_timeout 60s;
proxy_read_timeout 300s;
client_max_body_size 0;
}
}启用站点并测试配置:
ln -s /etc/nginx/sites-available/apt-cache /etc/nginx/sites-enabled/ nginx -t systemctl reload nginx
这一步完成后,Nginx在443端口接收HTTPS请求,解密后以HTTP转发给本地3142端口的apt-cacher-ng。apt-cacher-ng本身完全感知不到TLS的存在,它只看到普通的HTTP代理请求。
五、客户端配置HTTPS源
客户端机器需要做两件事:一是把CA证书放到系统信任目录,二是把apt源指向HTTPS地址。首先在客户端上复制ca-cert.pem:
scp ca-cert.pem user@client:/tmp/ sudo cp /tmp/ca-cert.pem /usr/local/share/ca-certificates/apt-cache-ca.crt sudo update-ca-certificates
然后修改apt源配置,创建或编辑/etc/apt/sources.list.d/apt-cache.list:
deb https://apt-cache.internal.lan:443/debian bookworm main contrib non-free deb https://apt-cache.internal.lan:443/debian bookworm-updates main contrib non-free deb https://apt-cache.internal.lan:443/debian-security bookworm-security main contrib non-free
注意协议从http改成了https,端口从默认的3142改成了443。如果你的apt-cacher-ng配置了多个上游镜像源,客户端只需要指向这一个缓存地址即可,缓存会自动处理上游请求。测试一下:
apt update
如果看到正常的包索引下载信息,说明HTTPS通道已经通了。如果报证书错误,检查SAN是否正确、CA证书是否被update-ca-certificates正确导入。
六、apt-cacher-ng自身的安全加固
加密传输只是第一步,apt-cacher-ng本身也需要安全配置。编辑/etc/apt-cacher-ng/acng.conf,重点关注以下几项:
第一,限制访问来源。设置只允许内网网段访问:
# 只允许192.168.1.0/24网段访问 Remap-debrep: file:deb_mirror*.gz /debian ; file:backends_debian # Debian Archives Remap-uburep: file:ubuntu_mirrors /ubuntu ; file:backends_ubuntu # Ubuntu Archives # 关键:绑定监听地址 BindAddress: 127.0.0.1
把BindAddress设为127.0.0.1,这样apt-cacher-ng只监听本地回环地址,外部请求全部由Nginx代理接收,减少攻击面。第二,设置访问密码(如果需要):
PasswdPattern: ^/.* PasswdFile: /etc/apt-cacher-ng/htpasswd
用htpasswd工具生成密码文件。第三,限制缓存大小和过期策略,防止磁盘被撑满:
MaxDiskCache: 50G CleanInterval: 60
七、使用stunnel方案的替代做法
如果你不想引入Nginx,可以用stunnel在apt-cacher-ng前面做TLS封装。安装stunnel:
apt install stunnel4 -y
配置文件/etc/stunnel/apt-cache.conf:
[apt-cache] accept = 443 connect = 127.0.0.1:3142 cert = /etc/ssl/certs/server-cert.pem key = /etc/ssl/private/server-key.pem CAfile = /etc/ssl/certs/ca-cert.pem verify = 0
这种方式更轻量,但功能不如Nginx灵活,比如不支持HTTP/2、不方便做日志和访问控制。生产环境我更推荐Nginx方案。
八、证书轮换和长期维护
自签名证书不是一劳永逸的。建议设置证书到期提醒,每1-2年轮换一次。轮换时重新生成CA和服务器证书,重新分发ca-cert.pem到所有客户端并执行update-ca-certificates。如果客户端数量很多,可以写一个Ansible脚本批量推送:
- name: Deploy apt-cache CA certificate
copy:
src: ca-cert.pem
dest: /usr/local/share/ca-certificates/apt-cache-ca.crt
owner: root
group: root
mode: '0644'
notify: update ca certificates
- name: Update CA certificates
command: update-ca-certificates另外,apt-cacher-ng的日志文件/var/log/apt-cacher-ng/apt-cacher.log要定期检查,关注异常的大文件下载请求和频繁的404错误,这可能是配置错误或者有人在探测缓存内容。
九、常见问题排查
实际部署中最常遇到的问题有三个。一是客户端报"Certificate verification failed",通常是SAN不匹配或者CA没装对,用openssl s_client -connect apt-cache.internal.lan:443 -CAfile ca-cert.pem可以手动验证证书链。二是apt update报"Hash Sum mismatch",这不是加密问题,而是缓存文件损坏,清除对应包的缓存重试即可。三是大文件下载超时,需要调大Nginx的proxy_read_timeout和client_max_body_size,.deb包可能几百MB,默认超时不够用。
十、总结
Debian环境下给apt-cacher-ng加上加密传输,本质上就是"Nginx反向代理终结TLS + 自签名CA信任链 + 客户端HTTPS源配置"这三板斧。这套方案不依赖任何第三方商业组件,纯开源工具链就能实现,安全性和可控性都很高。对于有多台Debian服务器的内网环境,这是包管理基础设施安全的必要一环,建议作为标准部署流程固化下来。
