背景
在工作中我们也许会有如下需求。
从公网访问处于内网的台式机。
将处于内网的服务器暴露给外网访问。
将远程服务器上的服务绑定到本地物理机上的端口。
这时候,ssh给我们提供了一套解决方案来做本地和远程的端口映射。下面的内容将详细描述如何使用ssh,将处于内网的物理机暴露给外网访问。你将需要如下设备
- 一台处于内网环境的物理机,该物理机有公网访问。
- 一台稳定的服务器,可以是阿里云或者别的云平台上的vps。
- 操作系统是ubuntu、centos或者别的linux系统。
远程端口转发
假设我们要将本地的22端口(sshd端口)映射到远端的5000端口,远端服务器的ip是101.133.100.200,那么我们只需要运行如下命令即可。
ssh -R 5000:localhost:22 root@101.133.100.200
此时,在远端服务器101.133.100.200上,我就可以通过 ssh -p 5000 user@localhost
来访问位于单位内网的物理机的22端口了。
ssh config 配置
生活是为懒人准备的,ssh可以使用其位于 ~/.ssh/config
来简化配置,完整的列表可以在这里查询到 ssh config文档。在这里我简单配置如下
# file at ~/.ssh/config
Host ali-cloud
Hostname 101.133.100.200
User root
RemoteForward localhost:22 1101.133.100.200:5000
这时,我们可以通过如下命令来便捷的启动ssh反向隧道
ssh ali-cloud
autossh来维持稳定的反向隧道
上述的方法可以实现一个ssh反向隧道,将本地物理机的22端口暴露给外网访问,但是该方案是不稳定的。如果ssh tunnel的进程退出,或者远端服务器重启,连接都会断掉。这时我们可以使用autossh来维护这个ssh tunnel的稳定。
autossh是一个用来监控及维护ssh tunnel的软件,它也可以识别文件 ~/.ssh/config
,修改配置文件如下
# file at ~/.ssh/config
Host ali-cloud
Hostname 101.133.100.200
User root
RemoteForward localhost:22 1101.133.100.200:5000
ServerAliveInterval 30
ServerAliveCountMax 3
安装autossh
apt-get update && apt-get install autossh
运行autossh
autossh -M 0 -f -T -N ali-cloud
这样配置以后,autossh会在后台维持一个稳定的反向ssh隧道,可以在阿里云服务器上干掉ssh隧道的daemon进程,可以发现autossh会自动起来一个新的