一句话总结:NAT 不是安全措施!IPv4 + NAT 给你带来的好处,IPv6 环境下不仅能实现,而且效果更好更安全。

注:本导读可能跟原始 RFC 文档的表述有出入,为了方便读者理解,为了进一步推广此 RFC 的重要意义,所以我更换了一些表述,精简了一些众所周知的事实和理解本文需要的基础知识。

本 RFC 在 2007 年 5 月发布,距今已有 11 年,然而其中的重要观点一直没有在我国互联网界达成广泛共识。直到今天还有很多人认为部署了 NAT 能够带来安全性,由于 IPv6 没有类似 IPv4 的地址转换+端口复用 NAT 技术,所以 IPv6 的网络安全(三层和四层)他们就认为是不可能或者很困难的了。

如果要深入理解,请阅读 RFC4864

章节大纲

1、前言

2、分析了 NAT 带来的几点“好处”,并指出了这些好处的本质以及其对 IPv4 环境的影响。

3、介绍了 IPv6 特有的几个安全属性,隐私地址、本地唯一地址、DHCPv6 前缀下发、不可跟踪的 IPv6 地址

4、阐述了使用 IPv6 下的技术实现 NAT 所提供“好处”的方法,与第二章的内容一一对应。

5、案例分析

6、列举了几个 IPv6 环境下还需要努力解决的问题

7、安全考量

8、结论

9、致谢

10、参考资料

附录A 介绍了原生 IPv6 和全局唯一地址带来的额外好处

章节归纳摘要

1 前言

本文研究了 NAT 的部署带来的一些网络特性,这些特性并不是 NAT 的本意——即扩大可用的地址空间,但是长期的部署中,很多人非常依赖 NAT 带来的这些“好处”,对其根本的劣势视而不见,甚至将这些好处作为阻挠 IPv6 部署的理由。

本 RFC 就对这些好处的本质做了分析,打破了 NAT 带来的“安全特性”传说,实事求是地剖析这些好处。

NAT 的下列特性,的确为网络提供了一些价值:

1、任何从外部到达内部的数据,都需要先建立状态

2、当状态随着数据流的结束而过期后,停止接收任何数据包

3、使节点看起来像是连接在网络边缘的能力

4、拥有一批不可公开路由的地址(主要改变了跟踪状态的位置,也是第一条的规模要求)。

如果把 IPv6 的本地网络保护 LNP (Local Network Protection)实施起来,能够在不需要地址转换的前提下实现上述“安全特性”

目标 IPv4 IPv6
简单网关作为默认路由器和地址池管理者 DHCP 上游单一地址,下游有限个地址 DHCPv6-PD 前缀分发,下游无状态自动配置(SLAAC)
简单安全 由于没有状态就被过滤掉 明确的基于上下文的访问控制
本地使用情况跟踪 NAT 状态表 地址唯一性
终端系统的隐私性 NAT 把地址中的设备 ID 转换掉 临时使用的隐私地址
拓扑隐藏 NAT 把地址中的子网转换掉 不可跟踪的地址,或MIPv6隧道
地址自治 RFC 1918 地址段 RFC 3177(IPv6 地址分配准则)和 RFC 4193(本地唯一 IPv6 单播地址)
节约全球地址池 RFC 1918,应用程序终结点拓扑受限 用不完的子网和地址,无限拓扑
地址重新分配和多网络接入 边界上的地址转换 每个前缀的生命周期以及每个接口多个地址

2 通常认为的 NAT 的优点和它对 IPv4 的影响

2.1 互联网和私网之间的简单网关

的确简单,谁都能用,内部想用什么地址都可以。但是受限于客户机/服务器模型的应用程序。对于点对点、多方协作、服务器在 NAT 内部,就复杂了

2.2 有状态过滤器带来的简单的安全

一来有经验的黑客对 NAT 很熟悉,可以越过 NAT 边界,二来很多静态 NAT 配置直接映射到单个机器上更是一点保护都没有。

