Skip to content
Go back

如何配置跳板机以实现安全的内网穿透

Edit page

在现代网络架构中,出于安全考虑,我们通常不会将所有服务器都直接暴露在公网上。然而,开发和运维人员又需要随时随地访问这些位于内网的服务器。跳板机(Jump Server 或 Bastion Host)作为一道安全屏障,正是解决这一问题的关键。

核心流程概览

  1. 配置跳板机:创建一个专门的用户并设置SSH公钥认证。
  2. 配置内网服务器:建立到跳板机的反向SSH隧道,并授权跳板机登录。
  3. 配置外网客户端:简化SSH命令,实现无缝跳转登录。
  4. 设置服务自启:使用 systemd 确保反向隧道在服务器重启或中断后能自动恢复。

第一步:在跳板机上创建专门的用户 (可选)

为了安全和管理上的便利,强烈建议在跳板机上为隧道连接创建一个专门的、非root的系统用户。

执行以下命令来创建一个名为 jumpbox 的用户:

sudo useradd -m -s /bin/bash jumpbox

命令解析

第二步:在跳板机上添加授权公钥

接下来,我们需要将外网客户端内网服务器的SSH公钥都添加到跳板机 jumpbox 用户的 authorized_keys 文件中。这样,它们才能免密登录到跳板机。

  1. 切换到新用户并创建配置目录

    # 登陆用户
    su jumpbox
    # 进入家目录
    cd ~
    # 创建.ssh目录并编辑authorized_keys文件
    mkdir -p ~/.ssh
    vim ~/.ssh/authorized_keys
  2. 添加公钥: 将你的外网客户端内网服务器各自的公钥 (~/.ssh/id_rsa.pub 文件的内容) 粘贴到 authorized_keys 文件中,每个公钥占一行。


第三步:在内网服务器上建立反向SSH隧道

这是整个方案的核心。我们在内网服务器上执行一条命令,主动连接到公网的跳板机,并在跳板机上建立一个监听端口,将流量转发回内网服务器的SSH端口。

登录到你的内网服务器,执行以下命令:

autossh -M 0 -f -N -R 2252:localhost:22 [跳板机用户名]@[跳板机IP]

命令解析


第四步:在内网服务器上添加跳板机的公钥

为了让 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

配置解析

配置完成后,你就可以通过一条简单的命令从外网客户端直连内网服务器了:

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 配置块中的 UserExecStart命令中的用户信息(如 smil-jingdian[跳板机用户名]@[跳板机IP])替换为您自己的实际配置。

最后,启动服务并设置开机自启

# 如果是修改了已存在的服务文件,需要先重载配置
sudo systemctl daemon-reload

# 启用并立即启动服务
sudo systemctl enable --now autossh-tunnel.service

现在,一个稳定、安全且能自动恢复的内网穿透隧道就搭建完成了。


Edit page
Share this post on:

Next Post
配置ceph的邮箱报警功能(以QQ邮箱为例)