0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SSH隧道端口转发功能详解

马哥Linux运维 来源:博客园骏马金龙 2024-10-24 17:08 次阅读

1.1 ssh安全隧道(一):本地端口转发

如下图,假如host3和host1、host2都同互相通信,但是host1和host2之间不能通信,如何从host1连接上host2?

对于实现ssh连接来说,实现方式很简单,从host1 ssh到host3,再ssh到host2,也就是将host3作为跳板的方式。但是如果不是ssh,而是http的80端口呢?如何让host1能访问host2的80端口?

ee069886-90f6-11ef-a511-92fbcf53809c.png

ssh支持本地端口转发,语法格式为:

ssh -L [local_bind_addr:]local_portremote_port middle_host

以上图为例,实现方式是在host1上执行:

[root@xuexi ~]# ssh -g -L 222280 host3

其中"-L"选项表示本地端口转发,其工作方式为:在本地指定一个由ssh监听的转发端口(2222),将远程主机的端口(host2:80)映射为本地端口(2222),当有主机连接本地映射端口(2222)时,本地ssh就将此端口的数据包转发给中间主机(host3),然后host3再与远程主机的端口(host2:80)通信。

现在就可以通过访问host1的2222端口来达到访问host2:80的目的了。例如:

ee1a8df0-90f6-11ef-a511-92fbcf53809c.png

再来解释下"-g"选项,指定该选项表示允许外界主机连接本地转发端口(2222),如果不指定"-g",则host4将无法通过访问host1:2222达到访问host2:80的目的。甚至,host1自身也不能使用172.16.10.5:2222,而只能使用localhost:2222或127.0.0.1:2222这样的方式达到访问host2:80的目的,之所以如此,是因为本地转发端口默认绑定在回环地址上。可以使用bind_addr来改变转发端口的绑定地址,例如:

[root@xuexi ~]# ssh -L 172.16.10.5host2:80 host3

这样,host1自身就能通过访问172.16.10.5:2222的方式达到访问host2:80的目的。

一般来说,使用转发端口,都建议同时使用"-g"选项,否则将只有自身能访问转发端口。

再来分析下转发端口通信的过程。

ee30081a-90f6-11ef-a511-92fbcf53809c.png

当host4发起172.16.10.5:2222的连接时(即步骤①),数据包的目标地址和端口为"172.16.10.5:2222"。由于host1上ssh已经监听了2222端口,并且知道该端口映射自哪台主机哪个端口,所以将会把该数据包目标地址和端口替换为"172.16.10.3:80",并将此数据包通过转发给host3。当host3收到该数据包时,发现是host1转发过来请求访问host2:80的数据包,所以host3将代为访问host2的80端口。

所以,host1和host3之间的通信方式是SSH协议,这段连接是安全加密的,因此称为"安全隧道",而host3和host2之间通信协议则是HTTP而不是ssh

现在再来考虑下,通过本地端口转发的方式如何实现ssh跳板的功能呢?仍以上图为例:

[root@xuexi ~]# ssh -g -L 2233322 host3]

这样只需使用ssh连上host1的22333端口就等于连接了host2的22端口。

最后,关于端口转发有一个需要注意的问题:ssh命令中带有要执行的命令。考虑了下面的三条在host1上执行的命令的区别。

[root@xuexi ~]# ssh -g -L 2233322 host3
[root@xuexi ~]# ssh -g -L 2233322 host3 "ifconfig"
[root@xuexi ~]# ssh -g -L 2233322 host3 "sleep 10"

第一条命令开启了本地端口转发,且是以登录到host3的方式开启的,所以执行完该命令后,将跳到host3主机上,当退出host3时,端口转发功能将被关闭。另外,host1上之所以要开启端口转发,目的是为了与host2进行通信,而不是跳到host3上,所以应该在ssh命令行上加上"-f"选项让ssh在本机host1上以后台方式提供端口转发功能,而不是跳到host3上来提供端口转发功能。

第二条命令在开启本地转发的时候还指定了要在host3上执行"ifconfig"命令,但是ssh的工作机制是远程命令执行完毕的那一刻,ssh关闭连接,所以此命令开启的本地端口转发功能有效期只有执行ifconfig命令的一瞬间。

第三条命令和第二条命令类似,只不过指定的是睡眠10秒命令,所以此命令开启的本地转发功能有效期只有10秒。

结合上面的分析,开启端口转发功能时,建议让ssh以后台方式提供端口转发功能,且明确指示不要执行任何ssh命令行上的远程命令。即最佳开启方式为:

