SSH 端口转发也被叫做SSH隧道(ssh tunnel),因为它们都是通过SSH登陆之后,在SSH客户端与SSH服务端之间建立了一个隧道,从而进行通信。SSH隧道是非常安全的,因为SSH是通过加密传输数据的(SSH全称为Secure Shell)。
主要有3中模式,本地端口转发(Local Port Forwarding),远程端口转发(Remote Port Forwarding)以及动态端口转发(Dynamic Port Forwarding)。对于本地/远程端口转发,两者的方向恰好相反。动态端口转发,早些年用于科学上网,现在基本没有用了。
1.本地转发(-L):
比如你现在需要连接到正式环境的数据库,那么你不需要先ssh到正式环境再输入数据库命令。我的做法是选择用图形界面查看数据库。命令是这样的
ssh -L 6789:192.168.10.10:5432 online
含义就是将本地6789端口接受到的请求转发到生产环境online上面的192.168.10.10:5432,这样本地GUI数据库管理程序就能够直接连接本地6789端口显示线上数据了。可以看出它的作用就是将本地端口的请求转发的服务器上面
2.远程转发(-R)
这个就是和本地转发相反。在连接的服务器上打开一个端口,映射到自己的端口。此时数据流是服务器端口接收到的数据传到了本地。比如你需要一个公网ip(显然我们的办公环境都是没有公网ip的)来调试你的web应用,比如你本地写了个web程序监听8989端口,你远程服务器上有公网ip。你需要把web程序临时分享到公网给别人尝试使用。执行以下命令
ssh -R 4321:127.0.0.1:8989 online
这样别人访问online:4321就会映射到你本地的8989端口上
3.助记
刚开始可能觉得端口比较容易混淆。只需要记住xx:xx,前面是入口,后面是出口。本地转发的时候数据是从本地发到远程。所以6789是本地端口。远程转发的时候数据是从远程发到本地。所以8989是本地端口
4.常用参数
假如你只需要端口映射不需要进入终端执行命令。可以增加-Nf参数,-N为不进入交互式终端。f为后台执行。假如你需要长期使用,那就使用autossh,和ssh一个套路。就不举例了。