NAT 所谓的安全来自缺少预设的或是永久的映射状态,这种比没有强一点的保护能得到广泛使用,也只是因为它不需要复杂的管理,就能过滤掉不必要的流量。

用户/NAT管理员为了允许外部访问内部的应用程序所做的配置,更是增加的管理复杂度,多个设备共享端口更是不可能的。

2.3 用户/应用跟踪

需要周期性的去查询 NAT 状态表才能知道内网里的谁正在访问互联网上的资源,查这个数据库并不容易,需要 IPv4 地址和用户的映射,或者跟时间相关的地址/端口映射

2.4 隐私和拓扑隐藏

拓扑隐藏的目的就是不让外界通过地址了解内网的结构,这点 NAT 做到了。但是对于不通过 IP 地址的跟踪,NAT 无能为力,只是能防止外部对具体系统的跟踪和刺探。

很多网管为了防止外部对内部网络拓扑的研究来避免漏洞扫描,屏蔽了 traceroute 等等。

对 IPv4 来说地址扫描的确是个问题,因为一旦拓扑已知,子网很小很快扫完,找到所有主机然后扫端口。

2.5 独立的私网地址分配

大家都用 RFC 1918 的地址,挺够用的。要更换运营商也很简单,就更改 NAT 公网一侧的配置即可。但是两个组织要合并,在合并的时候有重合的地址段也是个麻烦事。

2.6 节约全球地址

虽然 IPv4 + NAT 的组合降低了可能的消耗率,但是还是没地址了。很多运营商就开始给用户分配 RFC 1918 的地址,上 NAT,但是地址还是不够用,多层次 NAT 也出来了,路由就出现很多歧义。有些运营商甚至把先前没有宣告的公网地址段给用户分配,然后发现这些地址段已经分配了也宣告了,他们的用户就没法访问这些已经注册的网络了。

总而言之,全球 IPv4 地址已经告罄。

2.7 多网络接入和更换全部地址

虽然多网络接入和更换全部地址是两回事,但是它们合在一起经常作为使用 NAT 的理由。因为接入多个网络通常是为了更换网络地址的中间状态。

企业的话需要接入多个运营商,也需要有换运营商的能力,这就要求站点要么支持多个地址前缀,要么乐意更换前缀,IPv4 的设计中没考虑处理这些问题。但是如果站点通过 NAT 接入它的运营商,那只有 NAT 设备本身要处理多线接入和更改地址的问题了。

另外如果两个网络需要合并但是都使用了相同的 RFC 1918 地址段,一般就在两个网络之间安装 NAT,避免了全部更换地址。这样既省钱又有更多时间去更换地址。只是添加一个 NAT 可能还比较简单,但是如果要合并的网络已经用了地址转换,那就非常麻烦和复杂了。

3 用于实现 NAT 带来的好处的 IPv6 的一些特性

本章介绍了 IPv6 的一些特性,这些特性可以用作本地网络保护的一部分,用来替代 IPv4 NAT 带来的保护。

3.1 隐私地址

由于 SLAAC 获得的地址中嵌入了设备的 MAC 地址,这样网站就可以随着设备在网络中移动,还一直跟踪这个特定设备,RFC 3041 定义了一个 SLAAC 的扩展,能够随着时间变化生成不同的接口标示(地址)。隐私地址较短的生命周期也降低了攻击这个设备的可能性。但是有 DHCP 服务存在的话,隐私地址的生成就要靠 DHCP 服务器,这有可能给出一个相对永久的地址。

3.2 本地唯一地址

前面提到的 NAT 的诸多“好处”之一就是内网的自治性,在保证本地网络和应用程序的稳定性的同时,可以在多个运营商之间切换。因为 IPv6 支持多个前缀同时使用,本地唯一地址 ULA(Unique Local Address)前缀就被留作本地通讯。ULA 不是为了在互联网上可路由的,否则会对全球路由聚合产生负面影响。

