路由器DMZ配置工作原理及其限制总结
date
Nov 18, 2024
slug
2024-11-18-the-DMZ-Configuration-on-Router-and-its-limits
status
Published
tags
网络技术
type
Post
AI summary
summary
本文对不同类型的NAT工作流程进行了整理,在此基础上总结了DMZ的概念和工作原理,以及DMZ在普通路由器上的配置以及使用中存在的限制因素。
因为工作中要提升P2P成功率的关系,对家用路由器中的DMZ设置相关的概念、工作原理、配置流程以及使用中的限制做了总结。在路由器WAN端有公网IP的情况下,开启DMZ确实是可以非常有效的提升P2P的穿透成功率,但是也需要注意DMZ主机失去了NAT的保护所存在的安全性方面的隐患。
NAT/SNAT/DNAT的概念
要理解DMZ的工作原理,要首先搞清楚路由器上地址转换NAT在内网和外网主机之间通信的过程中是如何发挥作用的,DMZ主机的工作流程与NAT中的DNAT类型息息相关。
NAT,Network Address Translation,即网络地址转换。这里的网络地址转换,实际上指的是内网地址和外网地址的转换,在NAT功能的具体实现上,通过NAT表来实现。实际上就是在NAT表中保存有内网地址和外围地址之间的对应关系,内网中的数据包要发到外网时,在NAT功能处理中会查询NAT表,把这个内网数据包中的源内网IP地址替换为其对应的外网IP地址再发出去;同样的,当外网的数据包到达NAT要发往内网主机时,也是通过查询这个NAT表中的对应关系,把这个数据包中的目的外网IP地址替换为与之对应的内网IP地址,再发给内网主机。
家用路由器中的NAT功能通过以上所描述的网络地址转换的过程,一般而言起到的主要作用有两个:
- 安全性防火墙方面的作用。在NAT的保护下,外网主机无法直接访问到内网的主机,所有的网络通信都必须首先从内网主机发起,内网主机的安全性就得到了基本的保证。
- 扩展IP地址数量。截止到现在IPv4在互联网上的应用仍然大行其道,而IPv4框架下所包含的IP地址已经基本耗尽,通过NAT可以支持内网的多台主机同时共享使用1个或者多个公网IP访问互联网,从而起到扩展IP地址数量的作用,缓解了IPv4地址不足所导致的问题。
NAT的分类上在,主要可以分为以下几种:
- Static NAT。在这种NAT模式下,内网和外网之间的IP对应关系是提前预设好的一对一的关系,也就是说NAT表中两者之间的关系是固定的,由网管人员提前设置好内网IP与外网IP之间的映射关系,路由器按照这个静态的NAT表对内外网的流量进行地址变换和转发。所以Static NAT实际上只能做到隐藏内网主机服务器的作用,但是起不到扩展IP地址数量的作用。
- Pooled NAT。Pooled NAT的公网端有一个IP地址池(这一点类似于Static NAT),当内网主机访问外网的时候,由路由器动态的选择空闲的公网IP来构建一个动态的内网与外网IP地址映射表,内外网数据包在路由器上的地址转换仍然是基于这个地址映射表来进行。所以Pooled NAT的工作流程跟Static NAT基本一致,双方的区别只是NAT表是静态设置好的还是由路由器动态生成和维护的。路由器所生成的动态NAT表的每一条映射关系都有时间限制,过期后这个公网IP重新放入公网IP池,这样就可以用于新的内网主机通信之中。通过这样的方式,少量的公网IP可以支持更多的内网主机访问外网的通信需求。
- NAPT,这种模式实际上是目前家用路由器进行NAT转换的最常用的模式。其中又可以分为SNAT和DNAT两种形式。对于我们家庭路由器常用的NAT转换功能的实现而言,普遍使用的都是NAPT中的SNAT功能。而DMZ的实现则与DNAT的工作逻辑息息相关。
SNAT
SNAT:Source NAT,即对内网请求数据包中所包含的IP地址的源地址进行转换。
实际上我们在内网中通过路由器访问公网上的所有网络服务,路由器基本上都对内网的请求数据包进行了SNAT转换。也就是说,内网主机所发出的请求数据包中所包含的IP地址是内网IP地址,这个IP地址在公网中是没有意义的,所以在这个请求数据包在内网路由器向外转发的时候,内网路由器会基于NAT表进行转换,使用自己的公网IP替换掉请求包中的源地址(内网IP地址),相当于后续由内网路由器的WAN端代理内网主机与公网主机进行通信。后续内网路由器WAN端收到来自公网主机的应答数据包以后(这个数据包的目的地址是内网路由器WAN端的公网IP),然后内网路由器再根据NAT表把这个数据包的目的地址(此时是内网路由器WAN端的公网IP)替换为之前的内网主机的内网IP地址,并且把这个数据包转发给内网主机。
当然,在SNAT的具体运行上,不只是在内网IP地址和公网IP地址转换这么简单,为了支持同时有更多的内网主机能够通过内网路由器共享同一个WAN端公网IP地址访问外网,SNAT在具体的操作上还会同时替换源端口和目的端口。因为如果只是替换内网和公网IP地址的话,当内网的两台主机A和B同时访问同一个外网的服务器,外网发回的响应数据包在WAN端就没法确认应该是转发到A还是B了。
所以为了支持内网更多的主机更自由的同时访问外网服务器的话,有必要在内网服务器进行SNAT地址转换的同时,把通信的端口也替换成对内网路由器WAN端不同的端口,这样就可以根据外网服务器响应数据包中的目的端口来判断应该把这个数据包转发给内网的A还是B。
对于以上SNAT地址和端口转换的过程进行分析,实际上在这个SNAT的关键就在于路由器上所维护的NAT表。NAT表中的每一条地址转换表项实际上都包含了一个7元组的信息:
- 通信使用的传输层协议TCP还是UDP
- 源主机的内网IP地址
- 源主机的内网通信端口
- 服务器WAN端的公网IP地址
- 服务器WAN端针对本次通信交互的端口
- 目的主机的公网IP地址
- 目的主机的通信端口
以上7元组的NAT转换表项在内网主机首次向外网服务器发出请求包时,在路由器上创建并维护,这样的话后续公网服务器发回的响应数据包到达内网路由器的WAN端口,同样通过查NAT表根据以上7元组信息找到内网主机和端口(如果查不到与这个数据包相对应的NAT表项,这个数据包就会被内网服务器屏蔽删除掉),替换目的IP和端口后把这个数据包转发给内网主机。NAT表中的每个表项创建后都有一个倒计时有效期,倒计时时间到了会被自动删除。通过这样的方式,内网路由器就可以只允许短期内(NAT表项有效期内)的外网数据包通过路由器进入内网,所有不符合NAT表项记录的外网数据包都会被路由器删除掉,由此实现对内网主机的保护。
DNAT
DNAT:Destination NAT,即对公网请求数据包中所包含的目的地址进行转换。
DNAT的工作流程跟SNAT刚好相反,SNAT是对内网出去进入外网的数据包源IP地址和端口进行转换(把内网主机的内网IP地址替换为服务器WAN端口IP地址),而DNAT则是对从外网要进入内网的数据包的目的地址和端口进行替换(把这个数据包中的目的地址和端口根据DNAT的规则替换为内网主机的IP地址和端口)。网络部署和配置中的负载平衡、端口转发以及下面要重点总结的DMZ的工作本质上都是要依赖于DNAT。
DNAT与SNAT的相同之处在于,它们所依赖的NAT表项都是由以上的7元组所组成,无论是进入内网还是从内网出去的数据包,都是按照7元组的NAT表项来找到IP地址和端口的映射规则并进行替换。
而不同之处则在于,SNAT主要是服务于内网主机向外通信的数据包所要进行的地址和端口转换,而DNAT则主要是针对外网主机主动向内网的主机发起请求所进行的地址和端口转换。
如上所述,SNAT因为其NAT表项总是在内网主机向外主动发出请求的时候才会创建,每个NAT表项被创建后也有倒计时生命周期,不符合NAT表项的外网数据包会被SNAT屏蔽掉,所以SNAT的安全性是有保证的。但是如果没有经过适当的部署,DNAT在安全性方面会存在比较大的隐患。因为所有外网数据包都有可能通过DNAT规则的地址转换进入内网,因此对于DNAT的使用而言,一般需要配合额外的防火墙设置以及细致的转发规则来对内网的敏感数据和资源进行合理的保护。
DMZ的概念及其工作原理
DMZ,Demilitarized Zone,隔离区,也可以非军事化区。在网络的拓扑结构上与之相对应的,自然是外网即互联网所在的军事化区,以及内网所在的安全区域(这个安全功能的实现正是通过NAT地址转换的功能来达成的)。
DMZ区域存在的主要意义在于:当使用NAT保护内网的安全性以后,外部网络无法直接访问内网主机,但是如果有把一些服务器资源(例如企业的Web服务器,FTP服务器等)部署在内网,同时希望能够从外网访问这个内网服务器的话,就可以设置一个介于安全区域和非安全区域之间的缓冲区,然后把这些要为外网提供访问权限的内网服务器放在这个缓冲区域即DMZ区域中。
下图就是一个典型的在内网中部署DMZ区域的架构。通过路由器和防火墙的适当部署以及配置,整个公司内部的网络仍然部署在内网中,其中对于安全和数据比较敏感的主机仍然部署在内网的LAN区域中,无法被外网访问到;而需要共享给外网访问的主机则部署在内网的DMZ区域,通过DMZ部分的防火墙针对性的进行包过滤和访问控制。
对于DMZ区域部署的主机而言,外网主机向内网DMZ主机请求的通信流程可以总结如下(外网主机C—内网DMZ区域服务器A):
- 外网主机发起请求:外网主机C想要访问位于DMZ区域的内网服务器A,但服务器A的地址是私有地址(因为服务器A仍然是部署在内网中),外网的数据包无法直接发到服务器A。因此外网主机C实际上是向防火墙的公网地址发送请求数据包,此时请求数据包的源地址是外网主机C的IP,目标地址是防火墙的公网IP。
- 防火墙接收请求:防火墙接收到这个请求数据包后,检查该数据包的目标地址并进行DNAT转换。
- DNAT转换:在外网请求数据包的目标地址是防火墙的公网IP,并且防火墙配置了DNAT规则和DMZ区域的情况下,防火墙将根据这些规则将数据包的目标地址从防火墙的公网IP转换为DMZ区域中服务器A的私有IP,这个转换过程就是DNAT(修改目标地址)。
- 转发到DMZ主机:地址转换后的数据包被发送到DMZ区域的服务器A。此时,数据包的源地址仍然是外网主机C的IP,而目标地址已经被前一步的DNAT转换变成了DMZ中服务器A的私有IP。
- 服务器A响应:DMZ区域中部署的服务器A收到请求后,处理请求并生成响应数据包,响应数据包的源地址是服务器A的私有IP,目标地址是外网主机C的IP。
- SNAT转换:响应数据包到达防火墙时,防火墙会将数据包的源地址从服务器A的私有IP转换为防火墙的公网IP,这个过程就是SNAT(Source Network Address Translation,源网络地址转换)。
- 这一步实际上就跟通过内网的浏览器访问公网上的Web Server是一样的步骤了。
- 发送回外网主机:经过SNAT转换后,数据包的源地址变为防火墙的公网IP,然后数据包被发送回外网主机C,整个通信过程至此完成。
从以上DMZ的整个工作流程上来看,整个流程实际上包含了DNAT和SNAT的两个部分,其中DNAT负责对外网进入内网的数据包进行地址替换,而内网向外发出的数据包仍然采用SNAT的替换规则。
DMZ与端口映射之间的区别
其实从具体的作用上看,在路由器上设置DMZ和静态端口映射都可以起到把内网主机开放到外网的效果。但是两者之间的实际工作原理还是大相径庭的。
- DMZ是通过DNAT机制在防火墙和路由器中设置的规则,对外网进入内网的请求数据包进行解析过滤以及地址转换,是主机IP地址层面的转换;而端口映射则只是机械的按照配置好的静态端口映射表,固定的把来自外网访问某个端口的数据包转发到内网某台主机的某个端口上,具体到了端口层面的转换操作。
- 安全性方面DMZ配合防火墙和路由器的设置可以对内网实现更高级别、更灵活的保护,从而达到内网的公共服务仍然对外开放,但是同时可以有效的方式外网的攻击直接影响内网的安全性;而端口映射的安全性比较低,只是做固定端口的流量转发,需要配合其他安全服务才能达到较好的安全保护级别。
DMZ的配置使用与限制
对于家用路由器的配置和使用而言实际上是非常简单的。
以我们家庭常用的TP Link的路由器来举例,开启和设置DMZ功能的过程非常简单。通过路由器的管理界面,在其设备管理中找到DMZ主机进行配置:开启DMZ主机选项,并且在其中填写DMZ主机所对应的内网IP地址(需要提前查询好要设置为DMZ主机的内网主机的IP地址,并且最好把这一台主机的内网IP地址固定下来,否则后续该主机IP变动的话DMZ的配置也需要重新修改)即可。
需要注意的是,对于绝大多数支持DMZ设置功能的家用路由器而言,在DMZ配置选项中只能支持一台DMZ主机,所以在以上DMZ主机IP地址中看到只能设置一个DMZ主机的IP。从DNAT的工作流程上来讲,DMZ区域当然是可以支持多个主机的,但是需要在防火墙和路由器上设置DNAT的包过滤规则,当外网的数据包在通过DNAT的时候,按照预先设定的规则根据其目的端口号来进行区分,访问的是哪个DMZ主机和服务,然后把这个数据包的目的地址修改为这个DMZ主机的内网IP和端口。只不过对于家用路由器而言,安全性的设计要求并没有那么高,而且对公网要开放的服务和端口也不需要太复杂,因此一般只需要设置一个DMZ主机就够了,这样的话所有来自公网的请求数据包都会默认穿透DNAT到达这个DMZ主机。
DMZ功能使用的局限性
其实从以上DMZ功能的工作流程以及DNAT的包转发原理上就可以看出来,DMZ设置有效的提前是在路由器的公网网口WAN端有独立的公网IP,而不是ISP内部的子网IP!这一点非常关键,也很好理解,因为如果路由器WAN端的IP仍然是子网IP的话,来自外网的主动请求的数据包会被路由器更上一级的ISP路由器或者交换机屏蔽掉,根本就到不了用户家庭路由器的WAN端,那么在家庭路由器的WAN端IP不是公网IP的情况下,在这个路由器上设置DMZ就没有任何意义了。
设置DMZ如何提升P2P穿透成功率?
如上所述的DMZ以及DNAT的工作流程,当在家庭路由器上把内网的某台主机设置为DMZ主机,那么公网上所有的主动请求的流量都会被转发到这个DMZ主机上,这样实际上就相当于这个DMZ有了公网IP。在进行P2P穿透的过程中,进行P2P穿透的两个主机有一台有公网IP的话,两台主机之间肯定是可以100%穿透的,只需要处于内网的主机向被设置为DMZ的主机发出数据包并接收应答就可以了。整个流程实际上就类似于从内网主机访问公网上的Web Server一样,当然是100%可以通信的。这就是设置DMZ能够有效提升P2P穿透成功率的原因所在(当然前提仍然是设置DMZ的这个路由器WAN口需要有公网IP)。