前段时间曾经看到一个新闻,说某地泄漏了大量的敏感信息。一个可能的泄漏源头是,因某工作人员在使用ES搭建大数据搜索系统时,把数据备份在云上,数据也没删除,然后在博客上分享如何把数据备分到云上,却无意间泄漏了存放敏感信息的服务器的访问密钥。
以上操作如果在内网中完成,则不会有相关的数据泄漏问题,通常来说,一家公司都具有内外网络隔离的环境,保证自身数据隐私以及服务器安全。那么,这种网络隔离的背后的技术思路是什么呢?
注:本文的大部分文字图像来自于《网络是怎样连接的》,仅个人学习使用。
不同的IP地址
在公共互联网中,不存在两台完全一致的IP,但是在不同的局域内网中是存在相同的IP地址,不过这并不影响实际的公网访问。这就得区分下公有地址和私有地址了。
- 私有地址:IP地址为
10.0.0.0~10.255.255.255、172.16.0.0~172.31.255.255、192.168.0.0~192.168.255.255固定为私有地址,即不开放给互联网用户注册IP地址 - 公有地址:除了私有地址和某些有特殊含义的IP地址外,互联网中使用的IP地址。
这就是为什么我们的内网地址总是192.168.XXX.XXX之类的,这是一种认为规定的规则。在制定私有地址规则时,这些地址属于公有地址中还没有分配的范围。换句话说,私有地址本身并没有什么特别的结构,只不过是将公有地址中 没分配的一部分拿出来规定只能在内网使用它们而已。这个范围中的地址和其他公司重复也没关系,所以对于这些地址不作统一管理,不需要申请,任何人都可以自由使用。当然,如果在公司内部地址有重复就无法传输网络包了,因此必须避免在内网中出现重复的地址。
网络包传输
从公司内网到公司外网的访问路径上,经过了多个转发设备,从以太网中包到达的时间线分为:集线器、交换机、路由器,在这其中一个环节,需要处理这些私有地址,才能进行正常的网络访问,首先来看下这几个设备的作用:
- 集线器:接收电信号,转发电信号到所有接入的设备上,过程中信号会损失能量,但是集线器顶多就是采用不同的工艺来减少信号损失(比如双绞线),不会对数据做任何计算、校验、修复等等,我觉得可以就理解为一根根数据线。
集线器将信号转发到所有的接入设备。 - 交换机:接收电信号,将电信号转成数字信号,根据数据进行计算校验,出现问题则丢弃包,正常则将数字信号转为电信号,根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端口,从端口发送电信号到下一设备。
交换机不具有MAC地址,因此不会根据包的MAC地址进行丢弃或接收操作,只要信号数据正常,就会按规律进行转发。 - 路由器:接收各种信号,转成数字信号,检查MAC地址,如果不是发送给自己的,则丢弃;根据包的IP地址,在路由表中查询(不会根据MAC地址进行转发),发送到对应的端口,传输给下一个设备。
路由器的端口具有IP地址和MAC地址,路由器是一个具体的接收方,并不是单纯的转发设备,是互联网的入口。路由器在进行下一次转发的时候,需要根据ARP协议解析目标IP地址的MAC地址。
从这几个设备的介绍来看,对私有地址的处理,理应在路由器上。事实也是如此,并且该过程有一个专有名词,地址转换。经过地址转换之后,内网对公网的访问(是私有地址-公有地址的访问),会转换成内网的公共区域对公网的访问(公有地址-公有地址的访问)。
地址转换
地址转换的基本原理是在转发网络包时对 IP 头部中的 IP 地址和端口号 A 进行改写。具体的过程我们来看一个实际的例子,假设现在要访问 Web 服务器,看看包是如何传输的。
- 首先,如图所示,TCP 连接操作的第一个包被转发到互联网时,将发送方 IP 地址从私有地址改写成公有地址。这里使用的
地址转换设备是公有地址为198.18.8.31的路由器,作为的互联网接入点。 - 与此同时,端口号也需要进行改写,
地址转换设备会随机选择一个空闲的端口。然后,改写前的私有地址和端口号,以及改写后的公有地址和端口号,会作为一组相对应的记录保 存在地址转换设备内部的一张表中。 - 改写发送方 IP 地址和端口号之后,包就被发往互联网,最终到达服务器,然后服务器会返回一个包。服务器返回的包的接收包是原始包的发送方,因此返回的包的接收方就是改写后的公有地址和端口号。这个公有地址其实是地址转换设备的地址,因此这个返回包就会到达地址转换设备。
- 接下来,地址转换设备会从地址对应表中通过公有地址和端口号找到 相对应的私有地址和端口号,并改写接收方信息,然后将包发给公司内网, 这样包就能够到达原始的发送方了。
- 在后面的包收发过程中,地址转换设备需要根据对应表查找私有地址和公有地址的对应关系,再改写地址和端口号之后进行转发。当数据收发结束,进入断开阶段,访问互联网的操作全部完成后,对应表中的记录就会被删除。
通过这样的机制,具有私有地址的设备就也可以访问互联网了。从互联网一端来看,实际的通信对象是地址转换设备(这里指的是路由器)。
包过滤
以上介绍了互联网中两台机器的访问过程,正常来说,外部人员是不知道路由器中维护的路由表和地址转换表。但是这些表都是能够通过不停的访问试出来,比如黑客想入侵某家公司内网的内部网站,内部网站服务有自己的地址,外部人员根据某种规则,不停的尝试访问,迟早能摸清正确的地址。所以这时候需要依照某些规则对部分外部包进行过滤。
路由器的包过滤
包过滤就是在对包进行转发时,根据 MAC 头部、IP 头部、TCP 头部的内容,按照事先设置好的规则决定是转发这个包,还是丢弃这个包。我们通常说的防火墙设备或软件,大多数都是利用这一机制来防止非法入侵。
包过滤的原理非常简单,但要想设置一套恰当的规则来区分非法访问和正常访问,只阻止非法入侵而不影响正常访问,是非常不容易的。举个例子,为了防止从互联网非法入侵内网,我们可以将来自互联网的所有包都屏蔽掉,但是这会造成什么结果呢?思考一下TCP的三次握手,网络包是双向传输的,如果简单地阻止来自互联网的全部包, 那么从内网访问互联网的操作也会无法正常进行。
防火墙
无论服务器部署在哪里,现在一般都会在前面部署一个防火墙,如果包无法通过防火墙,就无法到达服务器。防火墙的基本思路即只允许发往特定服务器中的 特定应用程序的包通过,然后屏蔽其他的包,并且不能影响用户正常连接互联网。以下是常见的,用于过滤包的相关字段。
TCP
如果我们现在服务器部署如下所示,此时如果我们要禁止Web服务器访问互联网,但是允许互联网访问Web服务器,则可以如下设置:
- 首先对于任何IP到Web服务器的包都允许通过(图表格第一行)
- 拒绝所有Web服务器到互联网的访问链接(图表格第二行)
- 不能影响互联网给Web服务器提供数据(图表格第三行/第四行)
从以上的例子可以看出来,常见的TCP包的过滤是基于:IP地址、端口号、控制位
UDP
不过,实际上也存在无法将希望允许和阻止的访问完全区分开的情况, 其中一个代表性的例子就是对 DNS 服务器的访问。DNS 查询使用的是 UDP 协议,而 UDP 与 TCP 不同,它没有连接操作,因此无法像 TCP 一样 根据控制位来判断访问方向。所以,我们无法设置一个规则,只允许公司内部访问互联网上的 DNS 服务器,而阻止从互联网访问公司内部的 DNS 服务器。这一性质不仅适用于 DNS,对于所有使用 UDP 协议的应用程序都是共通的。在这种情况下,只能二者择其一——要么冒一定的风险允许 该应用程序的所有包通过,要么牺牲一定的便利性阻止该应用程序的所有包通过。
VPN
对于网络隔离,有一个绕不过去的话题就是“墙”。
“墙”是什么
其实“墙”在理论层面就是一道防火墙,只不过这个防火墙非常大,国内的全部公共服务器都在墙内,或者说是一个巨大的局域网内。当我们要通过Google查询时,目的IP地址都是Google的搜索引擎服务器,“墙”自身有一套屏蔽的路由规则,命中规则,则会主动丢包,导致无法访问到资源。那么“墙“是如何进行网络的隔离呢?主要有两种方式:
- DNS污染和劫持:拉黑域名
- IP封锁:拉黑IP地址
DNS污染和劫持
某些网络运营商为了某些目的,对DNS进行了某些操作,导致使用ISP的正常上网设置无法通过域名取得正确的IP地址。某些主体出于某些目的为了防止某网站被访问,而且其又掌握部分国际DNS根目录服务器或镜像,就会利用此方法进行屏蔽。
目前我们访问网站主要都是通过域名进行访问,而真正访问这个网站前需要通过DNS服务器把域名解析为IP地址。而普通的DNS服务使用UDP协议,没有任何的认证机制。DNS劫持是指返回给你一个伪造页面的IP地址,DNS污染是返回给你一个不存在的页面的IP地址。
比如你使用电信、联通、移动的宽带,默认你是不需要设置任何DNS服务器的。这些DNS服务器由他们提供。一旦检测到你访问的网页是不允许的访问的,就会返回一个不存在的网页。而很多运营商也会使用DNS劫持来投放一些广告。
IP封锁
通过一些方式,可以绕过DNS污染(比如线下获取IP地址)通过IP地址访问无法访问的网页。但是目前也存在针对IP进行大范围的封锁。虽然Google这种大公司有很多镜像IP地址,但是目前基本全部被封锁掉,有漏网的可能也坚持不了多久。而且很多小公司的服务是部署在一些第三方的主机上,所以封锁IP有时会误伤,封锁一个IP导致主机上本来可以使用的页面也无法访问了。
不过目前不可能把所有国外的IP全部封锁掉,所以我们采用机会从国内连接到国外的VPS,进行翻墙。解决办法:
- 使用VPS搭建代理
- 使用IPV6 (IPV6地址巨大,采用封地址不现实,但是目前国内只有部分高校部署了IPV6)
VPN基础原理
如何绕过以上限制,访问一些优秀网站呢?常见的话就是自己搭建VPN服务器或者买一个第三方公司提供的VPN服务,对我们的流量进行加密、转发。
隧道技术
隧道技术是一种通过互联网络基础设施在网络之间建立一条虚拟链路来传递数据的方式,使用隧道传递的数据可以是不同协议的数据帧或包,隧道将这些数据重新封装后通过网络发送,一旦到达网络终点,数据将被解包并转发到最终目的地。
- 隧道(Tunnel)就是指被封装的数据包在公共互联网络上传递时所经过的逻辑路径(经过的路由)
- 隧道协议(Tunneling Protocol)就是在这个过程中用来封装数据包的一类网络协议
隧道技术的本质就是利用一种网络层的协议来传输另一种网络层的协议,通过封装和加密来实现信息的隐蔽和抽象 常用来:
- 在不兼容的网络上传输数据
- 在不安全网络上提供一个安全路径
- 隐藏私有的网络地址
更具体的一些内容,在维基百科上也有提到:zh.m.wikipedia.org/zh-my/%E9%9…
隧道技术在VPN中的应用
以某公司内网为例,如下图所示,北京和天津两个子公司,具有各自的内网,要求北京的内网和天津的内网是互通的。
正常来说,R6/R7这两台服务器是互相无法知道各自的内网地址,但是我们可以通过隧道,将二者先建立连接,建立连接的前提是二者互相验证了身份信息,互相开放两者负责的网段信息。这时候如下图所示,这两台服务器互相知道了各自的内网地址。
当192.168.3.2访问192.168.2.1的时候,数据包具体的传输方式如下:
- 目的IP地址为192.168.2.1,源IP地址为192.168.3.2,该请求通过R6接入互联网
- R6将该请求封装,并添加新的IP信息,目的地址为20.1.1.2,用隧道协议加密,通过公网走隧道到达R7
- R7解析该请求,发现是跟R6约定的隧道协议加密的,则进行解密操作,并作为代理进行转发,转发到192.168.2.1
- 192.168.2.1收到请求,并进行处理响应,并发送Response到源IP地址
VPN服务器
平常常用的VPN服务器,不管是公司内部的,或者是外部第三方提供的服务,都需要使用移动端/PC端的Client去链接Server端,进行身份的验证,才能搭建隧道,并进行后续的访问。
成功建立连接后,Client的全部请求都会发送到Server端进行代理转发。所以,这时候防火墙是不知道我们的具体访问信息,但是Server是知道的,所以要确保使用的第三方服务必须是正规安全的,不能随意使用VPN。
资料: