SSH 跳板机原理与配置:实现无缝跳板连接,一步直达目标主机

前言

在日常运维或开发工作中,我们常常需要访问部署在内网的服务器。然而出于安全策略或网络拓扑的限制,内网服务器并不会直接向外部暴露端口,导致我们无法"直连"它们。此时,跳板机(Jump Host/Bastion Host)就成了必不可少的中转:

  • 先通过 SSH 登录跳板机;
  • 再从跳板机登录到目标服务器。

虽然这样的流程能保证安全隔离,但也带来了一定程度上的不便:我们每次都要进行"两次登录",甚至手动输入多次密码或在多个终端窗口间切换,非常繁琐。有时还需要在跳板机和目标主机之间频繁复制粘贴命令,效率难免受影响。

那么有没有办法在保持安全 的前提下,简化连接流程,实现"一步直达"目标主机?答案是有的 。本文将介绍如何通过 SSH 的配置------主要是 ProxyJump-J 参数)或 ProxyCommand,来自动完成"跳板机"这一步骤,让我们在本地一条命令就能直连内网服务器。

背景信息

  • 跳板机(Bastion Host/Jump Host)
    跳板机通常位于受控网络的边缘,是唯一对外开放 SSH/端口访问的安全中转站。外部用户只能通过跳板机登录内网的其他主机,起到了一道安全防护的作用。
  • 二次登录的痛点
    1. 操作繁琐:每次需要 ssh jump-host 登录,再 ssh target-server
    2. 多次输入凭据:如果没有做密钥共享或 SSH Agent 转发,常常要重复输入密码。
    3. 易出错:在多台服务器之间频繁切换,会不小心在错误的终端窗口执行命令。
  • SSH 配置转发的作用
    • 使用 SSH 内置的代理功能,可以让本地 SSH 客户端在连接目标主机时,自动通过跳板机建立隧道,无需手动二次登录。
    • 对用户来说就像直接登录了目标服务器;对网络来说,数据仍会经由跳板机转发,从安全和合规角度依旧满足策略要求。
  • 兼容性与版本要求
    • ProxyJump-J)需要 OpenSSH 7.3+。
    • ProxyCommand 适用于更早版本的 SSH,兼容性更好,但配置稍微复杂一些。

通过这些方法,我们能在"一步到位"登录目标服务器的同时,保持网络和安全策略的完整性。接下来,将结合示例具体说明如何配置和使用。

传统 SSH 二次登录的方式

在传统的 SSH 登录过程中,尤其是在涉及到跳板机的场景下,我们通常需要执行以下两步操作:

  1. 第一步:登录到跳板机

    假设我们已经知道跳板机的地址 jump-server.dealiaxy.com 和开放的端口(如 10023),我们首先通过 SSH 连接到这台跳板机:

    bash 复制代码
    ssh -p 10023 user@jump-server.dealiaxy.com

    这时,SSH 客户端会要求我们提供登录凭据(如密码或密钥)。如果我们没有将公钥配置到跳板机上,则需要手动输入密码,或配置 SSH Key 来实现免密登录。

  2. 第二步:从跳板机登录到目标主机

    登录到跳板机后,我们还需要执行第二次 SSH 登录,才能进入目标服务器 target.dealiaxy.com

    bash 复制代码
    ssh user@target.dealiaxy.com

    这时,我们再次需要提供目标主机的登录凭据,或者配置 SSH 密钥进行免密登录。如果目标主机和跳板机不在同一网络段,还可能会碰到网络策略或防火墙的问题,导致连接失败。

缺点与痛点

  1. 繁琐的操作步骤 :每次都需要输入多次命令,导致操作复杂和耗时。
    • 如果目标服务器在不同的网络环境中,这一操作的步骤可能还会增加,效率更低。
  2. 多次输入凭据:每次都要手动输入密码或 SSH 密钥,容易出错,尤其在密钥管理不当时。
  3. 切换窗口或多任务操作:需要分别打开多个 SSH 会话来管理跳板机和目标服务器,这样会造成界面混乱,尤其在操作复杂时难以管理。

