GitLab CI运行器与SSH ProxyJump



我在/etc/ssh/ssh_config文件中有以下设置:

Host serverA
User idA
Host serverB
User idB
ProxyJump serverA

我也复制了公钥,所以如果我在本地运行ssh serverB,我就可以正确地连接到serverB作为idBserverA

现在,这是我在/etc/gitlab-runner/config.toml中的运行器配置:

[[runners]] 
name = "ssh-runner-1"                                                                
url = "http://my-cicd-server"                                    
token = "xxxxxxxxxxxxxxxx"                                                 
executor = "ssh"                                                               
[runners.custom_build_dir]                                                     
[runners.cache]                                                                
[runners.cache.s3]                                                           
[runners.cache.gcs]                                                          
[runners.cache.azure]                                                        
[runners.ssh]                                                                  
user = "idB"                                                    
host = "serverB"                                                    
identity_file = "/home/gitlab-runner/.ssh/id_ed25519"

当我在这个运行器上运行CI/CD作业时,我得到一个« connection refused »错误:

ERROR: Preparation failed: ssh command Connect() error: ssh Dial() error: dial tcp xxx.xxx.xxx.xxx:22: connect: connection refused

我得出结论,没有应用ProxyJump配置,并且由于具有运行器的机器不能直接连接到serverB,因此我被拒绝访问。如何配置跑步者以应用代理跳转配置?

GitLab运行程序使用基于go的SSH客户端。它不尊重您的系统SSH配置,并且不具有与操作系统发行版或类似包中通常安装的标准ssh(通常是OpenSSH)包相同的可配置性。

Go客户端不支持ProxyJump配置。

您最好的选择可能是配置一个隧道连接,您的入口点不需要不支持的SSH配置选项。

本地端口转发

一种方法可能是打开本地端口转发隧道,然后在您的GitLab配置中指定主机为localhost,端口为转发端口。

例如:

  1. 打开隧道——本地端口2222通过ssh连接通过ServerA转发到ServerB的端口22
ssh -L 2222:ServerB:22 -N ServerA
  1. 配置运行器使用隧道:
...
[runners.ssh]                                                                  
host = "localhost"                                                    
port = 2222
...

使用这种方法,您可能必须在服务器上编写一些自动化程序,以便在隧道连接断开时恢复隧道连接。如何做到这一点取决于您的操作系统和首选服务管理器。或者使用autossh 之类的工具这就是ProxyJump配置的基本原理。

IP/端口转发系统

一个类似的方法是让跳转系统自动将连接转发到期望的目的地。这可能类似于软件防火墙规则(例如使用iptables路由规则)。这样转发是透明的。然后简单地告诉运行器以ServerA为目标,流量将透明地移动到ServerB。

这种方法更可靠,因为如果隧道掉落,您不需要做任何事情来保持隧道的存活。但是,配置要复杂得多,并且需要ServerB的静态IP。

例如,在ServerA上,假设ServerB的IP是10.10.10.10,可以使用以下iptables配置:

iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 10.10.10.10:22
iptables -t nat -A POSTROUTING -j MASQUERADE

参考。

GitLab运行器配置:

...
[runners.ssh]                                                                  
host = "ServerA"                                                    
port = 2222
...

最后,知道disable_strict_host_key_checking也是运行器的一个未记录的配置选项可能也很有用,如果您需要它的话。

相关内容

  • 没有找到相关文章

最新更新