SSH隧道与端口转发及

SSH隧道与端⼝转发及内⽹穿透
SSH隧道与端⼝转发及内⽹穿透
⼤家都知道SSH是⼀种安全的传输协议,⽤在连接服务器上⽐较多。不过其实除了这个功能,它的隧道转发功能更是吸引⼈。下⾯是个⼈根据⾃⼰的需求以及在⽹上查的资料配合⾃⼰的实际操作所得到的⼀些⼼得。
⾸先,认识下这三个⾮常强⼤的命令:
ssh -C -f -N -g -L listen_port:DST_Host:DST_port user@Tunnel_Host
ssh -C -f -N -g -R listen_port:DST_Host:DST_port user@Tunnel_Host
ssh -C -f -N -g -D listen_port user@Tunnel_Host
相关参数的解释:
-f Fork into background after authentication.
后台认证⽤户/密码,通常和-N连⽤,不⽤登录到远程主机。
-L port:host:hostport
将本地机(客户机)的某个端⼝转发到远端指定机器的指定端⼝. ⼯作原理是这样的, 本地机器上分配了⼀个 socket 侦听 port 端⼝, ⼀旦这个端⼝上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端⼝建⽴连接. 可以在配置⽂件中指定端⼝的转发.只有 root 才能转发特权端⼝. IPv6 地址⽤另⼀种格式说明: port/host/hostport
-R port:host:hostport
将远程主机(服务器)的某个端⼝转发到本地端指定机器的指定端⼝. ⼯作原理是这样的, 远程主机上分配了⼀个 socket 侦听 port 端⼝,⼀旦这个端⼝上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端⼝建⽴连接. 可以在配置⽂件中指定端⼝的转发. 只有⽤ root 登录远程主机才能转发特权端⼝. IPv6 地址⽤另⼀种格式说明: port/host/hostport
-D port
指定⼀个本地机器 “动态的’’ 应⽤程序端⼝转发. ⼯作原理是这样的, 本地机器上分配了⼀个 socket 侦听 port 端⼝, ⼀旦这个端⼝上有了连接,该连接就经过安全通道转发出去, 根据应⽤程序的协议可以判断出远程主机将和哪⾥连接. ⽬前⽀持 SOCKS4 协议, 将充当 SOCKS4 服务器.只有 root 才能转发特权端⼝. 可以在配置⽂件中指定动态端⼝的转发.
-C Enable compression.
压缩数据传输。
-N Do not execute a shell or command.
不执⾏脚本或命令,通常与-f连⽤。
-g Allow remote hosts to connect to forwarded ports.
在-L/-R/-D参数中,允许远程主机连接到建⽴的转发的端⼝,如果不加这个参数,只允许本地主机建⽴连接。注:这个参数我在实践中似乎始终不起作⽤。
在我们计划建⽴⼀个本地SSH隧道之前,我们必须清楚下⾯这些数据:
1. 中间服务器d的IP地址
2. 要访问服务器c的IP地址
3. 要访问服务器c的端⼝
现在,我们把上⾯这张图变得具体⼀些,给这些机器加上IP地址。并且根据下⾯这张图列出我们的计划:
1. 需要访问234.234.234.234的FTP服务,也就是端⼝21
2. 中间服务器是12
3.123.123.123
现在我们使⽤下⾯这条命令来达成我们的⽬的(192.168.0.100上执⾏)
1.ssh -N -f  -L    2121:234.234.234.234:21    123.123.123.123
2.ftp://localhost:2121        # 现在访问本地2121端⼝,就能连接234.234.234.234的21端⼝了
这⾥我们⽤到了SSH客户端的三个参数,下⾯我们⼀⼀做出解释:
-N 告诉SSH客户端,这个连接不需要执⾏任何命令。仅仅做端⼝转发
-f 告诉SSH客户端在后台运⾏
-L 做本地映射端⼝,被冒号分割的三个部分含义分别是
需要使⽤的本地端⼝号
需要访问的⽬标机器IP地址(IP: 234.234.234.234)
自制自慰器需要访问的⽬标机器端⼝(端⼝: 21)
最后⼀个参数是我们⽤来建⽴隧道的中间机器的IP地址(IP: 123.123.123.123)
我们再重复⼀下-L参数的⾏为。-L X:Y:Z的含义是,将IP为Y的机器的Z端⼝通过中间服务器映射到本地机器的X端⼝。
在这条命令成功执⾏之后,我们已经具有绕过公司防⽕墙的能⼒,并且成功访问到了我们喜欢的⼀个FTP服务器了。
如何建⽴远程SSH隧道
通过建⽴本地SSH隧道,我们成功地绕过防⽕墙开始下载FTP上的资源了。那么当我们在家⾥的时候想要察看下载进度怎么办呢?⼤多数公司的⽹络是通过路由器接⼊互联⽹的,公司内部的机器不会直接与互联⽹连接,也就是不能通过互联⽹直接访问。通过线路D-B-A访问公司⾥的机器a便是不可能的。也许你已经注意到了,虽然D-B-A这个⽅向的连接不通,但是A-B-D这个⽅向的连接是没有问题的。那么,我们能
头笼
否利⽤⼀条已经连接好的A-B-D⽅向的连接来完成D-B-A⽅向的访问呢?答案是肯定的,这就是远程SSH隧道的⽤途。
与本地SSH⼀样,我们在建⽴远程SSH隧道之前要清楚下⾯⼏个参数:
需要访问内部机器的远程机器的IP地址(这⾥是123.123.123.123)
需要让远程机器能访问的内部机器的IP地址(这⾥因为是想把本机映射出去,因此IP是127.0.0.1)
需要让远程机器能访问的内部机器的端⼝号(端⼝:22)
在清楚了上⾯的参数后,我们使⽤下⾯的命令来建⽴⼀个远程SSH隧道
1.ssh -N -f -R 2222:127.0.0.1:22      123.123.123.123
现在,在IP是123.123.123.123的机器上我们⽤下⾯的命令就可以登陆公司的IP是192.168.0.100的机器了。
1.ssh -p 2222 localhost
-N,-f 这两个参数我们已经在本地SSH隧道中介绍过了。我们现在重点说说参数-R。该参数的三个部
分的含义分别是:远程机器使⽤的端⼝(2222)
需要映射的内部机器的IP地址(127.0.0.1)
需要映射的内部机器的端⼝(22)
例如:-R X:Y:Z 就是把我们内部的Y机器的Z端⼝映射到远程机器的X端⼝上。
SSH端⼝转发的好处:
1. 利⽤SSH通道天然的加密特性
2. 通过具备访问权限的第三者,突破防⽕墙对⾃⼰的限制,或者隐⾝
⾓⾊定义:
A. 本地服务器,想通过中间服务器B间接访问⽬标服务器C
B. 中间服务器,类似于代理,A以B的名义去访问C
C. ⽬标服务器,C看到的都是中间服务器B在访问⾃⼰
1. 本地端⼝转发
绝缘软母排
命令:
ssh -Nf -L [local_A_address]:local_A_port:target_C_server:target_C_port via_B_server
参数:
-N,不执⾏命令
-f,后台执⾏
-L,local本地端⼝转发
local_A_address:
127.0.0.1 - 默认,只能本机使⽤这个端⼝转发
也可以是本机的IP地址,同时其他⼈可以使⽤这个IP来使⽤这个端⼝转发
via_B_server:中间服务器
应⽤:
A---能访问------>B-------能访问------>C
A---不能访问----------------------------->C
A---通过本机端⼝,以B的名义访问-->C
关闭:
直接kill -9 建⽴的SSH连接,下同
2. 远程端⼝转发
命令:
ssh -Nf -R [local_A_address]:local_A_port:target_C_server:target_C_port local_A_address
参数:
-R,remote,远程端⼝转发
local_A_address,这个地址为A的IP
应⽤:
环境和⽬的与本地端⼝转发是⼀样的,这⾥只是不在本地服务器A上执⾏命令,⽽是在中间服务器B上执⾏;
为什么不直接在服务器A⾃⼰⾝上执⾏命令呢?这个场景有别于本地端⼝转发的地⽅在于A不能主动连接B但反之可以,⽐如A在外⽹,B在内⽹;
⽽A去访问的时候,同样都是通过⾃⼰的IP和端⼝,同样⾸先建⽴AB之间的SSH通道,以服务器B的名义来访问⽬标服务器C。
3. 动态端⼝转发
命令:
ssh -Nf -D [local_A_address]:local_A_port via_B_server
参数:
-
D,dynamic,动态端⼝转发
应⽤:
本地和远程端⼝转发,都限定了⽬标服务器以及⽬标服务器的端⼝;
⽽动态端⼝转发,A把B作为了⾃⼰的全权代理,不限定⽬标服务器及其端⼝;
这⾥要求在A上,做下代理设置,⽐如浏览器的代理设定为⾃⼰的IP:PORT;
本地端⼝转发和远程端⼝转发,其实都可看着是动态端⼝转发(代理)的⼦集;
三者和⼀般代理的⽬的和场景都⼀致,区别在于这⾥⾃⼰A和代理服务器B之前的所有连接都是基于加密的SSH。
三、建⽴SSH隧道的⼏个技巧
⾃动重连
  隧道可能因为某些原因断开,例如:机器重启,长时间没有数据通信⽽被路由器切断等等。因此我们可以⽤程序控制隧道的重新连接,例如⼀个简单的循环或者使⽤  . 不管⽤哪种⽅法,重连时都应避
