我想知道如何将 NAT 与 IPv6 一起使用。似乎你甚至不再需要它了。那么,IPv6 环境中防火墙配置背后的概念究竟是什么?
有了 IPv6,我们还需要使用 NAT 吗?
关于NAT存在一些普遍的混淆。
NAT 从来没有打算用作安全功能。然而,碰巧在大多数情况下(不是全部),当一台机器只能通过 NAT 访问 Internet 时,该机器就会以某种方式受到“保护”。就好像 NAT 系统本质上也是一个防火墙。
让我们看看它是如何工作的:
- IP 数据包具有源地址和目的地址。每个路由器在看到目标地址后,决定将数据包发送到哪个后续路由器。
- 当路由器实现 NAT 时,它会伪装转发出去的数据包;即数据包以路由器的外部IP作为源地址,而不是实际源。对于传入的数据包,路由器执行相反的操作。TCP/UDP端口号用于了解数据包与哪个内部主机相关。
- 但是,从路由器的角度来看,内部主机具有可直接访问的(私有)IP 地址。NAT 用于内部主机和路由器之外的机器之间的通信。
举个例子:
Inner <---> HomeRouter <---> ISPRouter <---> The Internet
“内部”是您的 PC。“HomeRouter”是执行 NAT 的路由器。“ISPRouter”是您的 ISP 的路由器。
“防火墙效应”如下:通常,即使“Inner”有一个开放的端口(它运行远程可访问的服务,例如在端口 80 上的本地 Web 服务器),来自“Internet”的人也将无法连接给它。原因如下:HomeRouter 向 Inner 传输 IP 数据包有两种方式:
传入的数据包可能带有 HomeRouter 的地址作为目的地,并以 HomeRouter 知道与从 Inner 到 Internet 上某处的传出连接相关联的端口为目标。这仅适用于由 Inner 发起的连接,这意味着该端口将与在 Inner 上运行的服务器的端口不匹配。
IP 数据包包含 Inner 的私有 IP 地址作为目的地,并以某种方式引起 HomeRouter 的注意。但是 ISPRouter 不知道 Inner 的私有 IP,并且不会将用于该地址的 IP 数据包转发给 HomeRouter。源路由可以用来标记一个数据包,其中 Inner 的私有 IP 地址作为目标, HomeRouter 的公共 IP 地址作为中间主机。如果 ISPRouter 支持源路由,那么这样的数据包将到达 Inner,而不管 NAT。碰巧几乎没有 ISP 实际上支持源路由。
因此,NAT的“防火墙效应”依赖于两个属性:
- 攻击者远:攻击者不会直接在家庭路由器和 ISP 之间的链路上注入数据包;他们的所有尝试都必须通过 ISP 路由器。
- ISP 不允许源路由。这是(非常)常见的情况。
因此,在实践中,私人住宅和小型企业中的许多机器都可以在几秒钟内被黑客入侵,除非它们受益于 NAT 的“防火墙效应”。
那么 IPv6 呢?NAT 的设计和部署(广泛部署)是为了应对免费 IPv4 地址的稀缺性。如果没有 NAT,IPcalypse 就已经摧毁了文明(或者可能触发了 IPv6 的实际使用)。IPv6 使用 128 位地址,而不是微不足道的 32 位 IPv4 地址,因此无需使用 NAT 等粗略的变通方法。
您可以将 NAT 与 IPv6 一起使用,但这没有什么意义 - 如果您可以使用 NAT,您为什么要切换到 IPv6 呢?
但是,如果没有 NAT,就没有“防火墙效应”,尽管它可能很脆弱。大多数操作系统现在都支持 IPv6,如果有机会,它们会自动使用它。因此,如果 ISP 决定像那样打开 IPv6,那么许多迄今为止“隐藏”在 NAT 后面的机器将变得可以从外部访问。这很可能会变成一场全球性的黑客狂欢。难怪 ISP 有点……不情愿。
要很好地切换到 IPv6 ,您必须将其启用与一些可靠的、经过深思熟虑的防火墙规则结合起来,这将阻止传入连接,这在 NAT 世界中是不可能的(上面解释了警告),但现在是可行的,这要归功于IPv6的魔力。这里的操作词是“思考”:这需要一些人的时间,这不是免费的。
因此可以预测,只要可以容忍,IPv4 将被使用和维护,并且由于 NAT 和透明代理,这将是一个很长的时间(特别是如果我们成功地将人口控制在 100 亿以下)。
删除 NAT 对我来说最大的问题是隐私的减少。使用 IPv6,我注意到我的所有 LAN 设备都有一个唯一的公共 IPv6 地址,这允许 LAN 上的每个设备被唯一标识。这样就可以更轻松地识别单个设备和用户。
隐私影响,例如跨域跟踪您的活动的能力。广告提供商显然已经使用 cookie 进行了这种类型的跟踪,但是删除 NAT 使他们的工作更容易跟踪单个设备。
注意:此答案的详细信息将假设您使用 Linux 机器作为防火墙。如果您使用其他平台,详细信息可能会有所不同,但大多数原则仍然适用。
我想知道如何将 NAT 与 IPv6 一起使用。
IETF 强烈反对使用 Nat for ipv6。但是,如果您真的想要的话,还是有一些实现的。例如 linux 在 3.7 版本中添加了它。
Linux 实现的工作方式与 IPv4 的 Linux NAT 实现基本相同。我不能谈论其他实现。
似乎你甚至不再需要它了。
人们出于各种原因使用 NAT。
- 地址可用性,他们希望内部主机的地址多于公共地址。
- 地址独立性,他们希望保持其内部地址独立于其连接性的变化。
- 隐私,他们想隐藏其内部网络的详细信息以及哪个内部主机正在向外界发出请求。
- 安全性,NAT 最终充当粗略的状态防火墙(尽管它可能不是一个很好的防火墙)。此外,如果 NAT 规则无法加载,则很可能无法关闭,那么可能的结果是没有连接,而不是完全开放的连接。
同样,尽管 NAT 有许多缺点(至少其中一些缺点具有安全隐患)。
- 某些协议可能会被 NAT 破坏(尽管状态防火墙也可能如此)
- 每个连接都必须被跟踪,并且端口供应有限,这可能导致拒绝服务漏洞。
- 当检测到滥用时,NAT 可以隐藏滥用的来源。
- 处理传入服务可能很麻烦。本地客户端对外部 IP 的访问可能是一个特殊的复杂点。
IPv6 解决了地址短缺问题,它通过允许您并行运行公共和私有地址(尽管这会产生它自己的问题),在某种程度上解决了 ISP 独立性问题。隐私扩展隐藏子网上的哪台计算机正在发出请求,但它们不会隐藏它所在的子网。
那么,IPv6 环境中防火墙配置背后的概念究竟是什么?
您可以在没有 NAT 的情况下进行有状态的数据包过滤,例如,允许所有传出连接同时禁止传入连接的基本配置可能看起来像这样。
ip6tables -P FORWARD DROP
ip6tables -A FORWARD -i ethinternal -j ACCEPT
ip6tables -A FORWARD -m conntrack –ctstate ESTABLISHED,RELATED -j ACCEPT
防火墙仍然以与 nat 几乎相同的方式跟踪连接,但它仅使用该信息来过滤数据包,而不是执行转换。
您需要注意的一件事是确保您的防火墙无法关闭。我建议您不要在 sysctl.conf 中启用转发,而是在防火墙脚本的末尾启用它并在防火墙脚本中使用“set -e”。只有在防火墙脚本成功运行时才会启用这种方式转发。
如果您还想过滤进出防火墙本身的流量,您必须考虑 ICMP。某些类型的 ICMP 需要从本地链路允许,否则网络将严重中断。
除此之外,它与 ipv4 并没有太大区别,决定你想要允许什么并允许它。
NAT 并没有真正比公共地址更安全(并且由于地址转换的性质,它们自己也有很多令人讨厌的缺陷)。要路由到您的私有 ipv4 地址,攻击者只需指向您的路由器,然后完全由防火墙过滤掉该流量。
切换到 ipv6 在这方面不会改变任何东西,除了您过滤的子网将是世界可路由的,而不仅仅是攻击者可路由的。其他一切都保持不变——如果您需要限制 ipv6 子网,您可以对 /64 进行子类化并应用防火墙规则来过滤允许哪些流量到达它。