[root@xuexi ~]# ssh -f -N -g -L 2233322 host3

1.2 ssh安全隧道(二):远程端口转发

ssh除了支持本地端口转发,还支持远程端口转发。顾名思义,远程端口转发表示的是将远程端口的数据转发到本地。

如下图:假如host3是内网主机,它能和host2互相通信,也能和host1通信,但反过来,host1不能和host3通信。这时要让host1访问host3或host2就没办法通过本地端口转发了,因为要在host1上开启本地端口转发,必须要和host3通信请求建立隧道。

ee44cd04-90f6-11ef-a511-92fbcf53809c.png

可以通过在host3上发起远程端口转发来实现,因为host3能和host1通信,host3可以请求在host1和host3之间建立隧道。

语法如下:

ssh -R [bind_addr:]remote1_port:host:port remote1

以上图为例,实现方式是在host3上执行:

[root@xuexi ~]# ssh -R 2233380 host1

这表示host3请求host1上的sshd服务,在host1上建立一个套接字监听22333端口,它是host2端口的映射,当有主机连接host1:22333时,此连接中的数据全部都通过host1和host3之间的安全隧道转发给host3,再由host3向host2的80端口发起访问。由于host3请求开启的转发端口是在远程主机host1上的,所以称为"远程端口转发"。

再考虑下面这条命令所开启的远程转发端口,它是在host3上执行的。

[root@xuexi ~]# ssh -R 2233380 host1

该命令将自身的host3:80映射到host1:22333上,这也能让host1和host2、host3通信,因为隧道是建立在host1:22333<-->host3:80上的。

但是,远程端口转发和本地端口转发最大的一个区别是,远程转发端口是由host1上的sshd服务控制的,默认配置情况下,sshd服务只允许本地开启的远程转发端口(22333)绑定在环回地址(127.0.0.1)上,即使显式指定了bind_addr也无法覆盖。例如:

[root@xuexi ~]# ssh -R *host2:80 host1 

[root@xuexi ~]# netstat -tnlp
Active Internet connections (only servers)
tcp   0   0 0.0.0.0:22        0.0.0.0:*   LISTEN  8405/sshd  
tcp   0   0 127.0.0.1:25      0.0.0.0:*   LISTEN  1422/master
tcp   0   0 127.0.0.1:22333   0.0.0.0:*   LISTEN  8407/sshd  
tcp   0   0 :::22             :::*        LISTEN  8405/sshd  
tcp   0   0 ::1:25            :::*        LISTEN  1422/master
tcp   0   0 ::1:22333         :::*        LISTEN  8407/sshd

要允许本地的远程转发端口绑定在非环回地址上,需要在host1的sshd配置文件中启用"GatewayPorts"项,它的默认值为no。启动该选项后,不给定bind_addr或bind_addr设置为"*"都表示绑定在所有地址上。如下:

[root@xuexi ~]# ssh -g -R *host2:80 host1

[root@xuexi ~]# netstat -tnlp
Active Internet connections (only servers)
tcp   0  0 0.0.0.0:22      0.0.0.0:*   LISTEN  8466/sshd  
tcp   0  0 127.0.0.1:25    0.0.0.0:*   LISTEN  1422/master
tcp   0  0 0.0.0.0:22333   0.0.0.0:*   LISTEN  8468/sshd  
tcp   0  0 :::22           :::*        LISTEN  8466/sshd  
tcp   0  0 ::1:25          :::*        LISTEN  1422/master
tcp   0  0 :::22333        :::*        LISTEN  8468/sshd

和前面的本地转发端口一样,建议的几个选项是:"-g"、"-f"、"-N"。即推荐的命令写法是:

[root@xuexi ~]# ssh -fgN -R 2233380 host1

现在,就可以通过访问host1:22333达到访问host2:80的目的了。如下图所示。

ee4f290c-90f6-11ef-a511-92fbcf53809c.png

1.3 ssh安全隧道(三):动态端口转发(SOCKS代理)

无论是本地端口转发还是远程端口转发,都是将某固定主机及其端口映射到本地或远程转发端口上,例如将host2:80映射到host1:2222。也就是说,本地或远程转发端口和目标端口所代表的应用层协议是一对一的关系,2222端口必须对应的是http的80端口,使用浏览器向host1:2222端口发起http请求当然没问题,但是使用ssh工具向host1:2222发起连接将会被拒绝,因为host2上http服务只能解析http请求,不能解析ssh连接请求。

