SSH隧道,一文简单讲述

一、SSH隧道这东西,其实没那么复杂

SSH端口转发就是把你想要访问的远程服务,映射到本地一个端口上。

不管是本地转发、远程转发还是动态转发,本质上都只是方向不同而已。

二、为什么需要SSH隧道?

举个例子:
MySQL服务主机在企业内网中,而对应内网主机IP是 192.168.1.100,你在家根本连不上。但是你能SSH登录到企业中其他的机子(即跳板机),而跳板机能访问内网中192.168.1.100的MySQL

这时候就可以用SSH隧道——它在你本地和跳板机之间建了一条加密管道,你的MySQL请求走这条管道,从跳板机出去,就能访问到内网的MySQL。

三、本地端口正向转发(-L):最常用的模式

先说最常用的本地转发。

基本用法

ssh -L 本机端口:目标主机ip:目标机端口 登录用户名@跳板机ip

如果不需要跳板,跳板机ip就直接写目标机ip

多端口转发

有时候需要同时访问多个服务,建立多条隧道,可以一起写,就比如:

ssh -L 3306:mysql数据库主机ip:3306 \
    -L 6379:redis数据库主机ip:6379 \
    -L 8080:web服务主机ip:80 \
    user@跳板机ip

这样本地就同时监听了三个端口,都能用。

后台运行

如果隧道要长期开着,建议后台运行:

ssh -fNT -L 3306:目标机ip:3306 user@目标机ip

参数解释:

  • -f:后台运行
  • -N:不执行远程命令
  • -T:不分配终端

这样SSH隧道就在后台跑着了,不会占着你当前的终端。

四、远程端口反向转发(-R):内网穿透神器

远程转发是把本地的服务暴露到远程服务器上。

使用场景

比如你在本地开发了个Web应用,跑在localhost:3000,想给客户演示。但你没有公网IP,客户访问不了。

这时候如果你有台云服务器(假设地址是cloud.example.com),就可以这样:

ssh -R 8080:localhost:3000 user@cloud.example.com

执行后,客户访问http://cloud.example.com:8080,就能看到你本地的应用了。

动态端口转发(-D):SOCKS代理

这个我用的比较少,但偶尔也会用到。

动态转发相当于在本地开了一个SOCKS代理,所有支持SOCKS的应用都能走这个代理。

基本用法

ssh -D 1080 user@your-server.com

然后在浏览器里配置SOCKS代理:

  • 代理地址:127.0.0.1
  • 端口:1080
  • 类型:SOCKS5

这样浏览器的所有流量都会走SSH隧道,加密后从你的服务器出去。

进阶技法

多跳SSH

有些公司的网络架构比较复杂,需要先跳到一台机器,再跳到另一台,才能访问目标服务。

我之前遇到这种情况都是嵌套SSH命令,特别麻烦。后来发现可以直接用-J参数:

ssh -J user@jump1.com,user@jump2.com -L 3306:db:3306 user@target.com

这样就自动经过两台跳板机了,方便很多。

定期检查隧道

这些命令可以检查挂着的隧道:

# 查看当前SSH连接
ps aux | grep ssh

# 查看监听的端口
netstat -tulpn | grep ssh

及时取消掉不用的隧道。

如果前面有不对的地方,欢迎大家来指正。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