前言
众所周知,一个公司内部与外部网络之间是由防火墙存在的,防火墙的的存在保证了,企业内部的
安全性。像一些明文传输的协议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的网页:
[ [email protected] ~ ]#curl http://172.18.18.13 curl: (7) Failed connect to 172.18.252.50:80; Connection refused # 被拒绝 [ [email protected] ~ ]#
然后在Host A上建立ssh连接
此时在你用Host A去访问依然不行,我们需要在Host B上做代理配置。这样才能转发数据信息。
[ [email protected] ~ ]#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端口转发与本地
转发的实验中,原理说的多些,实验步骤较少,还望见谅。欢迎阅读~~