跳至主要内容
五折优惠 全部方案,限时优惠。起价 $2.48/mo
12 min left
安全与网络

网络中的 DMZ 是什么?

J 作者 Jonas 12 分钟阅读
Diagram comparing a three-interface DMZ firewall with the same isolation pattern arranged inside a single server

DMZ 出现时往往不附带定义。它可能是安全评审清单上的一条,是厂商加固文档里的一句话,是招聘启事中与 TLS 和最小权限并列的一项要求。

你去查,找到的是一张防火墙插着三根网线的示意图。一根通向互联网,一根通向一排服务器,一根通向办公室局域网。而你实际管理的,是一台租来的服务器、一个公网 IP,没有任何多余的网络接口。

第一张图画的是真正的 DMZ 架构。在一台服务器上,你可以复现它的部分安全目标:限制互联网能够触及的范围。你在同一台主机上无法复现的,是那条让 DMZ 之所以成为 DMZ 的独立网络边界。

简短版本

  • DMZ 把陌生人必须访问到的服务,与你运行的其他一切分开。
  • 关键从来不是布线,而是让公开一侧的失陷止步于此。
  • 你可以配置好防火墙,却依然没有 DMZ。
  • 一台只有一个公网 IP 的服务器,可以靠反向代理、主机防火墙规则以及绑定到内网地址或回环地址来降低暴露面,但它并不会因此产生一个独立的 DMZ 区段。
  • 这种做法与它所保护的对象共用一个内核,因此只能算作降低暴露面,而不是隔离。

本文不涉及的内容

本文的范围是思维模型,另有三个相邻话题被有意略过。

  • 不涉及搭建步骤。这里没有反向代理配置,没有防火墙规则语法,也不推荐该装哪个工具。
  • 不涉及家用路由器配置。家用路由器上的 "DMZ host" 开关指的完全是另一回事。
  • 不对零信任下结论。网络边界是否仍是合适的首要控制手段,是一场真实的争论,本文不予裁定。

DMZ 是什么,它用来做什么?

DMZ,即非军事区,是位于不可信的互联网与内部网络之间的一个网络区段。它承载那些必须对外可达的服务,比如 Web 服务器和邮件服务器。其余的一切都留在第二道边界之后,因此访问到公开服务并不等于访问到其余部分。

Mozilla 术语表中关于 DMZ 的词条 用一句话点出了其中起作用的那一半:它只开放特定的、已定义的端点,同时拒绝外部访问内部网络。这就是全部的设计目标,其中没有提到任何设备。

传统上放在那里的服务类型,是由这个目标推导出来的。Web 服务器、邮件服务器、FTP 服务器、VoIP 服务器:这些本来就该让陌生人连接。目录服务器、数据库、文件共享、内部应用和管理界面则不在此列,因为外部的任何人本就不该访问到它们。

要记住的是那个性质,而不是那张图。三个网络接口只是创建独立信任边界的一种方式。云端和单机方案可以用别的方式应用同样的暴露控制原则,但只有具备独立边界区域的设计,才算复现了 DMZ 本身。

经典的三接口 DMZ 是如何工作的?

两种经典 DMZ 构建方式的并排示意图。左侧是单防火墙方案,即所谓三腿结构:一台防火墙同时接出通往互联网的 WAN 链路、通往 Web 服务器和邮件服务器的 DMZ 链路,以及通往内部网络(数据库、管理员工作站、内部应用)的 LAN 链路,从互联网到内部的流量被阻断。右侧是背靠背的双防火墙方案:DMZ 位于外层防火墙与内层防火墙之间,以更多配置工作换来两道彼此独立的策略边界。

经典 DMZ 有两种建法。单防火墙方案给一台防火墙配三个接口,分别通向互联网、DMZ 和内部网络。双防火墙方案则把 DMZ 放在两台独立防火墙之间。两者执行的是同一条规则:互联网能到达 DMZ,互联网永远到不了内部网络。

单防火墙(三腿)模型

一台防火墙,三个网络接口。第一个面向互联网。第二个面向 DMZ,公开服务就住在那里。第三个面向内部网络。防火墙放行从互联网到 DMZ 指定端口的入站流量,在应用确有需要时放行 DMZ 到内部的少量流量,其余一律拒绝。

这种形态叫作三腿防火墙。跨区域的每一个数据包都要经过同一台设备,这就使那台防火墙成为区域间流量的单点故障。它一旦失效,连通性和策略执行会受到怎样的影响,取决于该防火墙的失效模式以及你所准备的冗余。

我在一家 ISP 做了十年网络运维,而 DMZ 接口最让人意外的地方,是它有多么平平无奇。不过是一个普通的以太网口,只是在防火墙配置里被贴上了不同的信任标签。架构不在铜线里,而在规则集里,也在于有人认真想清楚了每一条流量被允许朝哪个方向走。

