码迷,mamicode.com
首页 > 其他好文 > 详细

如何巧用SSH突破防火墙

时间:2017-09-13 17:24:33      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:客户   use   查看   put   blank   虚拟机   功能   抓取   http   

前言


        众所周知,一个公司内部与外部网络之间是由防火墙存在的,防火墙的的存在保证了,企业内部的

安全性。像一些明文传输的协议telnet或者一些安全性不是那么高的协议icmp,走这些协议的数据时 极

度不安全的,在防火墙规则中都是明令禁止的,有时我们由于业务的 需求,需要在外网与内网传输一些

像telnet这样的流量,而我们又没有权利去要求相关的部门随意修改防火墙策略。此时SSH协议便可助你

突破防火墙的障碍,成功完成数据传输。


ssh工作原理


        SSH 会自动加密和解密所有SSH客户端与服务端之间的网络数据。但是,SSH还能够将其他TCP端

口的网络数据通过SSH链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做"隧道"

(tunneling),这是因为SSH为其他TCP链接提供了一个安全的通道来进行传输而得名。例如,

Telnet,SMTP,LDAP这些TCP应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。

而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许SSH的连接,也能够通过

将TCP端口转发来使用SSH进行通讯。


ssh本地转发


1、原理图

技术分享        图解:Host A以Host B为跳板机,通过ssh协议先打通自己与局域网的“隧道”,然后以Host B

的为telnet client端,建立与Host C的telnet连接,最终实现Host A能够与目标主机Host C之间实现

telnet流量创输。而在外围有ssh协议为这些telnet流量“保驾护航”,我们在也不用担心自己的数据被

截获。

2、实现ssh本地转发

    1)准备阶段

        准备3台虚拟机,可以使CentOS系列,也可以是RHEL系列。为了实验能够顺利实现,我们手动关

闭防火墙(iptables -F)和SELinux(setenforce 0)当然了这仅仅是为了实验的需要,在生产场景中实

不允许的。然后确保Host C主机都有telnet server服务,而Host B具有ssh server功能。通过rpm -q 来

查看服务是否安装。

技术分享     2)建立连接

        首先:测试Host A能否使用telnet与Host C建立连接,如果能,那么在Host C上使用防火墙规则禁

用Host A在访问(iptables -A INPUT -s HostA_ip -j REJECT)

技术分享

建立ssh隧道,实现防火墙的突破,进入LAN。

技术分享

上图中,使用命令ssh -L实现隧道的建立。4000表示我们随机指定开启的端口,确保该端口是不被

任何服务使用。172.18.253.159表示目标主机(Host C)的的地址;23表示要连接目标主机的相应服务

端口,如果是telnet服务则是23,smtp则监听在25。-N表示不打开远程shell,处于等待状态,-f表示后

台启用。172.18.18.13则表示“跳板机”的地址,在本例中即Host B的IP地址。

        上例中,我们用过ssh -tn查看发现,我们其实不是与目录主机建立了连接,而是与Host B建立了连

接,这就说明,该隧道已经建立好了。其次:我们再去查看Host C机器的连接情况,发现,并没有任何

主机与自己建立连接。

技术分享

        最后:实现telnet流量传输。在Host A主机是哪个使用telnet去连接目标主机Host B,出现下图所

示的内容,则说明telnet链路已通,然后连接进入目标主机Host C,使用ss -tn 查看,你会发现并不是

Host A与自己建立的telnet连接,而是“跳板机”Host B。

技术分享

建立telnet连接之后我们在来看看Host A上的连接情况。ss -tn

技术分享

而Host B在收到Host A的telnet流量后,自己充当telnet客户端去连接Host C的telnet服务气端。

到此,基于SSH的本地转发就实现了。


ssh端口转发


1、应用场景

        ssh基于端口转发的应用场景一般是这样:当我们在企业内部想要访问外部的某些站点,但是有防

火墙禁用访问站点的端口,例如httpd服务的80端口,这样我们便不能访问外部网站。此时我们就可以使

用ssh端口转发的方法实现,访问外部站点。

2、原理图

技术分享

        上图中,由于防火墙的原因,Host A 并不能访问Host C站点,此时我们可以在外部找一个主机

Host B,以Host B 为代理服务器,这样,Host A 通过ssh协议突破防火墙,访问代理服务器,在由代理

服务器将Host A的访问请求发送给Host C服务器,获取相应的信息(例如,网页信息),然后在回传给

客户端Host A。

3、实例

    1)准备阶段

        准备3台主机,Host A 、HostB、Host C,用HostA 客户端,Host C作为服务器端,而Host B作

为代理服务器agent。实验需求,将Host B的防火墙关闭,关闭所有主机的SELinux功能。

    2)方案实现

模拟防火墙,我们在Host C上设置防火墙规则,拒绝Host A 的任何请求 :

技术分享

在主机Host A上试着去抓取Host C的网页:

[ root@vinsent ~ ]#curl http://172.18.18.13
curl: (7) Failed connect to 172.18.252.50:80; Connection refused      # 被拒绝
[ root@vinsent ~ ]#

然后在Host A上建立ssh连接

技术分享

此时在你用Host A去访问依然不行,我们需要在Host B上做代理配置。这样才能转发数据信息。

[ root@vinsent ~ ]#curl --socks5 127.0.0.1 
<h1>I love linux...</h1>         # 成功抓取到网页


ssh远程转发


1、原理图

技术分享

        原理与ssh本地转发大体相同,这里就不放实验过程了,只是ssh的服务器端与客户端的角色发生了

改变,由于,在一个企业内部,我们想要从内向外访问某端口,防火墙是没有限制的,但是想要从外向

里访问就很困难。ssh远程转发的就是通过,局域网内部的主机充当ssh客户端与LAN外的主机建立连

接,从而打通外部与内部的通道。此时有人可能会有疑问,不还是进步来么?其实不然,防火墙也是有

链路记忆功能的,通过出去的通道在回来时,防火墙是不会做限制的。

2、数据过程

        首先,Host B以ssh客户端的身份访问外部的主机Host A (此时Host A充当ssh服务器)建立隧

道,然后,Host A充当telnet客户端向Host B发送telnet流量。当收到Host A发来数据之后,Host B解

封装,然后充当telnet客户端的身份,建立与Host C的连接,从而将数据安全的传输至目标主机。

3、实现命令

    在Host B上执行:ssh –R 9527:ip_HostC:23 –Nf ip_HostA 建立隧道,端口9527是在Host A上打开的

    在Host A上执行:telnet 127.0.0.1 9527


总结


本篇详细了介绍了基于SSH“巧妙”的突破防火墙的方法,包括ssh端口转发,本地转发以及远程转

发,都有各自的使用场景。但本文也存在很多不足,有许多地方讲述的不够详细,在ssh端口转发与本地

转发的实验中,原理说的多些,实验步骤较少,还望见谅。欢迎阅读~~

本文出自 “vinsent” 博客,请务必保留此出处http://vinsent.blog.51cto.com/13116656/1964953

如何巧用SSH突破防火墙

标签:客户   use   查看   put   blank   虚拟机   功能   抓取   http   

原文地址:http://vinsent.blog.51cto.com/13116656/1964953

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!