如何设置 ssh 隧道到运行 Jenkins 的命名虚拟主机

如何设置 ssh 隧道到运行 Jenkins 的命名虚拟主机

我目前正在大学实验室内设置服务器,该服务器将用于多种用途,包括书目数据库和 CI 服务器 (Jenkins)。为了保持关注点的清晰分离,我为每个功能设置了一个虚拟主机 (VH),并分配了一个内部域名。在实验室内,这种安排运行良好。我在服务器上安装了 BIND9,因此它能够解析域名。

但是,为了从家里连接到我们的实验室,我们需要先通过 VPN 连接到大学,然后通过 SSH 连接到我们实验室的网关机器。从网关我们可以访问我们需要访问的任何内部机器。登录网关后,我们会根据需要使用 SSH 隧道。根据大学的政策,如果不登录网关,就不能直接从 VPN 访问我们实验室内的机器。

我想知道是否可以通过单个 SSH 隧道访问虚拟主机?比如服务器名称指示 (SNI)?或者我需要设置像 Squid 这样的代理服务器吗?我认为 DNS 和 HTTP 流量都需要正确路由。可以仅使用hosts文件设置来完成此操作吗?

任何建议都将不胜感激。谢谢!

更新
我一直在研究这个问题,并找到了一个似乎可行的解决方案,但仍然存在一个缺陷;JenkinsManage在使用 VPN/SSH 时在页面上抱怨It appears that your reverse proxy set up is broken。因此,虽然我的请求是正确的,但我的一些响应却不正确,我想修复这个问题。

简而言之,使用位于远程计算机上的反向代理服务器,将请求转发到正在进行隧道传输的本地主机端口。解决方案包括以下内容:
1) 由于 SNI 不可用,因此在这种情况下可以为每个虚拟主机分配一个额外的唯一端口来监听。我选择使用 808x 以上范围。2
) 我更新了用于连接网关计算机的本地计算机上 SSH 配置文件中的节,以包括所有这些端口的转发。3
) 我已经在本地计算机上配置了本地反向代理(在我的情况下使用 Apache2),以允许我使用域名引用每个端口,从而将请求转发到http://localhost:808x。对于本地 VH,我选择使用.vpnTLD 将它们标记为域名,以便在使用 VPN 连接到实验室时使用。因此,当我在实验室时,我可以使用普通.int域名而不会发生任何冲突。

总体而言,这个解决方案似乎效果不错。虽然错误有一个选项dismiss,但我想修复它,因为在阅读完文档后,我不清楚简单地忽略它会带来什么后果。

所以我的问题现在非常面向 Jenkins,所以我在下面列出了我设置的各种配置文件。我想知道我的反向代理中可能配置错误,或者我是否需要使用 mod_rewrite。任何建议都将不胜感激。

服务器端
我已启用mod_proxymod_proxy_httpmod_headers。我仅显示了对默认文件所做的更改。

端口配置文件

Listen 80
### TOMCAT is running on 8081
Listen 8082
Listen 8083

jenkins.int.vhost

<VirtualHost *:80 *:8081 *:8083>

        ServerName        jenkins.int
        ProxyRequests     Off
        ProxyPreserveHost On
        AllowEncodedSlashes NoDecode

        <Proxy http://localhost:8081/*>
          Order deny,allow
          Allow from all
        </Proxy>

        ProxyPass         /  http://localhost:8081/ nocanon
        ProxyPassReverse  /  http://localhost:8081/
        ProxyPassReverse  /  http://jenkins.int/

#       Header edit Location ^http://jenkins.vpn http://jenkins.int
</VirtualHost>

/etc/defaults/jenkins

# port for HTTP connector (default 8080; disable with -1)
HTTP_PORT=8081
JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT"

/var/lib/jenkins/jenkins.model.JenkinsLocationConfiguration.xml

<jenkinsUrl>http://jenkins.int/</jenkinsUrl>

/var/lib/詹金斯/詹金斯.CLI.xml

<jenkins.CLI>
  <enabled>true</enabled>
</jenkins.CLI>

需要上述内容才能使脚本运行。

客户端

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>

    ServerName biblio.vpn

    ProxyPass / http://localhost:8082/

</VirtualHost>

<VirtualHost *:80>

    ServerName jenkins.vpn
    ProxyRequests Off
    ProxyPreserveHost On
    AllowEncodedSlashes NoDecode

    ProxyPass / http://localhost:8083/
    ProxyPassReverse / http://localhost:8083/
    ProxyPassReverse / http://jenkins.int/

</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

SSH 配置文件

LocalForward localhost:8080 server.local:8080
LocalForward localhost:8081 server.local:8081
LocalForward localhost:8082 server.local:8082
LocalForward localhost:8083 server.local:8083

更新 2

在 IRC 上与一些热心的 Jenkins 用户交流后,我得出结论,在我们的案例中可以忽略反向代理错误/警告。
最后一个小问题,但很烦人的问题是“New View”链接指向错误的地址(“jenkins.int”而不是“jenkins.vpn”)。编辑 core/src/main/java/jenkins/model/NewViewLink.java 并在第 47 行替换Jenkins.getInstance().getRootUrl()"/",然后重建 Jenkins 并上传 WAR 文件,解决了这个问题。

答案1

当您已经通过隧道接入 VPN 时,了解该组织采用通过网关机器为您建立隧道的政策的原因。

  • 测试网络对生产网络的危险可能是一个原因,但内容数据库和 CI/CD 系统几乎不会造成危险。
  • 并非所有用户都应保护专有信息。但除此之外,这可以通过在所有系统上进行身份验证来实现。如果数据极其敏感或有价值,也许可以使用数据丢失预防解决方案。

如果防火墙允许,您可以在实验室外设置前端负载平衡器或代理。将 Web 应用程序等上的用户连接代理到网络内的后端和数据库。面向“外部”应用程序的经典设计。

如果必须使用隧道,请通过隧道路由实验室子网,而不是使用 ssh 转发单个端口。此外,从 Internet 直接使用 VPN 到此实验室网络会更容易使用。隧道内的隧道是可能的,但编写一个技术水平较低的用户可以使用的配置可能会很棘手,因为需要任何路由,并且可能存在多个不同的 VPN 客户端。

相关内容