原理简介:SSH 跳板配置

在传统的 SSH 登录过程中,我们需要手动执行两次 SSH 登录操作。这不仅增加了工作量,也可能导致连接的延迟和不必要的重复步骤。那么,如何才能在保证安全性的同时,简化这一流程呢?

答案是通过 SSH 的 跳板机(Jump Host)配置 ,实现自动化的连接过程。SSH 本身提供了两种主要的方式来处理这种跳板机场景:ProxyJumpProxyCommand。这两种方式都能让我们在一条命令中完成从本地到目标服务器的连接,而不需要手动登录到跳板机。

1. ProxyJump(推荐方式)

从 OpenSSH 7.3 版本开始,SSH 引入了一个新的参数 -J,该参数可以让我们直接指定跳板机。通过使用 -J 参数,我们可以让 SSH 客户端自动先连接到跳板机,再通过跳板机将流量转发到目标主机,完成目标主机的访问。此方法简洁且直接,推荐使用。

示例命令:

bash 复制代码
ssh -J user@jump-server.dealiaxy.com:10023 user@target.dealiaxy.com

在这条命令中,-J 后面指定了跳板机的地址(user@jump-server.dealiaxy.com)和端口(10023)。SSH 会先与跳板机建立连接,然后通过跳板机转发流量到目标服务器 target.dealiaxy.com。整个过程只需要一次登录操作,极大简化了访问流程。

2. ProxyCommand(兼容性更好)

对于老版本的 SSH 客户端,或者在一些特殊场景下(比如要使用其他协议或更复杂的转发配置),可以使用 ProxyCommand 来实现跳板机配置。ProxyCommand 是 SSH 客户端允许我们定义自定义的命令来建立连接的机制,通过它我们可以指定跳板机的命令。

示例命令:

bash 复制代码
ssh -o "ProxyCommand ssh -W %h:%p user@jump-server.dealiaxy.com -p 10023" user@target.dealiaxy.com

在这个命令中,-o "ProxyCommand" 选项指定了一个自定义的命令来通过跳板机进行连接。具体地,ssh -W %h:%p 会将目标主机(%h)和端口(%p)转发给跳板机,然后通过跳板机建立与目标主机的连接。

虽然这种方式配置更复杂,但它具有更强的灵活性,支持更多定制化的需求。

通过配置跳板机,我们可以避免每次都手动登录到跳板机再去登录目标主机。无论是 ProxyJump 还是 ProxyCommand,都可以大大简化我们的操作流程,提高效率。ProxyJump 是推荐的方式,因为它更加简洁和易于使用,且适用于大多数现代的 OpenSSH 客户端版本。

在下一节中,我们将详细介绍如何配置这些选项,快速实现无缝的 SSH 跳板连接。

跳板配置方法

方法一:使用 -J(ProxyJump)参数

如前所述,-J 参数是 OpenSSH 7.3 及以上版本提供的一个功能,它允许我们在一条命令中指定跳板机,从而简化了访问内网服务器的过程。相比传统的二次登录方式,使用 -J 参数能够让我们直接通过跳板机登录到目标主机,避免了繁琐的两次 SSH 登录操作。

1. 基本语法

-J 参数的基本语法格式如下:

bash 复制代码
ssh -J <jump-user>@<jump-host>:<port> <target-user>@<target-host>
  • <jump-user>:跳板机的用户名
  • <jump-host>:跳板机的地址(可以是域名或 IP)
  • <port>:跳板机的端口(默认是 22,可以根据实际情况修改)
  • <target-user>:目标服务器的用户名
  • <target-host>:目标服务器的地址(可以是域名或 IP)

2. 示例命令

假设你已经有了如下的连接信息:

  • 跳板机:jump-server.dealiaxy.com,端口:10023
  • 目标服务器:target.dealiaxy.com
  • 用户名:user

