背景介绍
镜像仓库Harbor
Harbor 是一个开源的镜像仓库软件,通过策略和基于角色的访问控制来保护制品,确保镜像经过扫描并免受漏洞影响,并将镜像标记为可信。作为 CNCF 毕业项目,Harbor 可以帮助用户在诸如 Kubernetes 和 Docker 之类的云原生计算平台上持续且安全地管理制品。
iptables
iptables 是一个在 Linux 系统中用于配置和管理网络防火墙规则的命令行工具。它是 netfilter 项目的一部分,netfilter 是Linux内核中实现网络包过滤、网络地址转换(NAT)和包处理功能的框架。iptables 允许用户通过设置规则来定义数据包(如网络请求)应该如何被内核处理,比如允许、拒绝或修改数据包。
主要功能:
- 数据包过滤:根据源IP、目的IP、端口号、协议类型等条件对进出系统的数据包进行过滤。
- **网络地址转换(NAT)**:可以用来做源NAT(SNAT)或目标NAT(DNAT),用于隐藏内部网络结构或者使多个设备共享一个公网IP地址。
- 端口转发:通过DNAT功能,可以将外部对某一公共IP和端口的访问转发到内网中的某台主机上。
- 状态检查:iptables支持状态检测技术,能够跟踪连接的状态,以便对属于已建立连接的数据包给予放行,提高效率和安全性。
规则结构:
iptables 的规则由几部分组成:链(chains)、表(tables)、规则(rules)和目标(targets)。
- 链(chains)是预定义的处理数据包的点,如INPUT(处理进入系统的数据包)、OUTPUT(处理本地生成要输出的数据包)和FORWARD(处理转发的数据包)等。
- 表(tables)包含规则集合,主要的表有filter(用于过滤)、nat(用于网络地址转换)和mangle(用于修改数据包)等。
- 规则(rules)定义了对匹配特定条件的数据包执行的操作,比如允许或拒绝。
- 目标(targets)是规则指定的动作,如ACCEPT(允许数据包通过)、DROP(丢弃数据包)或REDIRECT(重定向数据包)等。
问题
当部署Harbor时,在配置文件中会配置Harbor的真实地址,这里称为A地址,同时这个地址通常也是push镜像时的地址,有时需要通过公网访问Harbor或者通过Nginx转发后访问Harbor,那么这个地址才是真正在客户端推送镜像的地址,这里称为B地址。如果在客户端配置B地址,执行docker login命令时,会报如下错误:
Error response from daemon: Get 地址A/v2/: Get 地址B/service/token?account=harbor_admin&client_id=docker&offline_token=true&service=harbor-registry: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) (Client.Timeout exceeded while awaiting headers)
那么如何解决该问题呢?
解决办法
通过配置iptables的nat表,可以实现推送habror镜像的目标。
执行如下命令:
//配置iptables规则
sudo iptables -t nat -A OUTPUT -d 地址A的ip -p tcp --dport 地址A的端口 -j DNAT --to-destination 地址B的ip和端口
//查看nat规则是否配置成功
sudo iptables -t nat -L -n --line-numbers
配置好iptables后,再次执行docker login命令时,便直接显示登录成功了,随后就可以docker push镜像了。