且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

SSH隧道tunneling端口转发

更新时间:2022-09-30 13:51:22

   SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还能够将其他 TCP 端口的网络数据通过SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为 SSH 为其他TCP 链接提供了一个安全的通道来进行传输而得名。

例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH的连接,也能够通过将 TCP 端口转发来使用 SSH 进行通讯


SSH 端口转发能够提供两大功能:

 加密 SSH Client 端至 SSH Server 端之间的通讯数据

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


现在来模拟一场景来演示过程

SSH隧道tunneling端口转发

DEMO公司在内部有一台公司WEB服务器C,因为上面的内容是公司内部相关的,因此,只允许通过内部的B机器(代理服务器)进行访问。如果员工A想访问这台WEB服务器,只能经过防火墙认证过滤后进入内网B进行访问。


C机器上使用iptables进行策略部署

#iptables -A INPUT -s 192.168.4.101 -j ACCEPT  

#iptables -A INPUT -s 192.168.4.100 -j REJECT

#iptables -vnL

Chain INPUT (policy ACCEPT 53 packets, 4347 bytes)

pkts bytes target     prot opt in     out     source               destination

0     0 ACCEPT     all  --  *      *       192.168.4.101        0.0.0.0/0

0     0 REJECT     all  --  *      *       192.168.4.100        0.0.0.0/0           reject-with icmp-port-unreachable


验证

A上面直接访问C机器,无法连接

#curl http://192.168.4.113

curl: (7) couldn't connect to host


B上面直接访问C机器,可以正常打开网页服务

#curl http://192.168.4.113

<h1>Apache 2 Test Page powered by CentOS</h1>


使用ssh隧道技术进行解决此问题


方案一

本地转发

语法格式:

-L localport:remotehost:remotehostport sshserver

-L 本地端口:远程主机地址:远程主机开放端口 中转主机地址

 选项:

-f 后台启用

-N 不打开远程shell,处于等待状态

-g 表示ssh隧道对应的转发端口将监听在主机的所有IP中,不使用"-g选项"时,转发端口默认只监听在主机的本地回环地址中,"-g"表示开启网关模式,远程端口转发中,无法开启网关功能


  1. A上面设置本地端口转发


#ssh -L 1314:192.168.4.113:80 192.168.4.101 -Nf

当访问本机的1314的端口时,被加密后转发到192.168.4.101的ssh服务,再解密被转发到192.168.4.113:80

#ss -nl

LISTEN     0      128                                       127.0.0.1:1314


在B机器上可以看到连接了                                          *:*

#ss -nt

ESTAB      0      0                        192.168.4.101:22                                   192.168.4.100:42678


2.在A上进行访问网站

#curl http://127.0.0.1:1314

<h1>Apache 2 Test Page powered by CentOS</h1>

成功返回网页内容


3.在C机器上面看到的是B的连接

#ss -nt

ESTAB 0      1                              ::ffff:192.168.4.113:80                            192.168.4.101:60500


在这个场景里,A是ssh客户端,B是ssh服务器端



方案二

远程转发

语法格式:

-R sshserverport:remotehost:remotehostport sshserver

-R 本地端口:远程主机地址:远程主机开放端口 中转主机地址

 选项:

-f 后台启用

-N 不打开远程shell,处于等待状态

-g 表示ssh隧道对应的转发端口将监听在主机的所有IP中,不使用"-g选项"时,转发端口默认只监听在主机的本地回环地址中,"-g"表示开启网关模式,远程端口转发中,无法开启网关功能


1.在B上面设置远程端口转发

#ssl -R 1314:192.168.4.113:80 192.168.4.100 -Nf

-R让192.168.4.100侦听1314端口的访问,如有访问,就加密后通过ssh服务转发请求到本机192.168.4.101ssh客户端,再由本机解密后转发到192.168.4.113:80


A上面能看到B访问A的22端口

#ss -nt

ESTAB      0      0                                     192.168.4.100:22                                 192.168.4.101:45830


2.在A上进行访问网站

#curl http://127.0.0.1:1314

<h1>Apache 2 Test Page powered by CentOS</h1>

成功返回网页内容


3.在C机器上面看到的是B的连接

#ss -nt

FIN-WAIT-1 0      1                              ::ffff:192.168.4.113:80                        ::ffff:192.168.4.101:50934


在这个场景里,B是ssh客户端,A是ssh服务器端


动态端口转发

作为一名技术人员,翻阅英文原版资料是必须的。有些情况确实是需要向外界查找一些学习资料。

SSH隧道tunneling端口转发


语法:

ssh -D 1080 远程主机地址

当用浏览器访问internet时,本机的XXX端口做为代理服务器,firefox的访问请求被转发到sshserver上,由sshserver替之访问internet


1.在A上面启用动态端口转发至B机器上

#ssh -D 1888 192.168.4.101 -Nf


2.在A机器上面指定使用socks5 访问

#curl --socks5 127.0.0.1:1888 http://192.168.4.113

<img src="./google.png"></img>


通过Firefox访问。如果是Windows机器,可以考虑安装一个openssh for windows 3.81p,2.5MB

https://sourceforge.net/projects/sshwindows

SSH隧道tunneling端口转发SSH隧道tunneling端口转发


本文转自 ljpwinxp 51CTO博客,原文链接:http://blog.51cto.com/191226139/2061833