你可以使用如下命令直接通过跳板机连接到目标服务器:

bash 复制代码
ssh -J user@jump-server.dealiaxy.com:10023 user@target.dealiaxy.com

当你执行这个命令时,SSH 客户端会先与跳板机 jump-server.dealiaxy.com 通过指定的端口(10023)建立连接,然后从跳板机自动转发到目标服务器 target.dealiaxy.com,就像直接登录目标服务器一样。这一过程对用户来说完全透明,你只需提供一次凭据(用户名和密码或 SSH 密钥),即可完成连接。

3. 免密登录

如果你已经配置了 SSH 密钥对并将公钥添加到跳板机和目标主机的授权文件中,使用 -J 参数时,SSH 会自动使用密钥进行身份验证,而无需手动输入密码。例如:

bash 复制代码
ssh -J user@jump-server.dealiaxy.com:10023 -i /path/to/private_key user@target.dealiaxy.com

这样,你就可以实现完全免密的连接,进一步提高了登录效率。

4. 配置文件中使用 ProxyJump

如果你不想每次都在命令行中手动输入跳板机的地址和端口,可以将 -J 配置写入 SSH 配置文件 ~/.ssh/config。这样,你就能为不同的服务器设置简便的别名和配置,避免重复输入。

~/.ssh/config 文件中,你可以这样配置:

bash 复制代码
Host target-server
  HostName target.dealiaxy.com
  User user
  ProxyJump user@jump-server.dealiaxy.com:10023

配置完成后,你只需要执行如下命令即可:

bash 复制代码
ssh target-server

SSH 会自动根据配置文件中的 ProxyJump 参数,先连接到跳板机 jump-server.dealiaxy.com,再转发到目标服务器 target.dealiaxy.com

5. 优点

  • 简洁高效 :通过 -J 参数,SSH 客户端会自动处理跳板机的连接和转发,避免了手动输入两次命令。
  • 支持免密登录:通过配置 SSH 密钥对,可以实现免密登录,进一步提高效率。
  • 配置灵活 :可以通过 ~/.ssh/config 文件对多个目标主机设置跳板机配置,简化管理。

这就是使用 -J 参数(ProxyJump)来简化 SSH 跳板机连接的基本方法。它不仅提升了工作效率,还避免了手动输入多次密码或命令的繁琐。如果你的 SSH 版本支持 -J 参数,这无疑是最简单、最直接的解决方案。

方法二:使用 ProxyCommand

在 OpenSSH 7.3 之前,-J 参数尚未出现,SSH 客户端并没有直接支持跳板机的简洁方式。然而,我们可以通过 ProxyCommand 来实现类似的功能,这种方法与 -J 相比,兼容性更好,适用于较旧版本的 SSH 客户端或那些不支持 -J 参数的情况。

ProxyCommand 允许我们指定一个命令来作为跳板机的连接方式,通常我们可以利用 nc(netcat)命令来实现跳板机的连接。通过这种方式,SSH 客户端会在连接目标主机时,先与跳板机建立一个代理连接,然后通过代理连接转发数据流。

1. 基本语法

在 SSH 配置文件中使用 ProxyCommand 的基本语法如下:

bash 复制代码
Host <target-host>
  ProxyCommand ssh -q -W %h:%p <jump-user>@<jump-host> -p <port>
  • <target-host>:目标主机的地址,可以是域名或 IP。
  • <jump-user>:跳板机的用户名。
  • <jump-host>:跳板机的地址(可以是域名或 IP)。
  • <port>:跳板机的端口(默认为 22,若有特殊端口需要指定)。
  • %h%p:表示目标主机的主机名和端口,SSH 会在连接时自动替换。

2. 配置示例

为了实现通过跳板机访问目标主机的功能,我们可以将以下配置添加到 SSH 客户端的配置文件中(~/.ssh/config):

