SSH的三种端口转发(Port forwarding)/ 隧道协议概要

陪她去流浪 桃子 编辑 阅读次数:35363

用SSH有一段时间了,自认为对ssh的操作还是有一定的了解。而今天我要介绍的是ssh的三种端口转发(隧道协议、Tunnel、Port forwarding)功能的使用与它们的使用场合。

为什么要用ssh的端口转发功能,我想大家一定明白(不明白也无所谓,既然来到了这里,你肯定是想把它弄明白的!)。一来是为了安全(数据加密传输);二来是为了突破(穿越)某些防火墙对某些主机的访问限制。

据我所知,SSH一共提供了 3 种端口转发,分别是本地转发(-L参数)远程转发(-R参数)动态转发(-D参数)。接下来我就一一介绍这几种不同的转发方式的使用。我尽量简明扼要地叙述主题重点,让人一看就学会(回忆起)该如何操作。

本文用到的一些“术语”和约定

既然提到转发,就应该明白:这是三台主机之间要合作干的事。不然为何不两台主机直连,而要通过第三者转发?

本地主机:形式为IP或域名,你当前正在使用的这台机器;

远程主机:形式与本地主机一样。这里的“远程”并不是指实际的距离有多远,准确地说是“另一台”;

本地转发

本地转发,顾名思义(有点)就是本地主机端口通过待登录主机端口转发到远程主机端口上去。

本地转发通过参数 -L 指定,格式:-L [本地主机:]本地主机端口:远程主机:远程主机端口。加上ssh待登录主机,这里就有了三台主机。

举例:ssh -L 50000:www.google.com:80 user@host。例中本地主机远程主机待登录主机分别用颜色红绿蓝标识。

当成功执行上面的命令之后,访问本地的50000端口,就等同于访问 www.google.com 的 80 端口。但和直接访问有着本质的区别:这次是通过登录主机来安全转发数据的,没有人知道你和远程主机之间传输了何种数据。就算你不能和远程主机建立连接(而登录主机能访问),那就能突破(绕过)(防火墙的)限制。

但本例其实举得不够好。就算你能访问 www.google.com,你却依然不能其它主机,甚至是 google域 的另一台主机,比如 plus.google.com。想要更全面的端口转发功能,还需动态转发

远程转发

远程转发是指登录主机端口通过本地主机端口转发到远程主机

远程转发通过参数 -R 指定,格式:-R [登录主机:]登录主机端口:远程主机:远程主机端口

举例:ssh -R 0.0.0.0:8080:localhost:80 user@host

当成功执行上面的命令之后,访问登录主机的 8080 端口就相当于访问 localhost:80!

不要小看这个例子,它可是有相当有用。我书读得多,不会骗你 :-)

设想这样一种情况(其实这种情况太普遍了):你在本机开发了一个web应用,想拿给别人测试,但现在你却处在内网,外网是无法直接访问内网的主机的,怎么办!?很多人可能会说,找台有公网IP的主机,重新部署一下就行了。这样可行,但太麻烦。然而自从你了解了ssh的远程转发之后,一切都变得简单了。只需在本地主机上执行一下上面例子的命令即可实现外网访问内网的web应用,相信我,我经常就这样干,屡试不爽。这简直是太好了,awesome! 让你从此对ssh爱不释手。

动态转发

相对于本地转发和远程转发的单一端口转发模式而言,动态转发有点更加强劲的端口转发功能,即是无需固定指定被访问目标主机的端口号。这个端口号需要在本地通过协议指定,该协议就是简单、安全、实用的 SOCKS 协议。FQ(你懂的)就靠她了!

动态转发通过参数 -D 指定,格式:-D [本地主机:]本地主机端口。相对于前两个来说,动态转发无需再指定远程主机及其端口。它们由通过 SOCKS协议 连接到本地主机端口的那个主机(peer,比如最常见的浏览器)指定(此属协议内容,无需深究)。

举例:ssh -D 50000 user@host

当成功执行上面这个命令后。通过协议告诉你要访问的远程主机及端口,然后你与目标主机之间的数据就通过登录主机安全地传输了。

最常见的用途:FQ(大家都懂的)。在浏览器中设置代理类型为 SOCKS(5),主机及端口:127.0.0.1:50000。然后 gg/ytb/tt/fb 等就一丝不挂地摆在眼前了!

标签:ssh · 端口转发 · 代理

文章评论 14 发表评论 登出
  1. plh http://pipk.top
    hahah, shopee 面试被刷
    1. plh http://pipk.top
      ? ,居然是我居然知道shopee
      1. 桃子
        这这这这这……这就很尴尬了???明年再来
    2. v
      第一种可以用了转发特定端口 比如MySQL
      1. 桃子
        嗯。不过ssh纯tcp转发还是不太稳定,kcp靠谱一些[笑哭]
      2. javon http://blog.csdn.net
        很不错,忍不住转载了,哈哈 http://blog.csdn.net/javon_hzw/article/details/77362172
        1. 桃子
          哈哈,多谢支持。 我发现文章写了几年了,该更新下了,人太懒[笑哭]
        2. Lenhoon
          好久没看到这么用心的博客了,很赞 但是测试时很多时候都是端口22:Connection refused! 还是动态转发时很多时候都要去找代理地址,但是一般的代理地址都没有user名,所以使用动态转发时大多时候都是已知一台可以访问墙外地址的主机的用户才能去连ssh吧
          1. 女孩不哭
            谢谢~ 能用SSH需要你知道登录主机的一个用户名+密码,而且此用户名能够登录(而不仅是作其它作用使用)。我使用的时候都是拿的我自己的主机做的测试。 连接被拒绝的话应该是端口改了。
          2. chris http://www.keeptalk.club
            好, 顶 ,赞! 只是想测试下评论功能。。。
            1. 女孩不哭
              测试完毕 :-)
              1. chris http://www.keeptalk.club
                看完这篇文章,远程转发 还是没整明白。。。
                1. 女孩不哭
                  参数:ssh -R 远程主机 : 目标主机 登录主机 1. 本地主机 ---------> 远程主机(连接) 2. 其它人访问 ---------> 远程主机(访问) 3. 远程主机 ---------> 本地主机(传递数据) 4. 本地主机访问 ---------> 目标主机(访问) 这篇文章还有待更新。 需要加几张图片,最能说明问题。
                  1. chris http://www.keeptalk.club
                    其实问了别人,弄懂了。 当然,如果有图,那是最好的,哈哈
            还没有用户发表过评论,我要发表评论
            编辑评论