ULA 的特性:

  • 是个全球唯一的前缀

  • 网络间可以组合或者互联而不产生地址冲突或者重新分配地址

  • 即使泄漏到网络之外,也不太可能跟其他地址冲突

  • 运营商无关地址,即使在没有互联网连接的时候也可以在内部使用。

  • 可以在网络边界很容易地过滤,因为他们有众所周知的前缀

实际应用中,应用程序可能把这些地址看作是全局地址,但是地址选择算法可能需要识别这两种前缀以保证稳定性。系统都要遵照 RFC 3484《IPv6 默认地址的选择》的规定

ULA 本身没有安全特性,最有用的特点就是路由的范围局限在一个管理边界内。

3.3 DHCPv6 前缀下发

一个简单网关的重要功能就是管理本地使用的地址范围,DHCP-PD 提供了自动 IPv6 前缀下发的机制。分发前缀的路由器/DHCPv6 服务器不需要了解获得这个前缀的网络的结构。

3.4 不可跟踪的 IPv6 地址

目的是使得外部试图确定内部网络拓扑变得极其困难甚至不可能,子网的结构可能从地址中都看不出来。

4 使用 IPv6 中的技术获得 NAT 宣传上的种种“好处”

4.1 互联网和内网之间的简单网关

一个基本功能的 IPv6 路由器对内可以宣告随机生成的 ULA 前缀,连接外网时从运营商处利用 DHCP 前缀下发获得一个可路由的前缀。内部系统受 RFC 3484 的制约将总是使用获得的全局 IPv6 地址。一条默认路由在简单的情况下就够了。

4.2 IPv6 和简单安全

把一个 IPv6 主机和 IPv4 主机直接连接互联网的风险是一样的,要想在边界上提供保护,需要使用防火墙和入侵检测系统。代理服务器也可以,但是就打破了端到端的透明性。在 IPv6 环境下,存在以下保护措施,不需要 NAT,同时可以保证端到端的连通性:

1、较短生命周期的隐私扩展地址后缀

2、受限于基础设施,IPsec 并不是一直可用。在 IPv4 环境中 IPsec 还需要支持 NAT,往往局限在网络边缘之间的 VPN 应用,由于没了 NAT 端到端的 IPsec 在 IPv6 环境中可能性就更高了。需要注意的是加密的 IPsec 流量会越过检查内容的防火墙,但是对于要求安全性的各方来说看起来也是可以接受的。

3、因为 IPv6 一个一般的子网就有 64 位,如果把一个子网的地址随机分布的话,外部的 ping sweep 式子网扫描就失效了。但这仅限于攻击者对特定子网没有直接的访问,只是远程扫描。如果有本地访问的话,使用邻居发现协议(ND)和 ping6 到链路的 ff02::1 地址就可以发现本地的邻居,然后加上全局前缀就可以简化扫描了。当然 IPv4 环境下本地攻击者也有很多扫描的选项。

拓扑探测的目的要探测一个企业内可用的主机,一般就是 ping 扫描。由于 IPv6 的子网就有 64 位,攻击者就需要发送不现实的个数的 ping 才能了解网络映射。全速全双工的 40Gbps 链路,需要 5000 年才能扫描完单个 64 位的子网。

IPv4 NAT 不是作为一个安全措施发明的,尽管宣传上有所不同,但它真的不是安全措施。由于很多人因为用了 NAT 就认为他们的网络是安全的,这样的想法带来很多安全漏洞。IPv6 的安全最佳实践会避免这类虚幻的安全,但是也得要网络边缘上有正确配置的防火墙和入侵检测系统才能应对跟 IPv4 相同的威胁。

必须指出的是即使是防火墙也无法让一个网络完全安全,很多攻击来自内部或者防火墙所能保护的层次之上。在最终的分析中,每个系统都要为自己的安全负责,系统的每个进程都要足够健壮以应对诸如堆栈溢出等等挑战。防火墙所做的,只是阻止网络携带未授权流量,从而降低了跨越网络边界的特定类型攻击的可能性。

