利用 AutoSSH 实现内网机器 ssh 公网访问(开机自动启动)

文章目录

    • 任务目标
    • 准备 AutoSSH 所需条件
      • 在 B 上安装 autossh
      • 开启 A 上的 SSH GatewayPorts 设置
      • 为 B 生成密钥文件并传送到 A
    • 将 B 上的 autossh 设置开机启动
    • 测试

任务目标

服务器:

  • A:公网机器,可被公网访问到,用户名 user_a,地址 host_a,开放的 ssh 端口为 ssh_port_a
  • B:要穿透的内网机器,无法被公网访问到,但是可以访问到 A,用户名 user_b,开放的 ssh 端口为 ssh_port_b

目标:能够通过公网机器 A 的 virtual_port 访问 B 的 ssh 端口(ssh_port_b)。

准备 AutoSSH 所需条件

在 B 上安装 autossh

apt install autossh

开启 A 上的 SSH GatewayPorts 设置

在 A 上需要开启 sshd 服务,并确保 GatewayPorts 设置为 yes。设置方法:

在 A 机器的 /etc/ssh/sshd_config 文件中,确保有这样一行设置:

GatewayPorts yes

如果你刚刚添加完这一行,记得在 A 上执行 service sshd restart 来应用设置。

为 B 生成密钥文件并传送到 A

因为 autossh 是自动运行,不可能有人输入密码,因此需要用密钥文件认证。

在 B 上生成证书文件:

ssh-keygen

然后按三次回车执行默认选项生成公钥和私钥。会生成密钥文件和私钥文件 id_rsaid_rsa.pubid_dsaid_dsa.pub

用以下命令将这些文件传送到 A 服务器:

ssh-copy-id -p <ssh_port_a> <user_a>@<host_a>

将 B 上的 autossh 设置开机启动

我们可以在 B 机器上将 autossh 设置为开机启动服务,这样 B 每次开机以后,都会自动连接 A 了。

在 B 上创建 /lib/systemd/system/autossh.service 文件:

#file path /lib/systemd/system/autossh.service
 
[Unit]
Description=autossh
Wants=network-online.target
After=network-online.target
 
[Service]
Type=simple
Environment="AUTOSSH_GATETIME=0"
User=<user_b>
Group=<user_b>
WorkingDirectory=/home/<user_b>
ExecStart=/usr/bin/autossh -M 0 -p <port_a> -NR <virtual_port>:localhost:<port_b> <user_a>@<host_a>
 
[Install]
WantedBy=multi-user.target

然后使用以下命令注册开机启动服务:

systemctl enable autossh

测试

为了方便测试,我们用一个新的计算机 C 来测试,它能够连接到 A,但是无法连接到 B。

通过以下命令先将 A 的 virtual_port 端口(此端口被映射到 B 的 port_b 端口)拉取到 C 本地的 10022 端口:

ssh -p <port_a> <user_a>@<host_a> -L 10022:localhost:<virtual_port>

然后在 C 上通过以下命令连接到 C 本地的 10022 端口(此端口已被 C 上的 ssh 命令监听,并映射到 A 的 virtual_port 端口):

ssh -p 10022 <user_b>@localhost

成功连接到 B 上的 ssh 端口。当然,如果你可以直接在公网访问到 A 服务器的 virtual_port 端口,那么也可以不运行第一条指令,而直接执行:

ssh -p <virtual_port> <user_b>@<host_a>

你可能感兴趣的:(山东大学网盘开发)