使用 Docker 部署 Squid 为 Kubernetes 中的 Nexus3 提供公网代理访问
#作者:闫乾苓
文章目录
- 背景
- 网络架构
- 部署 Squid(Docker 方式)
- 1. 准备 Squid 配置文件
- 2. 启动 Squid 容器
- 3. 验证 Squid 出网功能
- 总结
背景
在企业内部网络环境中,生产环境通常无法直接访问公网。
在 Kubernetes(K8s)中部署的 Nexus3 仓库,若需要从公网同步 Maven、npm 等依赖,就必须通过一个受控的出网代理。
本文介绍一种常见的解决方案:
- 在 DMZ 区部署 Squid 作为 HTTP/HTTPS 代理
- Squid 节点可直接访问公网
- Nexus3 与 Squid 之间网络可通
- Nexus3 配置全局 HTTP Proxy 指向 Squid,实现从公网下载构件并缓存到 Nexus3
网络架构
- Squid:位于 DMZ,可访问公网
- Nexus3:K8s 内部部署,无法直连公网,但能访问 Squid
- 客户端:访问 Nexus3 的 Proxy 仓库,由 Nexus3 再通过 Squid 取数据
部署 Squid(Docker 方式)
1. 准备 Squid 配置文件
在 DMZ 节点创建目录 /opt/squid/conf 并创建配置文件 squid.conf:
# 监听端口
http_port 3128# 定义允许访问的客户端(Nexus3 IP)
acl nexus3_server src 192.168.61.21/32
# 如果你在 192.168.61.22 测试,也加上它
acl test_client src 192.168.61.22/32# 定义安全端口
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl Safe_ports port 1025-65535# 定义 CONNECT 方法
acl CONNECT method CONNECT# 先放行 Nexus3 和测试机的 CONNECT 请求到安全端口
http_access allow nexus3_server CONNECT SSL_ports
http_access allow test_client CONNECT SSL_ports# 放行 Nexus3 和测试机的普通 HTTP 请求
http_access allow nexus3_server
http_access allow test_client# 最后拒绝所有其他访问
http_access deny all# 日志位置
access_log stdio:/var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log none# 禁用缓存
cache deny all
2. 启动 Squid 容器
docker run -d \--name squid \--restart unless-stopped \-p 3128:3128 \-v /opt/squid/conf/squid.conf:/etc/squid/squid.conf \ubuntu/squid:5.2-22.04_beta
这里没有挂载 /var/log/squid 和 /var/spool/squid,表示不做日志/缓存持久化,适合仅做转发的场景。
3. 验证 Squid 出网功能
在 允许的客户端 IP 上执行:
curl -x http://node2:3128 -I https://repo1.maven.org/maven2/
正常返回 HTTP/1.1 200 Connection established + 目标站响应,则说明 Squid 工作正常。
配置 Nexus3 全局代理
- 登录 Nexus3 Web 管理界面
- Administration → System → HTTP
- 填写:
- HTTP Proxy Host: node2(或 Squid 节点的 IP)
- Port: 3128
- 保存
配置完成后,Nexus3 的所有 Proxy 仓库(Maven Central、npmjs 等)都会通过 Squid 出网。
Nexus3 创建 Proxy 仓库
- Repositories → Create repository → maven2 (proxy)
- 填写:
- Name: maven-central-proxy
- Remote Storage: https://repo.maven.apache.org/maven2/
- 保存
客户端访问 maven-central-proxy 时,如果依赖不在 Nexus3 中,Nexus3 会:
- 通过 Squid 请求公网
- 下载依赖并存储到本地
- 将结果返回给客户端
手动测试 Squid 下载文件
即使不经过 Nexus3,也可用 curl / wget 直接通过 Squid 下载公网文件。
curl 方式:
curl -x http://node2:3128 \-o HTTPClient-0.3-3.jar \https://repo.maven.apache.org/maven2/HTTPClient/HTTPClient/0.3-3/HTTPClient-0.3-3.jar
wget 方式:
wget -e use_proxy=yes \-e http_proxy=http://node2:3128 \-e https_proxy=http://node2:3128 \https://repo.maven.apache.org/maven2/HTTPClient/HTTPClient/0.3-3/HTTPClient-0.3-3.jar
下载完成后可验证文件完整性:
sha256sum HTTPClient-0.3-3.jar
注意事项
- 安全控制:务必限制 Squid 只接受 Nexus3 节点的请求,避免成为开放代理
- 缓存策略:本方案禁用 Squid 磁盘缓存,让 Nexus3 管理构件缓存
- 日志审计:若需审计出网记录,可开启 /var/log/squid/access.log 持久化
- 高可用:可在 DMZ 部署多个 Squid 节点,结合 K8s Service 或负载均衡
总结
通过在 DMZ 部署 Squid 代理,可以在不直接暴露 Kubernetes 内部服务到公网的情况下,让 Nexus3 安全地访问 Maven Central、npmjs 等外部仓库。
这种方案结构清晰、安全可控,适合大多数内网隔离环境下的制品仓库出网需求。