双防火墙(背靠背)模型

两台防火墙串联,DMZ 夹在中间。外层防火墙放行互联网流量进入 DMZ,仅此而已。内层防火墙只放行应用确实需要的、从 DMZ 到内部的特定流量。攻击者即便打进了 DMZ,在到达内部网络之前,仍然要跨过内层防火墙的策略边界。

两台防火墙给你两道分别执行的策略边界,但同时也带来更多配置、打补丁和运维复杂度。外层边界失效或失陷,并不会自动让内层边界消失,尽管防护效果仍取决于这两台防火墙是如何配置和管理的。

DMZ 和防火墙是一回事吗?

不是。DMZ 是一个独立的边界网络或网络区段。防火墙则是常用的一种控制手段,用来管束该区域、互联网与内部网络之间的流量。你完全可以在扁平网络上配置防火墙规则而不产生任何 DMZ,所以这个区别是架构层面的,不只是配置问题。

这种混淆是可以理解的。防火墙是你会登录进去的那个东西,是有配置文件、有厂商、有支持合同的东西,于是它顺带收走了它所产生之物的名字。而没有人能登录进一个网络区段。

后果会在最糟糕的时刻显现。就假定你那台公开的 Web 服务器已经失陷,因为它迟早会。在扁平网络上,攻击者此刻已经在一台本就能与你的数据库、文件服务器和管理界面通信的机器上站稳了脚,而在它们之间穿行,不过是在使用早已被允许的访问权限。这种横向走动叫作横向移动,第二道边界的存在正是为了挡住它。DMZ 并不能防止 Web 服务器被攻破,它防止的是一台已被攻破的 Web 服务器变成通往其余一切的入口。

趁术语还在眼前,澄清一点:家用或小型办公路由器上的 "DMZ host" 设置是另一回事。它把未经请求的入站流量转发给某一台内部设备,使该设备直接暴露在互联网上,并不会创建一个独立且受保护的 DMZ 网络。

如何在一台服务器上应用 DMZ 的原则?

一台只有一个公网 IP 的服务器,可以复现 DMZ 在暴露控制上的部分目标,但复现不了它的网络分离。反向代理可以成为唯一的公开入口,默认拒绝的入站防火墙规则可以挡住其余部分,内部服务则可以监听在回环地址或内网接口上,而不是公网地址上。

先从本节假定的约束条件出发:一台 VPS、一个公网接口,以及 没有独立的防火墙设备 也没有你能掌控的 DMZ 子网。在这种条件下,你无法在同一台主机上复现经典的三腿拓扑。主机防火墙规则、服务监听在哪个接口,以及反向代理,仍然可以降低暴露面,但它们造不出同样的隔离边界。

反向代理可以占用公网接口上的端口 80443 从而成为 Web 流量在应用层的唯一入口。这会收窄对外的攻击面,但并不等同于一个独立的 DMZ 接口,因为该代理仍与它身后的服务共用同一台主机。

主机上的入站防火墙规则放行这两个端口,丢弃其余。机器上的其他服务照样可以运行、可以监听,但外部无法向它们发起连接。这在单台主机的范围内接近了「只有预期端口可达」这条策略,却并不因此产生一条与内部网络之间的独立边界。

应用服务器、数据库和管理面板不应该绑定在公网地址上。当代理跑在同一台主机上时,它们可以监听回环地址;当代理跑在内网的别处时,它们可以监听内网地址。无论哪种情况,公网接口上都不存在这些服务的监听者,因此仅仅在该接口上放开一条入站规则,并不会把它们暴露出去。

管理访问属于内部一侧,而不是 DMZ 一侧。把 SSH 和管理界面挪出公开路径,放到 VPN 或内网之后,就能杜绝从公网直接连到它们。

DMZ 的概念如何对应到 VPC 子网和安全组?

把经典 DMZ 元素映射到 VPC 内云端原语的示意图。DMZ 区段变成一个公有子网,里面放着负载均衡器或代理,只有在互联网路由、公网地址和放行规则同时到位时才可达。内部网络变成一个私有子网,里面是应用服务器和数据库,没有通往互联网网关的路由。按区域划分的防火墙规则变成子网边缘上的无状态网络 ACL,按资源划分的规则则变成附着在每个资源上的有状态安全组。

经典模型与云网络原语在概念上的对应相当接近,但并非一一对应。DMZ 区段变成公有子网。内部网络变成没有互联网网关路由的私有子网。防火墙的规则集则被拆分到安全组与网络 ACL 之中:前者关联到资源的网络接口,后者附着在子网上。