要实现 IPv6 的简单安全,例如在家庭网络中,路由器/网关设备必须要提供有状态防火墙的功能,就是入站流量只能是来自出站流量的应答,这有时也叫做反射会话状态。同时也应该有一个简单的用户界面,使得用户可以为特殊的需求创建允许的入站策略。

IPv6 简单防火墙的管理员和配置界面的设计者需要为特定的配置规则作出安全警示,让用户觉察到风险。最终目的是在使 IPv6 互联网更安全的同时,不给用户增加复杂度。

4.3 用户/应用程序跟踪

IPv6 使得数据流信息收集成为可能,因为所有的用于互联网和内网/外网的通讯地址都是唯一的,企业和 ISP 可以了解到两点之间详细的通讯信息。

同时这种跟踪是基于每个地址的,如果是为了定位到用户,还需要额外的信息把地址和用户关联起来。使用隐私地址的情况下,为了收集这种信息还需要二层媒介地址。

4.4 IPv6 下的隐私和拓扑隐藏

由于伪随机隐私地址,主机可以达到一定程度的隐私性,一个会话只能被反向跟踪到发起端的子网,但是到不了实际的主机,IPv4 NAT 则只能跟踪到最外围的公网 NAT 接口。

因为 IPv6 的地址空间太大,如果随机分布子网和接口标示,一般的嗅探者无法推断网络拓扑。从单个地址中得到的信息非常有限。大部分时候这个概念对于地址隐私和拓扑保护是足够的,当然也需要更为复杂的内部路由配置。

网络管理员可以完全把内部 IPv6 网络隔离,内部流量全部使用本地唯一地址。对于需要访问外界的主机则可以分配多个 IPv6 前缀,根据 RFC 3484 的规则,访问内部地址时本地唯一地址有更高优先级。

对于极端的情况,比如网络管理员想要完全隐藏内部 IPv6 的拓扑,就是让这些拓扑隐藏的主机从外面看起来都在网络边界,就像 NAT 做到的那样。有以下三种方法可以做到

  • 让主机加入内部路由协议,把真实的访问节点注入 IGP(内部路由协议)。这种方法有严重的扩展问题,需要主机秘密加入 IGP,防火墙屏蔽来自外部的 traceroute。主机还需要从 IGP 获得的信息判断重复地址。

  • 另一种隐藏内部拓扑的方法是使用隧道机制,移动 IPv6(Mobile IPv6)就是一种。这种情况下其实就是 Mobile IPv6 的 Home Agent 取代了 NAT 在网络边界上的功能。(由于我对 Mobile IPv6 一无所知,此处就不详细展开。而且 Mobile IPv6 用得较少,这样复杂的结构大部分网络不值得去实现。)

  • 还有一种方法(如果二层拓扑允许的话),使用 VLAN 把设备连接到边界路由器。这种方法会使得节点认为他们实际上在共享一个公共的网段。缺点是内部的流量都会途径边界路由器,这就跟管理一个分布式 VLAN 一样复杂了。

除了 VLAN 以外的两种方法都会使得子网范围内的多播无法工作。所以要部署需要有限范围多播的应用时要注意和拓扑隐藏的协同。

4.5 私有网络中对地址的独立控制

IPv6 通过 ULA(本地唯一地址) 的使用,为本地(内网)的地址分配提供了自主权。同时 IPv6 简化了每个接口上多个地址的配置,由于节点访问互联网时会使用全局地址,所以 ULA 的 IPv6 NAT 也是不需要的。

另外由于 IPv6 的子网都是 /64 的前缀,不用像 IPv4 那样去优化每个子网的地址使用率,大大减小了操作和配置的成本。

4.6 节约全球地址

IPv6 是基于子网而不是主机分配地址的,像 IPv4 那样省吃俭用分配地址是不必要的。RFC 3177 提供了分配 IPv6 地址的推荐方式。

一个显著的不同就是很多 IPv6 部署场景是一个设备多个 IPv6 地址,而不是 IPv4 那种模式多个主机被迫需要通过 NAT 共享一个地址。

