2020年安全部署IPv6实战指南:互联网边界防护

本文深入探讨IPv6在互联网边界的安全部署策略,涵盖地址分配过滤、反欺骗机制、ICMPv6精细化过滤、多播控制及协议规范化,提供实际iptables配置示例和脚本工具,助力企业安全过渡到IPv6环境。

安全部署IPv6在2020年第一部分:互联网面向边界

引言

2020年初告诉我们,互联网服务的需求比以往任何时候都要高。IPv4已经耗尽,过度使用、滥用,并且超出了其生命周期。除了我们在可变长度子网划分方面的英勇尝试之外,这给企业路由器带来了巨大负担,并呈指数级增长了全球路由表,但我们仍然用完了地址。

网络地址转换(NAT)同样被过度使用和滥用。它并不是,也从未打算成为一种安全技术。NAT只是地址保护,而我们现在在全球部署的NAT网络背后还有其他NAT网络,这超出了荒谬,更不用说远远超出了其原始设计意图。我们向所有勇敢延长IPv4寿命的人表示赞赏,但现在是时候致力于IPv6了。

与其专门提供IPv6教程,我将具体讨论我们必须具备的基础设施安全,以安全部署该协议。

基础知识

首先,IPv6是一个128位地址空间。在以太网头中,它被称为IEEE 802协议0x86DD,或者如果封装在IPv4头中,则作为IP协议号41(6in4)携带。

截至目前,IANA已向各种区域互联网注册机构分配了IPv6地址空间,包括ARIN、RIPE NCC、APNIC、AFRINIC、LACNIC。

地址分配如下:

  • /12:七个IPv6块分布在各种RIR中。
  • /16:一个块用于6to4转换。
  • /18:一个块给RIPE NCC。
  • /19:两个块,一个给RIPE NCC,另一个给APNIC。
  • /20:三个块,一个给RIPE NCC,两个给APNIC。
  • /22:三个块给RIPE NCC。
  • /23:十八个地址块分布在各种RIR中。

这些地址分配是巨大的!如果只有12位设置为网络前缀,那么互联网服务提供商可以进一步分配116位。就纯主机地址而言,那是2^116,即8.4e24个地址!

大多数服务提供商会进一步分配/32、/48和/64块的地址。参考https://tools.ietf.org/html/rfc6177获取更多信息,因为这是一个活跃的讨论。要查看当前IPv6 BGP全局路由表的状态,请参考https://bgp.potaroo.net/v6/as2.0/index.html。

现在,似乎如果你的组织是多宿的,拥有自己的BGP自治系统号(ASN),你可能会被分配一个IPv6 /48,这是一个巨大的2^80地址,你可以进一步子网化为/64。

如果你是单宿或隧道连接,你可能会收到一个IPv6 /64分配,这是整个IPv4地址空间的两倍,如果你愿意,你可以在内部进一步子网化这个空间。

建立测试环境

我选择与Hurricane Electric创建一个账户,基于其广泛的覆盖范围,在几分钟内,只要我使用IP协议41隧道流量,我就被授予了一个IPv6 /64地址块。https://en.wikipedia.org/wiki/6in4

我的Ubuntu系统上的隧道接口配置如下。(当然,有一些编辑)。你诚实地认为我会给你我的IPv4/IPv6地址,是吗?

安装和配置DNS后,进行基本连接测试。使用“dig”测试本地DNS解析器,学习如何 exactly 在IPv6中使用它。

然后尝试ICMP echo请求/回复和traceroute。在IPv6世界中,这些命令在Linux中变为“ping6”和“traceroute6”。

安全讨论

在高层次介绍之后,让我们谈谈安全,这是真正需要行动的地方。我想将其分解为四个重要主题:IPv6寻址和范围、互联网控制消息协议(ICMPv6)和边界网络安全。

你可能会注意到内部网络安全明显缺失。考虑到这里的覆盖范围广度,我决定将内部网络安全主题留待后续文章。

IPv6寻址和范围

有三种不同类型的IPv6地址:单播、任播和多播。单播和任播地址都有两种不同的范围:链路本地和全局。对于多播,第二个地址八位组中的四个最低有效位决定了范围。多播地址以“ff0”开头,不同范围的地址如下:

  • FF00 => 保留/未使用
  • FF01 => 接口本地(主机绑定/环回多播)
  • FF02 => 链路本地
  • FF03 => 领域本地
  • FF04 => 管理本地
  • FF05 => 站点本地
  • FF08 => 组织本地
  • FF0E => 全局
  • FF0F => 保留/未使用

