下载端、使用端,以及镜像的三种形态
一句话总结
隔离网络的基础设施工作,总是分成两台计算机。能连上互联网的下载端,把所需内容按准确版本收集起来,附上清单和签名;没有互联网的使用端,则把它们搭建成内部镜像,并让所有工具都信任这个镜像和内部证书。本课程的每个模块,都会针对一个生态系统把这个框架重复一遍。
为什么需要它
在隔离网络的服务器上,pip install、npm ci、mvn package、go build、docker pull、dnf install 都以同样的方式失败——连不上外部仓库。可是解决办法因工具而异。Python 用 PEP 503 索引,npm 用 registry API,Maven 用仓库目录布局,Go 用模块代理协议,容器用 OCI 分发规范,dnf 则读取 repodata。如果按生态系统分别去记,就没有尽头,但框架只有一个:从哪里获取什么、用什么打包、如何指向、让什么被信任。
工作原理
下载端与使用端。 下载端必须了解目标服务器的条件(操作系统、Python、JDK、CPU)再去下载。在笔记本上为笔记本下载的文件,到了服务器上就不对。使用端负责验证介质、搭建镜像,并通过一行配置让各工具都指向该镜像。两者之间只有文件包、哈希清单和签名。如果是网络隔离的环境,中间还会夹着资料传输流程(经批准的介质或传输系统、导入评审),往返一次通常以天计。所以,制作一个一次就完整的包的能力,就是隔离网络实务能力。
镜像的三种形态。
프록시 캐시 위(인터넷 저장소)를 당겨 남긴다. 연결된 동안 채우고, 끊으면 채운 것만 내준다
verdaccio 의 uplink, Nexus 의 proxy 저장소, 레지스트리의 pull-through cache
원본 저장소 우리가 올린 것만 있다. 반입물을 올려 두거나 사내 산출물을 둔다
Nexus 의 hosted 저장소, 파일을 늘어놓은 정적 웹 서버
스냅숏 동기화 특정 시점의 저장소를 통째로 복제한다. 목록이 아니라 "그날의 전체" 를 들고 들어간다
배포판 저장소 복제, skopeo sync 같은 이미지 동기화
该代码块中的韩文注释依次说明:代理缓存是拉取上游(互联网仓库)并留存副本,联网期间持续填充,断开后只提供已填充的内容;原始仓库里只有我们自己上传的内容,用来存放导入物或内部产出物;快照同步是把某一时间点的仓库整体复制,带入的不是一份清单,而是“那一天的全部”。
Nexus 文档把仓库分为缓存远程内容的 proxy、作为原件的 hosted,以及把多个仓库合并到一个地址的 group。无论现场设备是什么,都是这三种的组合。不过,Nexus 3 的官方要求规格是主机内存 8GB、默认堆 2703MB,放不进本课程的实验 Pod(2Gi)。所以实验用原理相同的轻量工具(http.server、verdaccio、静态文件服务器、Distribution registry)来做,并在阅读中与 Nexus 菜单对应起来。
信任的两层。 搭建镜像之后,要让人们信任两件事。第一,这台服务器是不是那个镜像——TLS 证书,也就是把私有 CA 放进各个工具的信任库。第二,这个文件是不是原来的那个文件——哈希和签名。pip 的哈希检查模式、npm 锁文件的 integrity、go.sum、Maven 的 .sha1、rpm 的 GPG 签名、镜像的摘要,都属于第二层。信任其中一层,并不意味着可以关掉另一层。
名称和时间也是基础设施。 内部镜像要用名称(例如 pypi.airgap.internal)来访问,才能与证书的 SAN 匹配,服务器更换时也不用修改配置。这需要有解析该名称的内部 DNS。另外,TLS 会把证书的有效期与当前时间比较,所以时钟不准的服务器,会把完好的证书判为“尚未生效”或“已过期”而拒绝。连不上互联网时间服务器的隔离网络,需要内部时间服务器。
在现场相遇的样子
隔离网络导入事故,大多属于三种情况之一。依赖不全,要再次出去取;下载端与使用端条件不同,对不上;镜像搭好了,却因为有一个工具不信任证书,就把验证关掉了。前两种,只要“按目标的条件,下载工具解析出的结果”就能避免;最后一种,只要掌握各工具的信任库对照表就能避免。本课程的实验设计成让你针对每个生态系统亲身经历一次这三种情况。实验 Pod 本来就是连不上外部的房间(只有 DNS),正好适合隔离网络一侧的练习;只有下载端所需的实验才开放互联网,而隔离网络一侧的确认,则由评分器在封闭外部的状态下进行。
下一个模块要做什么
从 pip 开始。在下载端以 wheel 形式下载包括依赖在内的全部内容,并用哈希固定,在使用端搭建 PEP 503 索引,并用 pip.conf 指向它。接着依次进行 npm、Go、私有 CA、Maven、RHEL 系列、容器镜像注册表、内部 DNS 与时间服务器,并在最后一个模块中,一次性完成从申请单到签名验证的整个导入流程。
参考文档:Nexus Repository Types、Nexus Formats、Nexus System Requirements、RFC 9525