概念
ssh隧道大致可以分为3种,分别为本地端口转发,远程端口转发,动态端口转发,本文将让你彻底搞懂这3个转发的命令表达形式,让你能够灵活运用解决生活中的各种特殊场景。
如果你正在使用mobaxterm、xshell、secureCRT、putty这类工具,可直接可视化界面简单配置即可使用,若你没有使用工具,通过本教程可直接通过命令进行隧道转发。
应用场景
针对部分企业或者个人为了安全只允许ssh登录堡垒机或者防火墙允许的机器访问内部的一些服务。主要作用在于加密 SSH Client 端至 SSH Server 端之间的通讯数据,突破防火墙的限制完成一些之前无法建立的 TCP 连接。
例如:一个互联网用户需要访问公司内网服务器,该服务器不对外提供服务,只是对于管理需要,在防火墙上开了ssh映射端口用于管理内网服务器。对于内网服务器上其它服务的访问无法直接访问的。现有一些需求:
1、需要访问内网服务器的一个web服务;
2、通过内网服务器再访问内网的其他web服务;
3、需要挂内网端口代理进行使用,比如聊天工具使用的SOCK5代理流量交给内网的某个代理进行处理(自行脑补)。
4、本地的一个临时web服务需要通过vps临时让对外访问。
5、突破防火墙,达到内网穿透的效果。
三个ssh安全隧道端口转发详解
1、本地端口转发
连接从客户端主机转发到SSH服务器主机,然后转发到目标主机端口。
语法:
代码语言:javascript复制ssh -g -N -L -f [本地端口]:[远程IP]:[远程端口] [ssh帐号]@[ssh服务IP] -p [ssh服务端口]
举个栗子:
代码语言:javascript复制ssh -g -N -L -f 9999:192.168.100.100:80 root@www.test.com -p 22
输入命令之后才会让你输入ssh的连接密码,上面的命令意思是,访问本机电脑的 http://本地IP:9999
可以直接访问到远程机器的 http://192.168.100.100:80
所在的web服务。
参数说明:
-g:开启网关,表示访问本地的所有IP地址都可以; -N:表示创建隧道以后不连接到 ssh服务端,连接之后界面会直接卡住,若你要建立之后并连接ssh服务端操作,可以直接取消本参数; -L:表示local,本地端口转发; -f:表示在后台运行,注意在后台运行只能通过杀进程的方式结束 9999:192.168.100.100:80:这个表示[本地端口8888]:[远程IP192.168.100.100]:[80]; root@www.test.com -p 22:使用root用户连接 www.test.com 的ssh服务,ssh端口是22,若你不是22端口则需要修改;
上面命令实现了和 mobaxterm 一样的功能如下:
2、远程端口转发
将端口从服务器主机转发到客户端主机,然后转发到目标主机端口。
语法:
代码语言:javascript复制ssh -g -N -R -f [远程端口]:[目标机器IP]:[目标机器端口] [ssh帐号]@[ssh服务IP] -p [ssh服务端口]
举个栗子:
代码语言:javascript复制ssh -g -N -R -f 9999:localhost:80 root@www.test.com -p 22
输入命令之后才会让你输入ssh的连接密码,上面的命令意思是,访问ssh所在机器的9999端口,相当于访问了目标机器的 localhost:80 所在的web服务。这里需要注意,默认ssh只会绑定端口在127.0.0.1换回地址上面,若需要绑定到所有 IP,需要在远程机器 sshd 配置文件中打开GatewayPorts:on
。
参数说明:
-g:开启网关,表示访问本地的所有IP地址都可以; -N:表示创建隧道以后不连接到 ssh服务端,连接之后界面会直接卡住,若你要建立之后并连接ssh服务端操作,可以直接取消本参数; -R:表示remote,远程端口转发; -f:表示在后台运行,注意在后台运行只能通过杀进程的方式结束 9999:localhost:80:这个表示[远程端口9999]:[目标IPlocalhost]:[80]; root@www.test.com -p 22:使用root用户连接www.test.com的ssh服务,ssh端口是22,若你不是22端口则需要修改;
上面命令实现了和 mobaxterm 一样的功能如下:
3、动态端口转发(SOCKS代理)
创建SOCKS代理服务器,该服务器允许跨多个端口进行通信。
无论是本地端口转发还是远程端口转发,都是将某固定主机及其端口映射到本地或远程转发端口上,也就是说,本地或远程转发端口和目标端口所代表的应用层协议是一对一的关系,若需要讲一个聊天软件所有流量代理都交由ssh远程服务器进行中转的话,一个一个的映射软件所需要的端口就比较麻烦,那么我们就可以使用第三种方式动态端口转发,由ssh自动判断不同协议的请求作不同的处理。
语法:
代码语言:javascript复制ssh -g -N -D -f [本地监听端口] [ssh帐号]@[ssh服务IP] -p [ssh服务端口]
举个栗子:
代码语言:javascript复制ssh -g -N -D -f 9999 root@www.test.com -p 22
输入命令之后才会让你输入ssh的连接密码,上面的命令意思是,在本地开启一个socks端口9999进行监听,只要代理这个端口的流量都会被转发到ssh远程服务器上进行通过。
在使用代理的时候需要客户端手动设置,比如QQ、微信、tg都有相应的位置设置代理,请大家自行探索更多好玩的。
上面命令实现了和 mobaxterm 一样的功能如下:
总结
创建隧道时的常用参数及含义如下:
“-L选项”:表示使用本地端口转发创建ssh隧道
“-R选项”:表示使用远程端口转发创建ssh隧道
“-D选项”:表示使用动态端口转发创建ssh隧道
“-N选项”:表示创建隧道以后不连接到 sshServer 端,通常与”-f”选项连用
“-f选项”: 表示在后台运行ssh隧道,通常与”-N”选项连用
“-g选项”:表示ssh隧道对应的转发端口将监听在主机的所有 IP 中,不使用“-g选项”时,转发端口默认只监听在主机的本地回环地址中,“-g选项”表示开启网关模式,远程端口转发中,无法开启网关功能,只能通过修改远程机器的 sshd 配置文件中的 GatewayPorts:on 参数实现绑定所有IP。
1、创建本地端口转发命令参考:
代码语言:javascript复制ssh -g -N -L -f [本地端口]:[远程IP]:[远程端口] [ssh帐号]@[ssh服务IP] -p [ssh服务端口]
2、创建远程端口转发命令参考:
代码语言:javascript复制ssh -g -N -R -f [远程端口]:[目标机器IP]:[目标机器端口] [ssh帐号]@[ssh服务IP] -p [ssh服务端口]
3、创建动态端口转发命令参考:
代码语言:javascript复制ssh -g -N -D -f [本地监听端口] [ssh帐号]@[ssh服务IP] -p [ssh服务端口]
参考文章
SSH隧道:端口转发功能详解 SSH 隧道简明教程 ssh隧道及转发技术应用场景三例 如何配置SSH端口转发 ssh端口转发:ssh隧道
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3vtuwevgbfms4