在现代网络架构中,出于安全考虑,我们通常不会将所有服务器都直接暴露在公网上。然而,开发和运维人员又需要随时随地访问这些位于内网的服务器。跳板机(Jump Server 或 Bastion Host)作为一道安全屏障,正是解决这一问题的关键。
核心流程概览
- 配置跳板机:创建一个专门的用户并设置SSH公钥认证。
 - 配置内网服务器:建立到跳板机的反向SSH隧道,并授权跳板机登录。
 - 配置外网客户端:简化SSH命令,实现无缝跳转登录。
 - 设置服务自启:使用 
systemd确保反向隧道在服务器重启或中断后能自动恢复。 
第一步:在跳板机上创建专门的用户 (可选)
为了安全和管理上的便利,强烈建议在跳板机上为隧道连接创建一个专门的、非root的系统用户。
执行以下命令来创建一个名为 jumpbox 的用户:
sudo useradd -m -s /bin/bash jumpbox
命令解析:
-m或--create-home: 这个选项非常重要,它会在/home/目录下为新用户创建一个家目录 (/home/jumpbox)。-s /bin/bash或--shell /bin/bash: 为用户指定默认的登录 Shell。
第二步:在跳板机上添加授权公钥
接下来,我们需要将外网客户端和内网服务器的SSH公钥都添加到跳板机 jumpbox 用户的 authorized_keys 文件中。这样,它们才能免密登录到跳板机。
- 
切换到新用户并创建配置目录:
# 登陆用户 su jumpbox # 进入家目录 cd ~ # 创建.ssh目录并编辑authorized_keys文件 mkdir -p ~/.ssh vim ~/.ssh/authorized_keys - 
添加公钥: 将你的外网客户端和内网服务器各自的公钥 (
~/.ssh/id_rsa.pub文件的内容) 粘贴到authorized_keys文件中,每个公钥占一行。 
第三步:在内网服务器上建立反向SSH隧道
这是整个方案的核心。我们在内网服务器上执行一条命令,主动连接到公网的跳板机,并在跳板机上建立一个监听端口,将流量转发回内网服务器的SSH端口。
登录到你的内网服务器,执行以下命令:
autossh -M 0 -f -N -R 2252:localhost:22 [跳板机用户名]@[跳板机IP]
命令解析:
autossh: 一个可以自动监控和重连SSH隧道的工具,比原生ssh更稳定。-M 0:autossh的一个监控选项。设置为0表示禁用连接状态监控端口,转而依赖SSH协议自身的KeepAlive机制来维持和监控连接。-f: 让SSH进程在后台运行。-N: 表示不执行远程命令,仅用于端口转发。-R 2252:localhost:22: 设置反向端口转发 (Remote Port Forwarding)。- 这条规则的含义是:在远程主机(即跳板机)上监听 
2252端口。 - 所有发送到跳板机 
2252端口的流量,都会被转发到当前这台内网服务器 (localhost) 的22端口(即SSH服务端口)。 
- 这条规则的含义是:在远程主机(即跳板机)上监听 
 
第四步:在内网服务器上添加跳板机的公钥
为了让 autossh 能够成功建立连接,内网服务器必须信任来自跳板机的连接。因此,你需要将跳板机 jumpbox 用户的公钥添加到内网服务器对应用户的 authorized_keys 文件中。
登录内网服务器后执行:
# 进入家目录
cd
# 创建.ssh目录
mkdir -p ~/.ssh
# 编辑authorized_keys文件,并粘贴跳板机jumpbox用户的公钥
vim ~/.ssh/authorized_keys
第五步:在外网客户端上简化SSH连接
现在隧道已经打通。为了方便从外网客户端直接连接到内网服务器,我们可以配置 ~/.ssh/config 文件。
在你的外网客户端上,编辑 ~/.ssh/config 文件(如果不存在则创建),并添加以下内容:
Host [内网服务器别名]
    HostName localhost
    User internal_user
    Port 2252
    ProxyJump [跳板机用户名]@[跳板机IP]
    ServerAliveInterval 120
配置解析:
Host [内网服务器别名]: 定义一个别名,以后连接时只需输入ssh [内网服务器别名]。HostName localhost: 目标主机名。因为我们使用了ProxyJump,所以这里的localhost指的是相对于跳板机而言的目标地址。User internal_user: 登录内网服务器所用的用户名。Port 2252: 连接跳板机上由反向隧道监听的端口。ProxyJump [跳板机用户名]@[跳板机IP]: 这是关键。它告诉SSH客户端,首先以jumpbox用户身份连接到8.148.xxx.xxx这台跳板机,然后再从跳板机连接到目标主机。ServerAliveInterval 120: 每120秒发送一个心跳包,防止连接因超时而断开。
配置完成后,你就可以通过一条简单的命令从外网客户端直连内网服务器了:
ssh [内网服务器别名]
第六步:设置systemd服务,确保隧道自动重启
为了让反向隧道长期稳定运行,我们可以将其设置为一个系统服务,这样即时内网服务器重启或网络波动导致隧道中断,系统也会自动为我们重建连接。
在内网服务器上,创建并编辑一个 systemd 服务文件:
sudo vim /etc/systemd/system/autossh-tunnel.service
将以下内容粘贴到文件中:
[Unit]
Description=AutoSSH Reverse Tunnel Service
# 要求网络准备好之后再启动本服务
After=network.target
[Service]
# 这一项非常重要!请确保使用您内网机器的普通用户名,而不是root
# 请确保使用您内网机器的普通用户名
User=[内网服务器用户名]
# 启动服务的命令,这里使用了更完善的KeepAlive参数
# 启动服务的命令
ExecStart=/usr/bin/autossh -M 0 -o "ServerAliveInterval=60" -o "ServerAliveCountMax=3" -N -R 2252:localhost:22 [跳板机用户名]@[跳板机IP]
# 设置服务在失败时自动重启
Restart=always
RestartSec=10
[Install]
# 定义服务在哪个运行级别下被启用
WantedBy=multi-user.target
注意:请将 Service 配置块中的 User和 ExecStart命令中的用户信息(如 smil-jingdian、[跳板机用户名]@[跳板机IP])替换为您自己的实际配置。
最后,启动服务并设置开机自启:
# 如果是修改了已存在的服务文件,需要先重载配置
sudo systemctl daemon-reload
# 启用并立即启动服务
sudo systemctl enable --now autossh-tunnel.service
现在,一个稳定、安全且能自动恢复的内网穿透隧道就搭建完成了。