文章目录
任务目标
服务器:
- 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_rsa
、id_rsa.pub
或 id_dsa
、id_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>