惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cisco Talos Blog
Cisco Talos Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Martin Fowler
Martin Fowler
Recent Announcements
Recent Announcements
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
博客园 - 聂微东
N
Netflix TechBlog - Medium
B
Blog RSS Feed
T
Tailwind CSS Blog
宝玉的分享
宝玉的分享
有赞技术团队
有赞技术团队
S
SegmentFault 最新的问题
The Register - Security
The Register - Security
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 司徒正美
J
Java Code Geeks
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
Engineering at Meta
Engineering at Meta
T
The Blog of Author Tim Ferriss
C
CXSECURITY Database RSS Feed - CXSecurity.com
AWS News Blog
AWS News Blog
The Hacker News
The Hacker News
Scott Helme
Scott Helme
MongoDB | Blog
MongoDB | Blog
C
CERT Recently Published Vulnerability Notes
L
Lohrmann on Cybersecurity
C
Cybersecurity and Infrastructure Security Agency CISA
P
Proofpoint News Feed
T
The Exploit Database - CXSecurity.com
S
Securelist
MyScale Blog
MyScale Blog
A
Arctic Wolf
V2EX - 技术
V2EX - 技术
The GitHub Blog
The GitHub Blog
Simon Willison's Weblog
Simon Willison's Weblog
H
Hacker News: Front Page
D
DataBreaches.Net
S
Secure Thoughts
腾讯CDC
TaoSecurity Blog
TaoSecurity Blog
Project Zero
Project Zero
H
Help Net Security
P
Privacy International News Feed
Cloudbric
Cloudbric
博客园_首页
Latest news
Latest news
小众软件
小众软件

陈少文的网站

巨变与机遇的未来十年 Kubernetes 平台管理软件压力测试方案 使用镜像部署 Hexo 静态页面 终于等到你 - GitHub 镜像仓库服务(ghcr.io) 一起来学 Go --(6)Interface 一起来学 Go --(5)Goroutine 和 Channel 什么是函数式编程 如何在 Kubernetes 集群集成 Kata 柯里化与偏函数 使用 PyGithub 自动创建 Label 软件产品是团队能力的输出 Helm 2 、Helm 3 比较 IoT 变现 Kubernetes 中的 DNS 服务 国内的 Helm 镜像源 Harbor 使用自签证书支持 Https 访问 DevOps 工具链之 Prow 如何使用 kfctl 安装 Kubeflow VS Code 无法下载 Go 插件的工具包 工程师更应具有服务精神 你不知道的 Docker 使用技巧 使用 Docker 运行 Tensorflow 论中国 什么是左移 如何清空 Git 仓库全部历史记录 一禅小和尚 有风吹过厨房 时间的玫瑰 如何在 CentOS 安装 GPU 驱动 开发 Tips(19) 使用 Velero 备份 Kubernetes 集群 Kubernetes Cheat Sheet 开发 Tips(18) 如何构建一个 Java 工程 开发 Tips(17) KubeSpray 安装 Kubernetes 报错 ip in ansible_all_ipv4_addresses 基于 Kubernetes 和 Jenkins 搭建自动化测试系统 在 Kubernetes 上动态创建 Jenkins Slave 使用 Jenkins 进行服务拨测 开发 Tips(16) Kubernetes 签发 Ingress 证书及日常故障运维 Kubernetes 中 Deployment 的基本操作 Kubernetes 中的证书 如何使用 KubeBuilder 开发一个 Operator Kubernetes 1.6.0 安装问题汇总 镜像管理工具 -- Harbor 开发 Tips(15) Docker 如何拉取镜像 开发 Tips(14) 使用 Helm 安装 harbor 开发 Tips(13) 使用 S2I 构建云原生应用 在 Kubernetes 中使用 emptyDir、hostPath、localVolume 开发 Tips(12) 开发 Tips(11) 代码质量分析工具 SonarQube 使用 Kubeadm 安装 Kubernetes 集群 一起来学 Go --(4)常用函数 Kubernetes 中的 Ceph Kubernetes 之 Volumes Kubernetes 之 Labels、Selectors 开发 Tips(10) 开源正在重构商业模式 Kubernetes 之网络 Kubernetes 之 API 使用 Helm 和 Operator 快速部署 Prometheus Kubernetes 复杂有状态应用管理框架 -- Operator Kubernetes 的包管理器 -- Helm 一起来学 Go --(3)Go Modules 如何一步一步地优化博客方案 kubectl 实用指南 Kubernetes 中的基本概念 搭建远程 Kubernetes 开发环境 大公司和小公司的 ToB 思路 开发 Tips(9) Go 入门指南 一起来学 Go --(2)数据与逻辑结构 如何预防 Web 富文本中的 XSS 攻击 django-xss-cleaner 云工作时代 一起来学 Go --(1)背景与特点 SaaS 开发团队的不同阶段 你不知道的 Git 使用技巧 输出既服务 微服务设计 继续奔跑 开发 Tips(8) 从账户安全到二次验证 Django 性能之数据库查询优化 Django 性能之分库分表 敏捷开发之研发流程 打造一致性的团队 开发 Tips(7) Pytest 进阶学习之 Mock PaaS 部署之 buildpack Go 开发配置 领域输出才是 PaaS 的核心竞争力 Pytest 入门学习 开发 Tips(6) 如何使用 Jenkins、Docker、GitLab 搭建 Django 自动化部署流程
如何劫持 docker.io 的镜像流量到私有仓库
微信公众号 · 2022-07-18 · via 陈少文的网站

