GitLab CI 运行器与 SSHProxyJump
GitLab CI runner with SSH ProxyJump
我的 /etc/ssh/ssh_config
文件中有以下设置:
Host serverA
User idA
Host serverB
User idB
ProxyJump serverA
我还复制了 public 密钥,所以如果我在本地 运行 ssh serverB
我正确连接到 serverB
作为 idB
通过serverA
.
现在,这是我在 /etc/gitlab-runner/config.toml
中的 运行ner 配置:
[[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 作业时,我收到“连接被拒绝”错误:
ERROR: Preparation failed: ssh command Connect() error: ssh Dial() error: dial tcp xxx.xxx.xxx.xxx:22: connect: connection refused
我断定 ProxyJump
配置没有应用,并且由于带有 运行ner 的机器不能直接连接到 serverB
,我被拒绝访问。
如何配置运行ner应用代理跳转配置?
GitLab 亚军uses a Go-based SSH client。它不考虑您的系统 SSH 配置,并且不具有与标准 ssh
(通常是 OpenSSH)包相同的可配置性,您通常会发现安装在操作系统发行版或类似包中。
Go 客户端不支持 ProxyJump
配置。
您最好的选择可能是配置隧道连接,您的入口点不需要不受支持的 SSH 配置选项。
本地端口转发
一种方法可能是打开本地端口转发隧道,然后在您的 GitLab 配置中,将主机指定为 localhost
,将端口指定为转发端口。
例如:
- 打开隧道--本地2222端口通过ServerA通过ssh连接转发到ServerB的22端口
ssh -L 2222:ServerB:22 -N ServerA
- 配置运行器以使用隧道:
...
[runners.ssh]
host = "localhost"
port = 2222
...
使用这种方法,您可能必须在服务器上编写一些自动化程序,以在隧道连接断开时恢复它。如何执行此操作取决于您的操作系统和首选服务管理器。或者使用像 autossh
这样的工具
这基本上就是 ProxyJump 配置在后台的工作方式。
IP/Port转发系统
一种类似的方法是让您的跳转系统自动将连接转发到所需的目的地。这可能类似于软件防火墙规则(例如使用 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 runner配置:
...
[runners.ssh]
host = "ServerA"
port = 2222
...
最后,了解 disable_strict_host_key_checking
对于跑步者来说也是一个 undocumented configuration option 可能也很有用,以备不时之需。
我的 /etc/ssh/ssh_config
文件中有以下设置:
Host serverA
User idA
Host serverB
User idB
ProxyJump serverA
我还复制了 public 密钥,所以如果我在本地 运行 ssh serverB
我正确连接到 serverB
作为 idB
通过serverA
.
现在,这是我在 /etc/gitlab-runner/config.toml
中的 运行ner 配置:
[[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 作业时,我收到“连接被拒绝”错误:
ERROR: Preparation failed: ssh command Connect() error: ssh Dial() error: dial tcp xxx.xxx.xxx.xxx:22: connect: connection refused
我断定 ProxyJump
配置没有应用,并且由于带有 运行ner 的机器不能直接连接到 serverB
,我被拒绝访问。
如何配置运行ner应用代理跳转配置?
GitLab 亚军uses a Go-based SSH client。它不考虑您的系统 SSH 配置,并且不具有与标准 ssh
(通常是 OpenSSH)包相同的可配置性,您通常会发现安装在操作系统发行版或类似包中。
Go 客户端不支持 ProxyJump
配置。
您最好的选择可能是配置隧道连接,您的入口点不需要不受支持的 SSH 配置选项。
本地端口转发
一种方法可能是打开本地端口转发隧道,然后在您的 GitLab 配置中,将主机指定为 localhost
,将端口指定为转发端口。
例如:
- 打开隧道--本地2222端口通过ServerA通过ssh连接转发到ServerB的22端口
ssh -L 2222:ServerB:22 -N ServerA
- 配置运行器以使用隧道:
...
[runners.ssh]
host = "localhost"
port = 2222
...
使用这种方法,您可能必须在服务器上编写一些自动化程序,以在隧道连接断开时恢复它。如何执行此操作取决于您的操作系统和首选服务管理器。或者使用像 autossh
这样的工具这基本上就是 ProxyJump 配置在后台的工作方式。
IP/Port转发系统
一种类似的方法是让您的跳转系统自动将连接转发到所需的目的地。这可能类似于软件防火墙规则(例如使用 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 runner配置:
...
[runners.ssh]
host = "ServerA"
port = 2222
...
最后,了解 disable_strict_host_key_checking
对于跑步者来说也是一个 undocumented configuration option 可能也很有用,以备不时之需。