Last Updated on 2024-04-02 by likun.gong
SSH 除了平时连接远程服务器外,还有不少其他的功能,刚好最近有这个需求,利用了 SSH Tunnel 实现内网穿透,这里简单记录一下。
前提
- 需要访问的内网服务器 A
- 有公网地址外网服务器 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
命令解释:
- 23456 端口,是监听在公网服务器 B 上的
- 127.0.0.1:22 表示将内网服务器 A 的 ssh 端口映射到公网服务器 23456 端口
- -f 表示后台运行
- -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
参数解释:
- -M 指定的端口,也是开放在公网服务器 B 上,用来监听连接的状态,在断开时自动重连的
- 其他都是 SSH 自身的参数
其他SSH Tunnel知识
上述内容是将本地内网端口暴露到公网服务器上,叫做 SSH远程端口转发
SSH 本地端口转发,大概命令如下:
ssh -L 9000:remotehost:80 user@host
总结一下:
- SSH 本地端口转发,将远程主机的服务端口暴露到本地主机,用户可以在本地主机访问监听端口,就像访问远程服务一样。
- SSH 远程端口转发,将本机的端口通过 SSH 连接暴露到远程主机,其他机器可以通过远程主机访问本地的服务。
- SSH 还可以利用 SSH 隧道,在本地启动一个 socks 代理,使用 SSH 通道和远端服务器通信。
SSH 能支持端口转发,利用的是 TCP Forwarding ,TCP Forwarding 可以将一个 TCP 连接上的数据转发到另一个 TCP 连接上。
发表回复