bash 复制代码
Host target.dealiaxy.com
  ProxyCommand ssh -q -W %h:%p user@jump-server.dealiaxy.com -p 10023

这段配置意味着,每次我们尝试连接 target.dealiaxy.com 时,SSH 客户端都会首先通过跳板机 jump-server.dealiaxy.com(端口 10023)建立连接,然后通过跳板机将流量转发到目标服务器。

3. 使用配置后的简化命令

配置好 ProxyCommand 后,我们就不再需要在命令行中指定跳板机和端口。只需要执行如下命令:

bash 复制代码
ssh user@target.dealiaxy.com

SSH 客户端会自动通过 ProxyCommand 配置连接到跳板机,并将连接转发到目标主机 target.dealiaxy.com,整个过程无需手动指定任何跳板机的参数。

4. 配置文件的灵活性

在使用 ProxyCommand 时,配置文件的灵活性使得我们可以为不同的目标主机配置不同的跳板机。假设你有多个内网目标主机,可以为每个目标主机添加不同的配置:

bash 复制代码
Host target1.dealiaxy.com
  ProxyCommand ssh -q -W %h:%p user@jump-server.dealiaxy.com -p 10023

Host target2.dealiaxy.com
  ProxyCommand ssh -q -W %h:%p user@jump-server.dealiaxy.com -p 10023

这样,在访问不同的目标时,你只需输入相应的主机名(如 ssh user@target1.dealiaxy.com),SSH 客户端会根据配置自动选择跳板机进行连接。

5. 小结

ProxyCommand 提供了一种灵活且兼容性较强的方式,帮助我们在不支持 -J 参数的 SSH 客户端中实现通过跳板机连接目标服务器的功能。尽管这种方法稍显复杂,但它仍然是一种非常有效的解决方案,尤其适合需要在多个环境中使用的用户。


通过这种方式,你可以轻松实现从本地机器通过跳板机连接目标服务器,无需手动登录两次,从而节省了时间并提高了效率。如果你使用的是较老版本的 OpenSSH 客户端,ProxyCommand 无疑是一个很好的替代方案。

进阶:SSH 密钥管理 / 多跳板机

在使用 SSH 连接时,通常推荐使用 SSH 密钥对进行身份验证,而不是使用密码。这不仅能够提高安全性,还能免去每次登录时手动输入密码的麻烦。此外,当涉及到多个跳板机或需要更加复杂的 SSH 配置时,我们还可以通过一些进阶的设置来进一步简化连接过程。

1. SSH 密钥管理

SSH 密钥认证是一种更加安全且方便的身份验证方式。相比密码认证,密钥认证在以下方面具有明显优势:

  • 安全性更高:密码容易被猜测或暴力破解,而 SSH 密钥通过加密算法生成,破解难度更大。
  • 免密登录:配置好公私钥对后,用户可以在不输入密码的情况下自动完成登录。
步骤 1:生成 SSH 密钥对

如果还没有 SSH 密钥对,可以通过以下命令生成:

bash 复制代码
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

这会在 ~/.ssh/ 目录下生成一对公钥(id_rsa.pub)和私钥(id_rsa)。在生成过程中,可以设置密钥的文件名和密码(可选)。

步骤 2:将公钥复制到跳板机和目标主机

为了使密钥认证生效,我们需要将公钥复制到目标主机和跳板机的 ~/.ssh/authorized_keys 文件中。可以使用 ssh-copy-id 命令来自动完成这一操作:

bash 复制代码
ssh-copy-id -i ~/.ssh/id_rsa.pub user@jump-server.dealiaxy.com
ssh-copy-id -i ~/.ssh/id_rsa.pub user@target.dealiaxy.com

执行完这两条命令后,你就可以通过 SSH 密钥对完成无密码登录。

2. 多跳板机的配置

有时候,我们需要通过多个跳板机(Multi-hop)才能访问目标服务器。在这种情况下,我们可以继续利用 ProxyCommand-J 参数来实现多跳板机的配置。