互联网控制消息协议版本6(ICMPv6)

在开始这些讨论之前,我们不能避免谈论ICMPv6,没有它IPv6就无法工作。第一个美妙而令人兴奋的启示是IPv4地址解析协议(ARP)消失了,真是太好了!

IPv6非常依赖多播来实现许多功能,并且大量的发现使用ICMPv6和多播一起。类似于v4中的ICMP,数据包中有ICMP类型和代码。

ICMPv6可以分为四类:错误消息、信息消息、邻居发现消息和其他IPv6协议控制消息。

错误消息

  • 类型0:保留/未分配
  • 类型1:目的地不可达。代码字段包含原因。
    • 代码0:无路由到目的地
    • 代码1:管理禁止
    • 代码2:未分配
    • 代码3:地址不可达
    • 代码4:端口不可达
  • 类型2:数据包太大。对于路径MTU发现机制正常工作很重要。
  • 类型3:时间超出消息
    • 代码0:传输中跳数限制超出。(生活教训:不要让TTL过期,因为你将被丢弃。)
    • 代码1:分片重组时间超出
  • 类型4:参数问题消息
    • 代码0:遇到错误头字段
    • 代码1:未识别的下一个头类型
    • 代码2:未识别的IPv6选项遇到
  • 类型5到127:未分配或保留用于实验

信息消息

  • 类型128:回显请求
  • 类型129:回显回复
  • 类型130:多播监听查询
  • 类型131:多播监听报告
  • 类型132:多播监听完成

邻居发现消息

  • 类型133:路由器请求
  • 类型134:路由器广告
  • 类型135:邻居请求
  • 类型136:邻居广告
  • 类型137:重定向

其他IPv6协议控制消息由各种RFC定义。类型138到161当前已定义。请参考https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml获取更多信息。

类型162到255:未分配、保留或实验使用

边界网络安全

正如你可能想象的那样,对于边界网络安全,我们用于保护IPv4的许多概念实际上可以移植到IPv6。对于这部分讨论,让我们将主题分解为以下类别:

  • 分配地址空间过滤
  • 反欺骗过滤
  • ICMPv6过滤
  • 多播过滤
  • 协议规范化
  • 外部边界网关协议安全
  • DMZ/互联网面向服务器地址分配

边界:分配地址空间过滤

这里的替代主题名称可能是“火星人的回归”或“Bogons再活一天”。简而言之,IPv6中有大量未分配的地址空间,除非数据包来自分配的地址块,否则不应允许进入你的网络。

实际上,这非常简单。IANA今天分配了35个地址块。你可以在边界路由器上定义一个ACL,只允许来自这35个块的流量,并丢弃其他所有内容。使用我的Linux隧道解决方案,我使用了iptables和相关ip集,实现如下:

注意,在上面的屏幕截图中,我假设路由器(隧道端点)不仅可能自己发起流量,而且将来将负责跨某些定义子网的IP版本6流量转发。

当然,任何OSI第4层过滤也必须在上面的规则集中实现,因此这只是一个基线起点。请记住,OSI第4层及以上的IPv6与IPv4基本相同。

另一件需要注意的事情是,IANA的IPv6分配当然会改变。在我的情况下,我使用了一个简单的shell脚本来解析分配的块,并用正确的数据更新我的IP集。因为我是一个好人,我在这里包含那个脚本。

边界:反欺骗过滤

黄金法则是,不应有任何数据包进入你的网络,其源地址代表你分配的地址块。同样,不应有任何数据包离开你的网络,其目的地址匹配你分配的地址块。

边界:ICMPv6过滤

如上所述,使用ICMPv6,IPv6协议就会中断,使得保护ICMPv6的主题不仅对边界而且对网络内部都极为关键。你不能采取IPv4风格的幼稚方法,只是丢弃这个协议,而是需要更加细致。

过滤ICMPv6可以分为两类:从边界安全设备发起的流量, versus 应该传输通过安全设备的流量。我将这部分讨论限制在传输流量上,这些流量对组织的边界安全策略立场很重要。