4.7 多运营商接入和重新分配 IP 地址

IPv6 设计上就支持站点和主机同时拥有数个前缀,和多个 ISP 互联。在 IPv4 中支持多地址的根本困难在 IPv6 中不适用。IPv6 站点对活动前缀的添加、删除和重新分配都在 RFC 4192 和 draft-chown-v6ops-renumber-thinkabout-05 里记录了相关文档。然而考虑到跨越多个运营商的会话连续性问题时,IPv6 的多线接入和地址重新分配也是极具挑战性的。ISP 分配的 IPv6 地址空间仍然依赖所连接的运营商。

更换 ISP 或是 ISP 调整地址池时,DHCP-PD 处理外部连接,ULA 前缀处理内部连接,这样的组合基本就不需要修改配置了。

通过适当管理 IPv6 地址的生命周期和多个外部前缀的重叠期,可以实现平滑的先合后换过渡。因为只要旧前缀保持有效,已有连接将继续使用旧前缀,而任何新连接将使用新前缀。

5 案例分析

5.1 大中型私有网络

大部分企业、教育、科研、政府部门的网络都属于这个类型。一般有一个或数个互联网出口。

对它们来说使用 NAT 的好处主要有这么几个:独立于运营商的地址分配,拓扑隐藏和隐私保护。

为大中型企业分配的 IPv6 网络足够大,现在通常是 /48,可以划分为 65536 个 /64 的子网前缀。

要保护此类型网络用户的身份,就需要使用 IPv6 隐私扩展,但这并不能隐藏企业内部网的结构。

要对外隐藏内部网络结构,需要使用某种形式的“不可跟踪”地址。这可以通过使用主机向内部路由协议注入 /128 的主机路由,但是 IGP 一般不是为了处理数千个 IPv6 前缀的,一个企业内可能有数千个要访问互联网的机器(2018 年了,肯定不止这个数)

要么就使用 Mobile IPv6 隧道,移动和非移动设备都要用。

比较欠灵活的方案是在链路或子网上配置基于时间的 IPv6 前缀。这能大大减少 IGP 上的路由数量,但是这种拓扑隐藏的方法有时间和子网两个变量,让审计变得很困难。

站点使用永久 ULA 地址有一个好处,就是换运营商的时候,只有需要连接到站点之外的设备才需要重新分配 IP 地址。内部的服务器不需要更改他们的 IPv6 ULA 地址,这样即使在全局地址更换的时候,也能持续服务。

5.2 小型私有网络

一般这种网络有几个路由器和一个互联网出口,它们的特点有:

  • 通过拨号或者宽带访问连接

  • 没有单独的网络操作中心 NOC

  • 使用 NAT 作为最廉价的连接性和地址管理方案

大部分情况下获得的全球 IPv4 前缀不是固定的,而且很长,经常是 /32 的,没法分配给私有网络里的设备。有些运营商甚至分配 RFC 1918 中的私有地址给用户。

这种网络作为互联网数据接受者的能力受限,即使用户有足够知识管理 NAT,提供对外服务器访问,一个协议/端口只能映射到一个机器,而且这个地址还要是在互联网上可达的。如果 ISP 提供的是私有地址段,可能还需要跟 ISP 协商来获得一个入站的映射。

部署 IPv6 本地网络保护时,有两种方案分配 IPv6 地址:

  • DHCPv6 前缀下发

  • ISP 提供静态的 IPv6 地址段

对于 DHCPv6 前缀下发,可以让 ISP 把 IPv6 前缀自动推送到私有网络上,并且让所有小型私有网络的接口上获得一个 IPv6 前缀。

静态配置的话,跟大中型企业的机制一样。一般用户对拓扑隐藏没有很强烈的需求,使用 IPv6 隐私扩展就足够了。

单个设备为了隐藏身份或者降低攻击面,需要启用 IPv6 隐私扩展。

反过来说,这就要求最小分配一个 /64 前缀而不是单个地址。

5.3 单个用户