免因输⼊密码⽽卡死程序。关于如何安全的避免输⼊密码的⽅法,请参考我的。这⾥请注意,如果通过其他程序控制隧道连接,应当避免将SSH客户端放到后台执⾏,也就是去掉-f参数。
保持长时间连接
  有些路由器会把长时间没有通信的连接断开。SSH客户端的TCPKeepAlive选项可以避免这个问题的发⽣,默认情况下它是被开启的。如果它被关闭了,可以在ssh的命令上加上-o TCPKeepAlive=yes来开启。
另⼀种⽅法是,去掉-N参数,加⼊⼀个定期能产⽣输出的命令。例如: top或者vmstat。下⾯给出⼀个这种⽅法的例⼦:ssh -R 2222:localhost:22123.123.123.123"vmstat 30"
检查隧道状态
连杆机会  有些时候隧道会因为⼀些原因通信不畅⽽卡死,例如:由于传输数据量太⼤,被路由器带⼊stalled状态。这种时候,往往SSH客户端并不退出,⽽是卡死在那⾥。⼀种应对⽅法是,使⽤SSH客户端的ServerAliveInterval和ServerAliveCountMax选项。 ServerAliveInterval会在隧道⽆通信后的⼀段设置好的时间后发送⼀个请求给服务器要求服务器响应。如果服务器在 ServerAliveCountMax次请求后都没能响应,那么SSH客户端就⾃动断开连接并退出,将控制权交给你的监控程序。这两个选项的设置
⽅法分别是在ssh时加⼊-o ServerAliveInterval=n和-o ServerAliveCountMax=m。其中n, m可以⾃⾏定义。
如何将端⼝绑定到外部地址上
  使⽤上⾯的⽅法,映射的端⼝只能绑定在127.0.0.1这个接⼝上。也就是说,只能被本机⾃⼰访问到。如何才能让其他机器访问这个端⼝呢?我们可以把这个映射的端⼝绑定在0.0.0.0的接⼝上,⽅法是加上参数-b 0.0.0.0。同时还需要打开SSH服务器端的⼀个选项-GatewayPorts。默认情况下它应当是被打开的。如果被关闭的话,可以在/etc /sshd_config中修改GatewayPorts no为GatewayPorts yes来打开它。