你应该允许传输流量通过往返互联网。所有其他传输ICMPv6流量应该被丢弃。这些是我的意见结合https://www.ietf.org/rfc/rfc4890.txt的解释。

  • 类型1:目的地不可达,你可以选择性地只选择“端口不可达”代码。
  • 类型2:数据包太大。你不想破坏路径MTU发现。
  • 类型3:时间超出,但仅代码0(TTL/跳数限制过期)。
  • 类型4:参数问题(仅代码0和1)
  • 类型128/129:你可以酌情允许ICMP回显请求/回复,但适用与IPv4相同的注意事项。如果你丢弃,可能会破坏Teredo隧道,因此请小心应用。
  • 类型144到147适用于启用移动性的网络,并且可以在理解功能损失的情况下选择性地丢弃。

另一个重要点是,组织需要制定策略和操作决策, related to 组织是否希望参与全局多播源。如果是,那么传输流量将需要包括多播路由器发现、广告和终止消息,这些是类型151到153。

关于从边界安全设备发起的ICMPv6消息,上述列表, excluding 启用移动性的类型144-147,应该被允许通过。此外,地址选择和路由器选择消息应该被允许通过,包括:

  • 类型133-134:路由器请求/广告
  • 类型135-136:邻居请求/广告
  • 类型141-142:反向邻居发现请求/广告
  • 所有其他多播接收器、路由器发现以及SEND路径通知消息。(参考RFC)

ICMPv6类型137,重定向消息代表 significant 安全威胁,应始终被丢弃。与任何网络数据包过滤一样,默认“拒绝所有”除非明确允许是最 sound 的方法。

如果可能,实施对任何单播ICMPv6的源和目的地址的数据包检查。具体来说,如果数据包内的嵌入有效负载没有与ICMPv6数据包的源地址匹配的目的地址,它应该被丢弃。相反,如果嵌入的数据包有效负载没有与消息的目的地匹配的源地址,它应该被丢弃。

除了这些过滤决策之外,你应该始终通过应用所有ICMPv6消息的速率限制配置来限制拒绝服务攻击的潜力。

在我看来,对于ICMPv6的未分配、保留或私有实验消息,没有策略决策是必要的。所有这些剩余消息应该被丢弃。

供你参考,这里是我的Linux iptables规则,用于通过我的路由器转发传输ICMPv6,这些规则非常ICMPv6类型特定,并应用了速率限制器。

此外,下面是ICMPv6 iptables规则的屏幕截图,用于处理内部LAN内的邻居和路由器发现。这些 deliberately 不应用于隧道ipv6接口,并且当然有一个默认的数据包丢弃策略 beyond 被接受的。

边界:多播过滤

如果域间多播不可取,那么严格的边界过滤是必不可少的。此外,任何以多播作为源地址的数据包欺骗当然是欺骗的,应该被丢弃。假设你的策略是不参与域间多播,那么你应该在边界过滤以下内容:

  • 任何源地址为多播的数据包
  • 阻止/丢弃保留和未使用/未分配的多播目的地
    • FF00::/16(保留)
    • FF06::/16, FF07::/16(未分配)
    • FF09::/16 through FF0D::/16(未分配)
    • FF0F::/16(保留)
  • 阻止/丢弃所有全局范围多播目的地(FF0E::/16)
  • 阻止/丢弃所有站点本地范围多播目的地(FF05::/16)
  • 阻止/丢弃所有组织本地范围多播目的地(FF08::/16)
  • 考虑阻止/丢弃领域本地(FF03::/16)。这些将特定于其他RFC,并且必须是一个策略决策。

更具体的信息,请参考https://tools.ietf.org/html/rfc7346。

边界:协议规范化

IPv6有一个协议头 labeled “下一个头”。在遇到OSI第4层头之前,可以继续将扩展头链接在一起,形成一个极长的扩展头链。

使用长链的扩展头创建拒绝服务攻击是可能的,所有这些都需要由边界安全防火墙和/或路由器处理。

扩展头攻击也可以被利用来通过防止完整数据包检查来盲化入侵防御系统(IPS)。

除了上面的扩展头表之外,正常的OSI第4层协议编号用于TCP(6)和UDP(17)。上表中缺少的是扩展头59,它具有“无下一个头”的特殊含义。

有一些规范化规则应由数据包检查设备(如防火墙和入侵防御系统)强制执行。

  • 每个扩展头不应出现多次,除了目的地选项头。
  • 逐跳选项头应只出现一次,并且应始终是列表中的第一个头。
  • 目的地选项头应在列表的最后,并且最多出现两次。
  • 分片头不应出现多次。

