利用SSH Tunnel内网穿透

SSH 除了平时连接远程服务器外,还有不少其他的功能,刚好最近有这个需求,利用了 SSH Tunnel 实现内网穿透,这里简单记录一下。

前提

  1. 需要访问的内网服务器 A
  2. 有公网地址外网服务器 B

利用公网服务器 B 来暴露服务器 A 中的端口,需要 A 主动通过 SSH 连接服务器 B

配置过程

SSH 原生支持远程端口转发,在内网服务器 A 上执行以下命令:

# 内网服务器 A 上执行
# ssh -fN -R 23456:127.0.0.1:22 -i xxx.key B_user@B_public_ip

命令解释:

  1. 23456 端口,是监听在公网服务器 B 上的
  2. 127.0.0.1:22 表示将内网服务器 A 的 ssh 端口映射到公网服务器 23456 端口
  3. -f 表示后台运行
  4. -N 不执行远程命令。端口转发时使用

这个时候在第三台服务器 C 上,就可以通过公网服务器 B 的公网地址 + 23456 端口,访问到内网服务器 A 了

# 三方服务器 C 上执行
$ ssh -p 23456 A_user@B_public_ip

进一步优化

SSH 的连接有时会因为网络不稳定而断开,我们可以使用 autossh 这个工具来帮我们维持 SSH 连接,在断开时自动重连。

autossh 使用方式:

# autossh -M 10086 -fCNR 23456:127.0.0.1:22 -i xxx.key B_user@B_public_ip

参数解释:

  1. -M 指定的端口,也是开放在公网服务器 B 上,用来监听连接的状态,在断开时自动重连的
  2. 其他都是 SSH 自身的参数

其他SSH Tunnel知识

上述内容是将本地内网端口暴露到公网服务器上,叫做 SSH远程端口转发

SSH 本地端口转发,大概命令如下:

ssh -L 9000:remotehost:80 user@host

总结一下:

  1. SSH 本地端口转发,将远程主机的服务端口暴露到本地主机,用户可以在本地主机访问监听端口,就像访问远程服务一样。
  2. SSH 远程端口转发,将本机的端口通过 SSH 连接暴露到远程主机,其他机器可以通过远程主机访问本地的服务。
  3. SSH 还可以利用 SSH 隧道,在本地启动一个 socks 代理,使用 SSH 通道和远端服务器通信。

SSH 能支持端口转发,利用的是 TCP Forwarding ,TCP Forwarding 可以将一个 TCP 连接上的数据转发到另一个 TCP 连接上。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注