搭建SSH反向隧道

SSH 反向隧道基于 SSH 远程端口转发(remote forwarding)技术,可以实现从公网访问内网主机,不需要 VPN。

准备

我们需要一台公网主机作为跳板,该公网主机需要能公网访问。

假设公网主机为 A,内网主机为 B。

主机 IP 地址 SSH 端口 用户名 配置端口端口
A 10.10.10.10 3154 usera 9999 (把 A 的 9999 端口连到 B 的 SSH 端口)
B 192.168.1.2 3154 userb 3154 (SSH 端口)

内网主机配置

在 B 上建立一个 SSH 隧道,将 A 的 9999 端口上的流量都转发到 B 的3154 端口上:

ssh -p 3154 -qngfNTR 9999:localhost:3154 usera@10.10.10.10

参数解释:

  • -p 指定 远端 ssh 端口;
  • -q quiet模式,不打印 warning 等信息;
  • -n 重定向 stdin/dev/null,也就是不接受输入了;
  • -g 允许远端连接本地端口;
  • -f 在后台运行 ssh;
  • -N 不执行命令,只映射端口;
  • -T 不给该 ssh 连接分配 TTY;
  • -R 反向映射。

公网主机配置

配置 SSH 公钥

首先要把 B 的公钥加入到 A 中,让 B 可以在不需要输入密码的情况下通过 SSH 连接 A。

sudo su - autossh
cd ~ && mkdir .ssh
cd .ssh && touch authorized_keys
vi authorized_keys

在 vim 编辑器中将 B 的公钥添加到 authorized_keys 文件中。

配置公网访问(可选)

不做下面的配置,已经可以在 A 主机上通过 ssh userb@localhost:9999 内网主机了。

如果想直接在本地通过 ssh userb@A:9999 从公网直接 SSH 连接内网主机 B,还需要以下配置:

修改 /etc/ssh/sshd_config 文件:

GatewayPorts yes

重启 sshd 服务:

sudo service sshd restart

持久化连接

SSH 连接是会超时关闭的,如果连接关闭,隧道无法维持,那么 A 就无法利用反向隧道穿透 B 所在的 NAT 了,为此我们需要一种方案来提供一条稳定的 SSH 反向隧道。

这里我们用到一个叫做 autossh 的工具。autossh 会启动一个守护进程,这个软件会在超时之后自动重新建立 SSH 隧道。

sudo apt install autossh

运行指令:

autossh -p 3154 -M 9999 -NR 9999:localhost:3154 usera@10.10.10.10

-M 选项指定被监听的隧道端口,与端口转发无关。

参考链接

目录