2.1 使用 -J 参数配置多跳板机

假设我们需要通过两个跳板机才能访问目标服务器,第一台跳板机 jump1.dealiaxy.com 和第二台跳板机 jump2.dealiaxy.com。可以使用如下命令:

bash 复制代码
ssh -J user@jump1.dealiaxy.com:10023 -J user@jump2.dealiaxy.com:10023 user@target.dealiaxy.com

在这个命令中,SSH 客户端会先连接到 jump1.dealiaxy.com,再从 jump1 转发连接到 jump2.dealiaxy.com,最后通过 jump2 转发到目标服务器 target.dealiaxy.com

2.2 使用 ProxyCommand 配置多跳板机

如果我们使用较老版本的 SSH 客户端,或者更喜欢手动配置 SSH 客户端的设置,可以在 SSH 配置文件(~/.ssh/config)中为多跳板机设置 ProxyCommand。示例如下:

bash 复制代码
Host target.dealiaxy.com
  ProxyCommand ssh -q -W %h:%p user@jump1.dealiaxy.com -p 10023
  ProxyCommand ssh -q -W %h:%p user@jump2.dealiaxy.com -p 10023

在此配置中,SSH 客户端首先会通过 jump1.dealiaxy.com 建立连接,再通过 jump2.dealiaxy.com 将流量转发到目标主机 target.dealiaxy.com

3. 配置多个目标主机的密钥

如果你有多个目标主机,并且每个目标主机使用不同的 SSH 密钥进行认证,你可以为不同的主机配置不同的密钥。可以通过 IdentityFile 参数来指定不同的私钥文件。例如,在 SSH 配置文件中,可以为每个主机设置不同的 SSH 密钥:

bash 复制代码
Host target1.dealiaxy.com
  IdentityFile ~/.ssh/id_rsa_target1

Host target2.dealiaxy.com
  IdentityFile ~/.ssh/id_rsa_target2

这样,当你连接到 target1.dealiaxy.comtarget2.dealiaxy.com 时,SSH 客户端会自动使用对应的私钥进行认证。

4. 优化连接速度:使用 ControlMaster

在连接过程中,每次与跳板机和目标主机的连接都会涉及到建立新的 SSH 会话。为了提高效率,减少连接延迟,我们可以利用 SSH 的 ControlMaster 功能,通过复用现有的 SSH 会话来加速后续的连接。可以在 SSH 配置文件中添加如下配置:

bash 复制代码
Host jump-server.dealiaxy.com
  ControlMaster auto
  ControlPath ~/.ssh/cm_socket/%r@%h:%p
  ControlPersist 10m

Host target.dealiaxy.com
  ControlMaster auto
  ControlPath ~/.ssh/cm_socket/%r@%h:%p
  ControlPersist 10m

在这个配置中,SSH 会将跳板机和目标主机的连接保持在后台(最多 10 分钟),如果在此时间内重新连接,SSH 会直接复用现有连接,显著减少连接建立的时间。

相关推荐
虾..1 小时前
Linux 软硬链接和动静态库
linux·运维·服务器
Evan芙2 小时前
Linux常见的日志服务管理的常见日志服务
linux·运维·服务器
hkhkhkhkh1234 小时前
Linux设备节点基础知识
linux·服务器·驱动开发
HZero.chen5 小时前
Linux字符串处理
linux·string
张童瑶5 小时前
Linux SSH隧道代理转发及多层转发
linux·运维·ssh
汪汪队立大功1235 小时前
什么是SELinux
linux
石小千5 小时前
Linux安装OpenProject
linux·运维
柏木乃一5 小时前
进程(2)进程概念与基本操作
linux·服务器·开发语言·性能优化·shell·进程
Lime-30905 小时前
制作Ubuntu 24.04-GPU服务器测试系统盘
linux·运维·ubuntu
百年渔翁_肯肯6 小时前
Linux 与 Unix 的核心区别(清晰对比版)
linux·运维·unix