我认为相当 self-evident 的是,扩展头如果不被适当规范化 and/or 过滤,会 present 安全风险,并且如果由数据包规范化设备处理,也会 present 拒绝服务风险。

一个 particular 安全关注 presented 是使用路由选项头(43)以及类型0, known as 一个RH0攻击。路由头与IPv4严格源和松散源路由选项非常相似,允许攻击者指定一个 particular 第3层路径来路由数据包。

更糟糕的是一个用例, whereby 同一个地址可以包含在单个路由头中多次,设置一个潜在的数据包振荡和放大攻击。

在目的地选项头和逐跳选项头内,有可能包含填充选项(PADN)以填充到8八位组边界。这些填充选项必须始终设置为零值,否则可能被视为隐蔽通道机制。

总结建议:

  • 确保数据包规范化设备(防火墙或IPS)能够强制执行上述扩展头规则。
  • 丢弃任何包含路由选项头(43)且类型0(源路由)的流量。
  • 丢弃任何在目的地或逐跳扩展头内的填充选项包含非零数据的流量。
  • 丢弃任何包含保留、未定义或以其他方式用于实验和测试的扩展头的流量。

外部边界网关协议安全

边界网关协议(BGP)仍然与我们同在,并广泛用于IPv4和IPv6广域路由表。幸运的是,随着IPv6路由表的引入和类特定地址边界的利用,大小和处理要求 significantly 小于高度 fragmented 的IPv4路由表。

在IPv6世界中部署BGP的类似安全关注与IPv4一样存在。

  • 使用显式配置的BGP对等体
    • 威胁包括TCP序列号预测,因为BGP是一个长寿命连接。
  • 使用基于哈希的对等体身份验证。MD5哈希仍然常见。
  • 可选地利用IPSEC隧道进行对等。
  • 使用环回地址进行对等
    • IP对等地址不能通过traceroute轻松确定。
  • 基于数据包跳数限制(TTL)过滤BGP对等体流量。对等路由器将发送跳数限制为255的BGP,因此只接受跳数限制为254及更高的BGP流量。
  • 过滤正在接收的前缀长度。大多数提供商只会基于/32及更短或特定前缀长度进行过滤。
  • 过滤长的自治系统号(ASN)路径。使用某种形式的路由策略映射可以用于强制AS路径小于特定长度。一个数字在或 around 40应该足够。参见下图来自https://bgp.potaroo.net/cgi-bin/plota?file=%2fvar%2fdata%2fbgp%2fv6%2fas2%2e0%2fbgp%2dmax%2daspath%2dlength%2etxt&descr=Maximum%20AS%20Path%20length&ylabel=Maximum%20AS%20Path%20length&with=step。
  • 过滤路由更新中的私有AS号码。IANA已指定AS号码64512 – 65534为私有。
  • 过滤路由更新中的保留AS号码(0和65535)。
  • 记录BGP邻居活动!
  • 在BGP对等体之间禁用ICMPv6邻居发现(ND)。没有必要。
  • 如果可能,考虑部署单播反向路径转发检查(URPF)。在严格模式下,数据包必须在路由器将用于路由目的地/返回数据包的接口上接收。在松散模式下,数据包必须在包含在路由表中某处作为目的地的任何接口上接收。

边界:DMZ/互联网面向服务器地址分配

一旦你保护了你的地址分配,你可能正在处理一个/48或/64地址块。现在,当然,像任何其他组织一样,欢迎你进一步子网化这个分配,随你喜欢。

无论是在云托管情况还是你自己的DMZ/互联网面向部署中,我建议你保持子网相当大。例如,你可以选择将你的/64块切割成/72子网或类似,并可能分配其中一两个用于你的组织DMZ。

当你执行子网划分时,虽然你的路由器网关地址可能会 predictable 地分配以保持一致性,但 highly 推荐以随机方式分配你的服务器地址。这将减轻扫描/侦察攻击阶段服务器发现的风险。由于地址空间如此 vast,这实际上成为一种“稀疏”分配,使得发现 significantly 具有挑战性。

你还希望静态地址你的服务器,而不是依赖IPv6无状态地址自动配置(SLAAC),这更适用于住宅ISP上下文中的客户端站地址分配。在管理组织上下文中,操作员更可能偏好DHCPv6进行地址分配, due to 可以施加的额外控制。

你甚至可以随机更改你的地址分配,只要你保留 ability

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计