给单个用户通常就分配一个 IPv4 地址,运营商对这个地址 NAT,让用户能访问互联网。这就限制了这个设备作为互联网数据接受者的能力。由于 NAT 的有状态特性,这个设备无法成为全球可访问的互联网上的服务器。

使用 IPv6 本地网络保护时,一个用户一个 IPv6 地址。如果用户想要隐藏它的身份,可以启用 IPv6 隐私扩展。

5.4 运营商网络

运营商需要支持三组 IP 域:

  • 本身作为大中型私有网络

  • 骨干网和其他网络设备

  • 给客户分配的地址

第一类网络可以参考 5.1 节

第二类网络可以使用 ULA 或者稳定的独立于运营商的 IPv6 地址。只要部署合适的边界过滤器,外界访问不了封闭环境。

第三类通常分配一个前缀长度正好是 IPv6 地址位边界上的地址,跟 DNS PTR 记录一致。

对于移动运营商,最好是 IPv6 和 IPv4 + NAT 的组合。

6 IPv6 需要填补的空白

由于理论和现实的差距,本地网络保护在很多场景下不能立即部署,而且产品的实现也落后于标准化进程。所以我们列出了下列额外的工作来应对没考虑到的场景。

6.1 简单安全

防火墙上动态“打洞”(允许外界流量进入)还需要更多研究,例如语音呼叫根据既定规则在防火墙上动态添加允许的访问控制条目。

没有理由一个有状态 IPv6 防火墙产品不能自带比今天 IPv4/NAT (防火墙)产品更好的默认配置。

6.2 子网拓扑隐藏

功能上其实不缺,难的是可扩展性和性能以及实现的统一性。

小型环境就跟内部路由结合的主机路由即可。

大规模的部署上需要边界上部署 Mobile IP Home Agent,最好内部流量使用 ULA。

IETF 对这种优化的权衡还需要进一步研究。

6.3 降低隐私地址的可跟踪性

隐私地址可以用于限制外部数据流返回特定主机的方式,但是由于缺乏拓扑隐藏,依然可以得到子网地址位。对于完全的隐私,最好有个最佳实践文档,描述隐私地址和拓扑隐藏的结合。(就是还没做好,2018 年了也没有可靠的解决方案)

6.4 多运营商接入

这个复杂的问题对于 IPv4 来说从来没有完全解决,这就是为什么 NAT 是一个不完全的解决方案。

对 IPv6,有这篇草稿 draft-ietf-shim6-arch-00。(十几年没更新了,说明解决起来也不容易,我个人考虑使用 NPTv6 作为过渡方案)

7 安全考量

尽管通篇都在讨论安全相关的问题,但本文的方法不会引入任何新的安全问题。IPv4 NAT 的卖点是一种安全工具,尽管 RFC 2663 和 RFC 2993 已经讨论了 NAT 对安全真正的影响,供应商还一直在其防火墙中提供地址转换功能。

本文定义了一些 IPv6 的方法,去实现网络管理员的管理目标,但是不会对应用程序和(NAT 副作用带来的)安全造成负面影响。第六节提到了一些额外的优化工作,提高了网络管理员审计和访问控制的能力,进而控制了本地资源的总体攻击风险,他们也就会采取措施来改善本地网络安全。

8 结论

本文介绍了一些可以在 IPv6 站点上组合使用的技术,以保护其网络架构的完整性。

这些技术统称为本地网络保护,保留专用网络“内部”和“外部”之间明确界限的概念,并使得防火墙过滤,拓扑隐藏和隐私成为可能。

但因为它们可以在必需时保持地址透明性,所以这些方法避免了地址转换的缺点同时实现了这些目标。

因此,IPv6 中的本地网络保护可以提供 IPv4 网络地址转换的好处而没有相应的缺点。

宋崟川

声明:本文来自Panabit订阅号,版权归作者所有。文章内容仅代表作者独立观点,不代表士冗科技立场,转载目的在于传递更多信息。如有侵权,请联系 service@expshell.com。