利用SSH搭建隧道
SSH 隧道或称SSH端口转发是一种在客户端和服务器机器之间创建加密 SSH 连接的方法,通过该连接可以中继服务端口。
SSH 转发对于传输使用未加密协议(如 VNC 或 FTP)的服务的网络数据、访问受地理限制的内容或绕过中间防火墙非常有用。 基本上,您可以通过安全的 SSH 连接转发任何 TCP 端口并通过隧道传输流量。
SSH 端口转发有三种类型:
- 本地端口转发 - 流量从SSH客户端主机转发到 SSH 服务器主机,然后转发到目标机器端口。本地端口转发主要用于连接到内部网络上的远程服务,例如数据库或VNC服务器。
- 远程端口转发 - 流量从SSH服务器主机转发到SSH客户端主机,然后转发到目标机器端口。远程端口转发主要用于向外部人员提供对内服务的访问权限。
- 动态端口转发 - 创建一个允许跨多端口的SOCKS代理服务器。动态端口转发可用于代理上网的需求中。
本篇文章将介绍如何使用SSH工具搭建本地、远程、动态SSH隧道。
01 本地端口转发
本地(ssh客户端)端口转发允许流量从本地机器上的端口转发到远程(ssh服务端)机器上的端口,然后转发到目标机器上的端口。
在这种转发类型中,ssh客户端监听指定的端口并将请求的流量通过隧道转发到远程ssh服务器指定的端口,然后转发到目标机器的端口。目的机器可以是远程ssh服务器或者是其他机器。
本地端口转发主要用于连接到内部网络上的远程服务,例如数据库或VNC服务器。
在Linux、macOS和其他Unix系统中,使用ssh客户端的 -L 选项来建立本地端口转发命令如下:
$ ssh -L [LOCAL_IP]:LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER
- [LOCAL_IP]LOCAL_PORT - 本机IP地址和端口号。当LOCAL_IP被省略,ssh客户端会绑定在localhost。
- DESTINATION:DESTINATION_PORT - 目的机器的IP或主机名和端口。
- [USER@]@SERVER_IP - 远程SSH用户和服务器IP地址。
你可以使用大于1024的任意端口作为LOCAL_PORT。小于1024的端口号需要root权限启用。如果SSH服务器端口不是22号,则使用 -p 选项来指定。
目标主机名必须对 SSH 服务器解析。
02 远程端口转发
远程端口转发和本地端口转发相反。它允许流量从远程(ssh服务器)机器的端口转发到本地(ssh客户端)机器的端口,然后转发到目标机器上的端口。
在这种转发类型中,ssh服务器监听一个指定端口并将请求流量通过隧道转发到本地ssh客户端的指定端口上,然后转发到目的机器的端口上。目的机器可以是客户端本身或者其他机器。
在Linux、macOS和其他Unix系统中,使用ssh客户端的 -R 选项来建立远程端口转发命令如下:
$ ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER
- [REMOTE:]REMOTE_PORT - 远程ssh服务器的IP和端口号。如果REMOTE留空意味着绑定ssh服务器的所有网络接口。
- DESTINATION:DESTINATION_PORT - 目的机器的IP或主机名和端口。
- [USER@]SERVER_IP - 远程ssh服务器用户和IP地址。
远程端口转发主要用于向外部人员提供对内服务的访问权限。
03 动态端口转发
动态端口转发允许你在本地(ssh客户端)机器扮演一个socks代理客户端。当客户端连接到该端口,流量会被转发到远程(ssh服务器)机器上,然后转发到目标机器的动态端口上。
这种方法中,所有使用socks代理的客户端程序将连接到ssh服务器,然后服务器将流量转发到真实的目的机器上。
在Linux、macOS和其他Unix系统中,使用ssh客户端的 -D 选项来建立动态端口转发命令如下:
$ ssh -D [LOCAL_IP:]LOCAL_PORT [USER@]SSH_SERVER
- [LOCAL_IP:]LOCAL_PORT - 本地机器IP地址和端口号。当LOCAL_IP被省略,ssh客户端绑定在localhost上。
- [USER@]SERVER_IP - 远程ssh用户和服务器IP地址。
动态端口转发可用于代理上网的需求中。
04 Windows下使用putty配置本地端口转发并验证
测试使用VPS代理本地流量去访问httpbin,并验证成功代理,出口IP为vps的地址。
1、本地端口转发模式下需要配置远程ssh服务器的AllowTcpForwarding选项为开启状态:
2、不配置的代理访问http://httpbin.org/ip,可以看到我的出口IP是111.*.*.252:
3、打开putyy,在session中配置VPS地址:
4、在Connection → SSH → Tunnels配置本地端口和目的机器端口,其中IP 52.87.105.151是httpbin解析的地址,点击Add按钮:
5、点击Open按钮,输入VPS用户名密码:
6、访问本地9090端口,验证代理完成,出口IP为VPS地址:
05 Windows下使用putty配置远程端口转发并验证
1、远程端口转发模式下需要配置远程ssh服务器的GatewayPort选项为开启状态:
2、开启本地机器上的web服务(这里使用phpstudy搭建一个测试页面):
3、启动putty,在session选项中输入远程ssh服务器地址和端口:
4、在Connection → SSH → Tunnels选项中配置远程ssh服务器开启的端口和本地监听的端口,并选择Remote模式,点击Add按钮:
5、点击Open按钮,输入远程ssh服务器的用户名密码就好了:
06 Windows下使用putty配置动态端口转发并验证
1、启动putty,在session选项中输入远程ssh服务器地址和端口:
2、在Connection → SSH → Tunnels选项中配置远程ssh服务器开启的端口,并选择Dynamic模式,点击Add按钮:
3、点击Open按钮,输入ssh服务器用户名密码,配置浏览器代理:
4、使用httpbin网站代理搭建情况,出口IP为VPS地址,则搭建生效: