前言

Jump Host/Server,也就是跳转机,是一个可以连通远程网络的中间主机或 SSH 网关,通过它可以连接到不同安全区(例如DMZ 隔离区)中的另一台主机。它桥接了两个不同的安全区域,并在它们之间提供受控访问。

跳转机应该处于高度保护和监控中,尤其是当它跨越私有网络,DMZ,并向互联网上的用户提供服务时。

一个典型场景是公司内网的个人电脑,通过防火墙可以高度安全地连接到 DMZ。为了管理 DMZ 中的服务器,则需要通过跳转主机访问它。

简而言之,SSH 跳转机可以看作 SSH 协议网关,通过它可以连通私有网络中的服务器。

接下来,将演示如何通过跳转主机访问远程 Linux 服务器,以及如何对 SSH 客户端进行相关配置。

SSH 跳转机配置

jenkins ssh跳板机 ssh连接跳板机_Server


上图展示了,SSH 跳转机在网络中的角色。

跳转机为为访问网络中的基础设施提供了一个入口网关,降低了网络资源受到攻击的风险。同时,跳转机作为网络资源的单一访问入口点,通过跳转机可以实现对网络设备的透明管理。

同时也应该牢记,当引入跳转机作为整个基础设施的一环时,应加固并保证跳转机自身的安全,否则,事与愿违!

创建一个简单的 SSH 跳转服务器

下面是一个简单的配置示例:

  • 发起 IP:105.68.76.85
  • 跳转机 IP (HOST 1):173.822.25.5。
  • 目的 IP (HOST 2):173.82227.89。

在上面的场景中,你想要连接 HOST 2(173.822.227.89),但是由于防火墙、路由和访问权限的原因(需要跳转主机的原因有很多),就必须通过HOST 1(173.822.23.25)才能实现对 HOST 2 的连接和访问。

通过跳转机连接到目标服务器的最简单方法是使用 SSH 命令行中的 -A 和 -J 标志。这告诉 ssh 先建立与跳转主机的连接,然后从那里建立到目标服务器的 TCP 转发(确保您在机器之间拥有免密的 ssh 登录)!

$ ssh -A -J user@jump-server:port user@destination-server:port

下面是一个实际的例子,命令行执行后,会提示先输入跳转机的用户密码,然后输入目标服务器的用户密码:

jenkins ssh跳板机 ssh连接跳板机_jenkins ssh跳板机_02


也可以像下面一样指定多个跳转机:

$ ssh -J username@just-host1:port,username@just-host2:port username@target-host3:port

静态跳转机列表

在 ~/.ssh/config 文件中添加以下静态 jumphost “routing”,并指定主机别名,如下:

### First jumphost. Directly reachable
Host vps1
  HostName vps1.example.org

### Host to jump to via jumphost1.example.org
Host contabo
  HostName contabo.example.org
  ProxyJump vps1

执行下面的命令:

$ ssh -J vps1 contabo

jenkins ssh跳板机 ssh连接跳板机_IP_03


第二种方法是在 ~.ssh/config 或 $HOME/.ssh/config 文件中,使用 ProxyCommand 选项来配置跳转机,例如如:

Host vps1
	HostName vps1.example.org
	IdentityFile ~/.ssh/vps1.pem
	User ec2-user

Host contabo
	HostName contabo.example.org	
	IdentityFile ~/.ssh/contabovps
	Port 22
	User admin	
	Proxy Command ssh -q -W %h:%p vps1

重启 ssh 进程,使配置生效:

$ sudo systemctl restart ssh

那么,通过下面的命令就可以访问目标服务器:

$ ssh contabo

确保跳转机的安全

使此设置更加安全的方法之一是将公共SSH密钥从始发系统复制到 Jump Server,然后最终复制到目标系统,然后禁用密码身份验证。