ssh支持动态端口转发,由ssh来判断发起请求的工具使用的是什么应用层协议,然后根据判断出的协议结果决定目标端口。
以下图为例进行说明,host1处在办公内网,能和host3互相通信,但它无法直接和互联网和host2通信,而host3则可以和host2以及互联网通信。

ee6af24a-90f6-11ef-a511-92fbcf53809c.png

要让host1访问互联网,又能和host2的22端口即ssh服务通信,显然在host1上仅设置一个本地端口转发是不够的,虽然可以设置多个本地转发端口分别映射不同的端口,但这显然比较笨重和麻烦。使用动态端口转发即可。

语法格式为:

ssh -D [bind_addr:]port remote

以上图为例,在host1上执行:

[root@xuexi ~]# ssh -Nfg -D 2222 host3

执行完上面的命令,host1将在本地开启SOCKS4或SOCKS5服务来监听2222端口。只要客户端程序工具(隐含了使用的应用层协议类型)将其自身的代理设置为host1:2222,则该程序所有产生的数据都将转发到host1:2222,再由host1:2222将数据通过隧道转发给host3,最后由host3和互联网或host2上对应客户端工具的应用层协议的端口进行通信。

其实很简单,假如host4使用IE浏览器作为客户端工具,并将IE浏览器的代理设置为host1:2222,由于IE浏览器发起的请求使用的是http协议(此处不考虑其他可能的协议),那么IE浏览器产生的数据都转发到host1:2222,再由host1:2222通过隧道转发给host3,host3能联网,所以host4就实现了联网功能。如下图设置:

ee780ff2-90f6-11ef-a511-92fbcf53809c.png

再比如host4上的QQ客户端也可以设置代理。这样QQ产生的数据都将通过host1:2222转发出去,host1:2222再将QQ的数据转发到host3上,host3知道这些数据使用的协议是oicq,所以host3会去连接腾讯的QQ服务器(oicq服务对应的端口)。

ee8b5d00-90f6-11ef-a511-92fbcf53809c.png

ssh只支持socks4和socks5两种代理,有些客户端工具中需要明确指明代理类型。

和本地、远程端口转发一样,建议的选项是:"-f"、"-N"和"-g"。

由于ssh动态端口转发是ssh客户端的功能,所以不使用ssh命令,使用SecurtCRT、putty等ssh客户端工具都可以实现代理上网。例如,本地主机不能上网,但能和172.16.10.6的SSH服务通信,而172.16.10.6能上网,则可以在本地主机先使用SecurtCRT连接172.16.10.6,再在对应的会话选项上做如下设置,使得本地主机也能上网。(注意:我没说可以FQ啊,好公民不FQ!!!)

ee9fa724-90f6-11ef-a511-92fbcf53809c.png

然后,在本地主机查看下是否监听了SecurtCRT中指定的8888动态转发端口。

eec3da18-90f6-11ef-a511-92fbcf53809c.png

现在,本机所有数据包都通过SecurtCRT所连接的172.16.10.6流向外界。

链接:https://www.cnblogs.com/f-ck-need-u/p/10482832.html

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 主机
    +关注

    关注

    0

    文章

    987

    浏览量

    35091
  • 端口
    +关注

    关注

    4

    文章

    956

    浏览量

    32025
  • SSH
    SSH
    +关注

    关注

    0

    文章

    185

    浏览量

    16311