经典元素云端对应物它强制什么
DMZ 区段公共子网提供一条通往互联网的路由;资源还需要一个公网地址以及放行该流量的安全规则
内部网络区段专用子网没有通往互联网网关的直接路由,因此互联网无法经由该路径发起直接连接
区域之间的防火墙接口路由表 + 互联网网关挂载流量可以被路由到哪里;资源是否真的可达,仍由公网寻址和安全控制决定
防火墙规则集(按区域)网络 ACL在子网边缘处求值的无状态放行与拒绝规则
防火墙规则集(按主机)安全组有状态的放行规则,作用于所关联资源的网络接口
DMZ 中面向公众的服务公有子网中的负载均衡器或代理实例流量必须经过的唯一入口

云厂商自己就在用这套词汇,这足以说明该术语依然通行。AWS 的网络博客描述了 一种基于 Amazon VPC 的 DMZ 架构 它把对外服务与内部网络隔离开来,其基础是 VPC Block Public Access,一项于 2024 年 11 月推出的 Region 级控制能力。

在这套对应关系里,真正承重的是子网。一个公有子网之所以「公有」,是因为它的路由表指向互联网网关。既然 路由表决定数据包往哪里走,那么子网的布局就在任何单条规则之前,先塑造了你的暴露面。

这套对应关系在一个具体的地方并不严丝合缝。防火墙接口过去是为整个区段执行一条边界;而安全组关联的是单个资源的网络接口。同一个私有子网里的两台机器,可以挂着完全不同的安全组,于是执行落在了比物理接口所能达到的更细的粒度上。这通常是进步,但也意味着:子网的名字告诉你的可达性信息,比过去一张网络拓扑图告诉你的更少。

单机版本在哪里力有不逮

在同一台主机上,对外暴露的进程与内部服务共用一个内核、一台机器。分离的区段会迫使攻击者跨过一条被防火墙检查的网络边界;单台主机不会。单机模式降低的是暴露面,它并不复现分离。

如果反向代理被攻破到能让攻击者执行代码的程度,那段代码就已经运行在跑着你数据库的那台机器上了。这时绑定回环地址帮不上忙,因为回环地址从主机内部就能访问。容器隔离或用户隔离可以抬高所需的代价,但同一主机上的容器依旧共享该主机的内核。在经典模型里,攻击者的下一步是一条经过网线、被某个东西检查着的数据包;在这里,它只是一个本地套接字。

实际结论是一道门槛,而不是一句判词。当代理身后的东西,其价值超过多加一台机器的代价时,就用两台机器,中间连一条内网。为此你不必重学本文中的任何内容,因为这里面从来没有一处是关于硬件的。

查看 Linux 套餐

在拥有 root 权限、NVMe 与 AMD EPYC 强大性能的 Linux VPS 上构建应用。

查看 Linux 套餐

边界已不再是唯一能够执行安全策略的地方。零信任架构取消了基于网络位置的隐含信任,而用 WireGuard 或 Tailscale 构建的私有连接则能减少对外暴露。这两种做法都不会自动取代分段或授权。至于那个更窄的问题,我的立场很明确:作为思维模型,把可达的与不可达的分开,并且清楚哪条边界能把一次失陷关在里面。这个问题比上面提到的每一种架构都活得久,这正是它今天仍值得回答的原因。

常见问题

DMZ 和 VPN 是一回事吗?

不是。它们解决的是不同的问题。DMZ 控制的是不可信的外人能够访问到什么,办法是只开放一小组服务、别的一概不开。VPN 则是给可信的外部人员一条进入内部的私密通路,通过认证把他们接进一个原本到不了的网络。很多网络两者都用,而且谁也替代不了谁。

DMZ 安全吗?

DMZ 并不能让一个暴露在外的服务变安全。它限制的是该服务被攻破之后,影响能波及到哪里。面向公众的服务照旧面向公众,照旧暴露给互联网上的所有人,照旧需要它自己的补丁、监控和加固。DMZ 决定的是它倒下之后会发生什么,而不是它会不会倒下。

只有一台服务器,我需要 DMZ 吗?

按经典定义来说,不需要,而且你在单台主机上本来也建不出一个。三接口拓扑需要彼此分离的网络区段,而一台只有一个公网 IP 的服务器一个都没有。你能做的是控制暴露:让反向代理成为唯一的公开入口,其余入站端口默认拒绝,内部服务监听在回环地址或内网地址上。这能减少互联网可以触及的范围,但并不能把公开服务与主机上的其余部分隔离开。当代理身后的东西,其价值超过第二台机器的成本时,就用两台机器,中间连一条内网。

为什么叫「非军事区」?

这个词借自军事上的含义:两支对峙力量之间的缓冲地带,双方都不完全掌控。网络上的用法保留了这个比喻:DMZ 既不完全属于不可信的外部,也不完全属于可信的内部。

分享

讨论

评论

登录后参与讨论。

博客更多内容

继续阅读。

准备好部署了吗? 起价 $2.48/月。

独立云厂商,自 2008 年起。AMD EPYC、NVMe、40 Gbps。14 天退款保证。