Please enable Javascript to view the contents

1. 自签 *.docker.io 域名证书

1.1 创建 CA 证书

  • 生成 CA 证书私钥
1
openssl genrsa -out ca.key 4096
  • 生成 CA 证书
1
2
3
4
openssl req -x509 -new -nodes -sha512 -days 3650 \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=chenshaowen.com" \
    -key ca.key \
    -out ca.crt

1.2 创建 *.docker.io 域名证书

  • 生成私钥
1
openssl genrsa -out docker.io.key 4096
  • 生成证书签名请求 CSR
1
2
3
4
openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=*.docker.io" \
    -key docker.io.key \
    -out docker.io.csr
  • 生成 x509 v3 扩展
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=docker.io
DNS.2=*.docker.io
EOF
  • 生成 *.docker.io 域名证书
1
2
3
4
5
openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in docker.io.csr \
    -out docker.io.crt

1.3 查看生成的全部文件

1
2
3
ls

ca.crt         ca.key         ca.srl         docker.io.cert docker.io.crt  docker.io.csr  docker.io.key  v3.ext

2. 部署 Registry 并配置 HTTPS 证书

2.1 部署 Nginx 代理转发 HTTPS 流量

这里配置一个 Nginx 卸载 HTTPS 证书,用于转发 *.docker.io 域名的请求到 Registry。

参考:https://github.com/shaowenchen/docker-compose/tree/main/nginx

需要使用到上面生成的证书文件: docker.io.crtdocker.io.key

2.2 部署 Docker.io 的代理 Registry

  • 创建一个 mirror 目录
1
2
mkdir mirror
cd mirror
  • 编辑配置文件
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3
proxy:
  remoteurl: https://registry-1.docker.io
  • 在 5000 端口启动
1
2
3
4
docker run -d -p 5000:5000 --restart=always --name mirror \
             -v `pwd`/config.yml:/etc/docker/registry/config.yml \
             -v `pwd`/data:/var/lib/registry \
             registry:2

2.3 部署私有仓库的 Registry

  • 创建一个 harbor-mirror 目录
1
2
mkdir harbor-mirror
cd harbor-mirror
  • 编辑配置文件
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3
proxy:
  remoteurl: https://private.chenshaowen.com
  username: [username]
  password: [password]

这里的 [username][password] 需要替换为私有仓库的凭证。

  • 在 5002 端口启动
1
2
3
4
docker run -d -p 5002:5000 --restart=always --name harbor-mirror \
             -v `pwd`/config.yml:/etc/docker/registry/config.yml \
             -v `pwd`/data:/var/lib/registry \
             registry:2

3. 给访问镜像仓库的主机添加证书

这里直接将 ca.crt 添加到受到信任证书链,以此 CA 证书签发的域名证书都将被信任。当然,你也可以一个一个地将自签发的证书添加到信任列表。这里将 ca.crt 重命名,以方便识别和区分:

1
cp ca.crt chenshaowen.com.ca.crt

3.1 Ubuntu 系统

  • 添加
1
2
cp chenshaowen.com.ca.crt /usr/local/share/ca-certificates
update-ca-certificates
  • 删除
1
2
rm -f /usr/local/share/ca-certificates/chenshaowen.com.ca.crt
update-ca-certificates

3.2 CentOS 系统

  • 添加
1
cp chenshaowen.com.ca.crt /etc/pki/ca-trust/source/anchors/
1
update-ca-trust extract
  • 删除
1
2
3
rm /etc/pki/ca-trust/source/anchors/chenshaowen.com.ca.crt

update-ca-trust extract

3.3 需要重启 Docker,才会重新加载根证书

1
systemctl restart docker

4. 测试验证

这里将设 Nginx 代理的主机 IP 为 1.1.1.1,那么在访问镜像的主机上都需要加上解析或者配置 /etc/hosts:

1
2
1.1.1.1 docker.io
1.1.1.1 registry-1.docker.io

并且测试主机应该信任 ca.crt 或者 docker.io.crt 证书。

4.1 代理 docker.io 流量

此时,将 Nginx 的流量代理到 5000 端口,也就是直接访问 dockerhub 上的镜像。

  • 拉取公开镜像
1
docker pull jenkins/jenkins

能够拉取成功

  • 查看本地缓存文件
1
2
3
du -sh  data/

169M	data/

4.2 代理私有镜像仓库流量

修改 Nginx 配置,将后端流量切换到私有镜像仓库的 5002 端口,此时后端对接的是私有 Harbor 镜像仓库。

  • 拉取私有镜像测试

如果直接访问私有镜像仓库,那么地址应该是 private.chenshaowen.com/okscloud/test:develop ,但是这里我们可以直接去掉域名前缀拉取镜像:

1
docker pull okscloud/test:develop

可以拉取成功,此时的 docker.io 指向的是 Registry ,最终被代理到 private.chenshaowen.com

  • 查看镜像缓存
1
2
3
du -sh /diskb/harbor-mirror

676M	/diskb/harbor-mirror

5. 总结

本文主要是验证了一个想法,在内网通过修改 docker.io 的解析指向 Registry 代理,劫持 dockerhub 的镜像流量。这种劫持的意义在于:

  • 审计内网对 dockerhub 的镜像依赖
  • 更好的镜像加速,利用 Dragonfly 等
  • 摆脱国内 docker.io 访问限速、不稳定的困扰

微信公众号