前言

在日常运维或开发工作中,我们常常需要访问部署在内网的服务器。然而出于安全策略或网络拓扑的限制,内网服务器并不会直接向外部暴露端口,导致我们无法“直连”它们。此时,跳板机(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 连接到这台跳板机:

    ssh -p 10023 user@jump-server.dealiaxy.com

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

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

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

    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 客户端自动先连接到跳板机,再通过跳板机将流量转发到目标主机,完成目标主机的访问。此方法简洁且直接,推荐使用。

示例命令:

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 客户端允许我们定义自定义的命令来建立连接的机制,通过它我们可以指定跳板机的命令。

示例命令:

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 参数的基本语法格式如下:

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

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

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 会自动使用密钥进行身份验证,而无需手动输入密码。例如:

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 文件中,你可以这样配置:

Host target-server
HostName target.dealiaxy.com
User user
ProxyJump user@jump-server.dealiaxy.com:10023

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

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 的基本语法如下:

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):

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 后,我们就不再需要在命令行中指定跳板机和端口。只需要执行如下命令:

ssh user@target.dealiaxy.com

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

4. 配置文件的灵活性

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

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 密钥对,可以通过以下命令生成:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

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

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

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

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。可以使用如下命令:

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。示例如下:

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 密钥:

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 配置文件中添加如下配置:

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 会直接复用现有连接,显著减少连接建立的时间。

SSH 跳板机原理与配置:实现无缝跳板连接,一步直达目标主机的更多相关文章

  1. 【转】SSH穿越跳板机:一条命令跨越跳板机直接登陆远程计算机

    转自:http://mingxinglai.com/cn/2015/07/ssh-proxycommand/ 今天在公司搭建跳板机,遇到一个比较麻烦的问题,这里简单记录一下,希望对有相同问题的人有所帮 ...

  2. 在有跳板机的情况下,SecureCRT自动连接到目标服务器

    为了服务器的安全,运维人员经常会要求我们先登录到跳板机,然后再SSH连接到目标服务器.但是这样是很繁琐的,每次在SecureCRT创建一个连接,都需要输入SSH命令,然后输入密码. 下面的方法可以实现 ...

  3. mac/Linux/centos ssh连接服务器以及跳板机,实现类型Xshell 功能

    1. 由于之前一段时间,公司测试服务器需要有跳板机这种操作,由于mac机器上没有类似Xshell这种程序,所以,只能自己造轮子啦. 本程序采用Shell+Expect脚本编写 具体代码请查看:http ...

  4. 【效率工具】SSH一键登录脚本(可一键从跳板机登录线上服务器)

    说明 前阵子上线,一次性上了十个服务,一直上到凌晨才完事,期间每个服务都要先输入跳板机的登录信息来登录跳板机,然后再输入线上服务器的信息来登录线上服务器,实在是太过于麻烦,而且有些服务还有好几台服务器 ...

  5. ansible 通过堡垒机/跳板机 访问目标机器需求实战(ssh agent forward)

    一. 需求背景: 在我们使用ansible的过程中经常会遇到这样的情况,我们要管理的机器都在内网中,这些内网机器的登录都是通过跳板机或者堡垒机登录.我们的ansible机器不能直接管理到这些后端的机器 ...

  6. 13、ssh跳板机

    13.1.前提条件: 1.跳板机服务器和其它服务器建立了ssh秘钥登录: 2.目前的环境: (1)各服务器上都建立了lc用户,并给于sudo (lc ALL= NOPASSWD:ALL )权限,lc就 ...

  7. mysql ssh 跳板机(堡垒机???)连接服务器

    跳板机(Jump Server),也称堡垒机,是一类可作为跳板批量操作远程设备的网络设备,是系统管理员或运维人员常用的操作平台之一. 正常的登录流程 使用ssh命令登录跳板机: 登录跳板机成功后,在跳 ...

  8. ssh隧道(通过跳板机)连接mysql

    案例: A服务器   B服务器   C服务器mysql 现在mysql服务器C只能通过内网访问,B服务器就能通过内网连接访问到mysql A服务器无法直接连接C服务器mysql,所以要通过跳板机(跳板 ...

  9. Shell实现跳板机,为什么用跳板机

    整理自:http://blog.chinaunix.net/uid-22101889-id-3167454.html 注意:请谨慎使用,到现在为止,使用了,我还没找到改回去的方法. 1.     问题 ...

  10. 不输入用户名密码通过跳板机登录到线上linux机器

    问题: 一般情况下,公司所有的服务器都在内网,公网访问.管理服务器都要先通过登录一台跳板机,然后再由跳板机登录到相应的服务器进行操作,跳板机与服务器的连接都是内网地址.我们经常看到的现象就是下图这样, ...

随机推荐

  1. SpringBoot进阶教程(八十三)Kaptcha

    Kaptcha是谷歌开源的一个可高度配置的比较老旧的实用验证码生成工具.它可以实现:(1)验证码的字体/大小颜色:(2)验证码内容的范围(数字,字母,中文汉字):(3)验证码图片的大小,边框,边框粗细 ...

  2. 鸿蒙NEXT开发案例:简体繁体转换器

    [引言] 简体繁体转换器是一个实用的小工具,它可以帮助用户轻松地在简体中文和繁体中文之间进行转换.对于需要频繁处理两岸三地文档的用户来说,这样的工具无疑是提高工作效率的好帮手.本案例将展示如何利用鸿蒙 ...

  3. Redis究竟为什么这么快?

    Redis为什么这么快? 完全基于内存,数据存在内存中,绝大部分请求是纯粹的内存操作,非常快速,跟传统的磁盘文件数据存储相比,避免了通过磁盘IO读取到内存这部分的开销. 数据结构简单,对数据操作也简单 ...

  4. vue中去掉地址栏中的#

    mode设置成history就可以了

  5. Django之form表单的数据验证

    1.先导入forms模块 from django import forms 2.创建模板的类 class loginform(forms.Form): # 2.模板中的元素 name = forms. ...

  6. kali 安装 shodan

    声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无 ...

  7. JPAAS整合宝蓝德

    现在软件国产化的需求成了刚需了,因此在实施的过程中,我们整合了宝蓝德,我将过程写一下. 1.宝蓝德提供的程序包. 包名 说明 bes-actuator-spring-boot-2.x-starter- ...

  8. 李世铭SFE|销售的四种境界-与之匹配的CRM功能

    销售有四种境界,与之匹配的也应有四种不同的CRM系统的功能. 1.服务型销售 这类销售代表人数最为众多,超过半数的销售代表皆属于服务型.他们主要基于客户的需求,来提供相应的解决方案,或者公司所规定的某 ...

  9. 张高兴的 Raspberry Pi AI 开发指南:(二)使用 Python 进行目标检测

    目录 Python 环境配置 实现 USB 摄像头的目标检测 参考 在上一篇博客中,探讨了使用 rpicam-apps 通过 JSON 文件配置并运行目标检测示例程序.虽然这种方法可以实现有效的检测, ...

  10. 19号CSS学习

    一.CSS的复合选择器 更高效的选择目标元素. 后代选择器.子选择器.并集选择器.伪类选择器等. 1.后代选择器 可以选择父元素里的子元素. 又称包含选择器. 必须是空格,必须是后代,ul li {c ...