如何寻中间服务器
如果你家⾥使⽤ADSL上⽹,多半你会⽐较幸运。⼀般的ADSL(例如的ADSL)都是有互联⽹地址的。你只需要在家⾥的路由器上⼀台装有OpenSSH server机器的SSH端⼝映射出去即可。同时⼀些提供SSH访问的虚拟主机也可以⽤于这⼀⽤途。例如:或者  .
四、通过SSH隧道建⽴SOCKS服务器
如果我们需要借助⼀台中间服务器访问很多资源,⼀个个映射显然不是⾼明的办法(事实上,⾼明确
实没有⽤这个⽅法)。幸好,SSH客户端为我们提供了通过SSH隧道建⽴SOCKS服务器的功能。
通过下⾯的命令我们可以建⽴⼀个通过123.123.123.123的SOCKS服务器。
ssh -N -f -D 1080123.123.123 # 将端⼝绑定在127.0.0.1上
ssh -N -f -D 0.0.0.0:1080123.123.123.123 # 将端⼝绑定在0.0.0.0上机械制图标题栏
通过SSH建⽴的SOCKS服务器使⽤的是SOCKS5协议,在为应⽤程序设置SOCKS代理的时候要特别注意。
五、总结
⾄此,我们已经对如何利⽤SSH隧道有⼀个基本的认识了。现在,⽂章开始时的那些问题应该迎刃⽽解了吧。这⾥要特别说⼀下,由于SSH隧道也使⽤了SSH加密协议,因此是不会被防⽕墙上的内容过滤器监控到的。也就是说⼀切在隧道中传输的数据都是被加密的。当然,离开隧道后的数据还是会保持⾃⼰原有的样⼦,没有加密的数据还是会被后续的路由设备监控到。
PS:编者另注
  在⼤多数情况下,我们建⽴ssh隧道的时候,往往是想通过⼀台公⽹的主机或者是⼤家都可以访问的主机做跳转机,来访问内部或者外部不能直接访问的机器。所以⼀般像这种情况下,请将跳转机中的ssh服务器中的GatewayPorts设为yes
  1.建⽴本地的ssh隧道时,可以指定本地主机的地址,如下:
ssh -Nf -L 192.168.0.100:2121:234.234.234.234:21123.123.123.123
  那么本地局域⽹的任何机器访问192.168.0.100:2121都会⾃动被映射到234.234.234.234:21
  2.建⽴远程的ssh隧道时,可以指定公⽹的主机地址,不过⼀般情况是要访问内⽹的主机,所以这条命令应该在任何⼀台内⽹主机上执⾏,⽐如在192.168.0.102的主机上运⾏:
ssh -Nf -R 123.123.123.123:2222:192.168.0.100:22123.123.123.123
只要在局域⽹⾥192.168.0.102可以直接连接内⽹主机192.168.0.100,且192.168.0.102可以直接与公⽹主机123.123.123.123建⽴ssh连接。那么任何外⽹主机通过访问公⽹主机123.123.123.123:2222就会被连接到192.168.0.100:22,从⽽可以完成外⽹穿越NAT到内⽹的访问,⽽不需要在内⽹⽹关和路由器上做任何操作。
  另外,你也可以通过Xshell、Putty等⼯具来实现主机与本地windows的端⼝转发、socket代理,还有⼀些像ProxyChains ⼯具的使⽤。
窑链

本文发布于:2024-09-22 08:32:42,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/159932.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:机器   访问   服务器   隧道   连接
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议