原文标题:SSH隧道:端口转发功能详解

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ansible 某台机器的ssh端口不是默认端口,如何解决?

    现象:ansible 某台机器的ssh端口不是默认端口
    发表于 11-06 06:56

    端口映射和端口转发的区别?

    端口转发,有时被叫做隧道,是安全壳为网络安全通信使用的一种方法。端口转发转发一个网络
    发表于 12-04 17:31 3.7w次阅读
    <b class='flag-5'>端口</b>映射和<b class='flag-5'>端口</b><b class='flag-5'>转发</b>的区别?

    与Ultra96联网端口转发

    电子发烧友网站提供《与Ultra96联网端口转发.zip》资料免费下载
    发表于 11-28 09:32 0次下载
    与Ultra96联网<b class='flag-5'>端口</b><b class='flag-5'>转发</b>

    SSH第3部分:配置SSH反向隧道以减少暴露的端口

    新软件包或执行其他管理操作。SSH 的一个鲜为人知的功能是能够通过同一通信通道转发其他但不同的网络流量。例如,您可以使用 SSH 隧道加密
    的头像 发表于 01-03 09:45 2928次阅读
    <b class='flag-5'>SSH</b>第3部分:配置<b class='flag-5'>SSH</b>反向<b class='flag-5'>隧道</b>以减少暴露的<b class='flag-5'>端口</b>

    如何修改Linux系统的SSH端口

    SSH 是一种网络协议,用于与 Linux 系统进行远程安全通信。默认情况下,SSH 服务使用端口 22。
    的头像 发表于 03-20 16:46 2447次阅读

    SSH命令详解

    ssh是一种安全的远程登录及传输协议。ssh可用于远程登录、远程文件传输等。ssh是安全的shell。
    的头像 发表于 06-02 10:00 1.7w次阅读
    <b class='flag-5'>SSH</b>命令<b class='flag-5'>详解</b>

    探索物联网HMI的端口转发和NAT功能

    端口转发和NAT功能常用于内网穿透,实现内部网络和外部网络之间的数据传输。本文以内网IP摄像头为例,介绍如何通过虹科物联网HMI的端口转发
    的头像 发表于 07-20 10:00 595次阅读
    探索物联网HMI的<b class='flag-5'>端口</b><b class='flag-5'>转发</b>和NAT<b class='flag-5'>功能</b>

    探索物联网HMI的端口转发和NAT功能

    点击蓝字关注我们前言端口转发和NAT功能常用于内网穿透,实现内部网络和外部网络之间的数据传输,工作人员通过外部网络便可安全访问到内网设备,实现设备的状态监测。接下来小编将为大家介绍支持端口
    的头像 发表于 07-31 22:20 835次阅读
    探索物联网HMI的<b class='flag-5'>端口</b><b class='flag-5'>转发</b>和NAT<b class='flag-5'>功能</b>

    SSH端口号是什么?SSH原理详解分析

    OpenSSH是SSH协议的开源实现,支持在Unix操作系统上运行,最新版本可以在OpenSSH官网下载。目前Windows10已经包含OpenSSH客户端和服务器软件,可在“设置—应用—应用与功能—可选功能”中搜索安装。
    发表于 10-16 16:00 7884次阅读
    <b class='flag-5'>SSH</b><b class='flag-5'>端口</b>号是什么?<b class='flag-5'>SSH</b>原理<b class='flag-5'>详解</b>分析

    SSH端口号是什么?SSH是如何工作的?

    的安全隐患。随着人们对网络安全的重视,这些方式已经慢慢不被接受。SSH协议通过对网络数据进行加密和验证,在不安全的网络环境中提供了安全的登录和其他安全网络服务。作为Telnet和其他不安全远程shell协议的安全替代方案,目前SSH协议已经被全世界广泛使用,大多数设备都支
    的头像 发表于 11-10 10:06 2679次阅读
    <b class='flag-5'>SSH</b><b class='flag-5'>端口</b>号是什么?<b class='flag-5'>SSH</b>是如何工作的?

    端口转发端口映射的区别 端口映射和端口转发的各自意义?

    端口转发端口映射的区别 端口映射和端口转发的各自意义?
    的头像 发表于 11-22 17:41 5032次阅读

    Ubuntu修改SSH默认端口指南

    修改SSH(Secure Shell)默认端口是一种增加系统安全性的方法,因为大多数攻击都是针对默认端口22进行的。以下是在Ubuntu系统上修改SSH默认
    的头像 发表于 12-21 17:27 1509次阅读

    宏集干货丨探索物联网HMI的端口转发和NAT功能

    端口转发和NAT功能常用于内网穿透,实现内部网络和外部网络之间的数据传输,工作人员通过外部网络便可安全访问到内网设备,实现设备的状态监测。接下来小编将为大家介绍支持端口
    的头像 发表于 01-17 11:01 475次阅读
    宏集干货丨探索物联网HMI的<b class='flag-5'>端口</b><b class='flag-5'>转发</b>和NAT<b class='flag-5'>功能</b>

    路由器端口转发怎么设置

    )技术,它允许将路由器的一个或多个外部端口映射到内网中的一个设备或服务上。这样,外部设备就可以通过这些端口访问内网中的设备或服务,实现远程访问、远程控制等功能。 1.2 路由器端口
    的头像 发表于 07-09 11:33 7091次阅读

    什么是反向SSH?如何创建反向SSH隧道

    反向 SSH 是一种可用于从外部世界访问系统(位于防火墙后面)的技术。
    的头像 发表于 08-05 15:16 652次阅读