背景(跳过问题)
IPv4 需要 NAT 来保护地址。NAT 的防火墙特性也有利于安全性。IPv4 NAT 防火墙规则是“阻止传入数据包,除非在过去 X 秒内remote-address:port -> local-address:port
发送了传出数据包”。local-address:port -> remote-address:port
对于点对点 UDP 应用程序,这需要引入服务器进行 NAT 打洞。为了Client
连接到Server
(均位于防火墙 NAT 后面FW
),我们需要执行以下步骤:
periodic
keep-alive
Introducer <------>
Client FW FW Server
------------------------------------------
request
introduction
-------> Introducer
Client FW FW Server
--------------------->X
request connection
------------------------------------------
notify
introduction
[Client address:port]
Introducer ------->
Client FW FW Server
------------------------------------------
Client FW FW Server
<---------------------------
hello
------------------------------------------
Client FW FW Server
--------------------------->
request connection
------------------------------------------
Client FW FW Server
<---------------------------
accept connection
------------------------------------------
Client FW FW Server
<-------------------------->
periodic keep-alive
IPv6 不需要 NAT,但似乎可能需要为家庭用户配置类似的防火墙规则(请参阅下面的参考资料)。
我的问题:
问题 1:如果 IPv6 防火墙规则与 IPv4 NAT 防火墙规则一样(只是没有地址转换位),那么我是否正确地认为对等应用程序仍然需要完全相同的 UDP 打洞过程?
第二季度:大多数家用 IPv6 路由器的默认/现成防火墙规则是否与顶部总结的 IPv4 NAT 防火墙规则一样?如果有不同,那是什么不同?是否有默认的接受所有传入数据包行为?
参考
这些支持了 IPv6 家庭路由器应该/可能具有类似 NAT 的防火墙规则的观点:
使用 NAT 最大的安全优势是它会强制您进入默认拒绝配置。为了通过它获得任何服务,您必须明确打洞。... 正确配置的防火墙提供与 NAT 网关完全相同的服务。
http://www.brynosaurus.com/pub/net/p2pnat/
IPv6 防火墙通常仍会默认阻止未经请求的传入流量,这使得漏洞攻击甚至对 IPv6 应用程序也很有用。
(由于我的积分只够制作 2 个,因此以下链接被禁用)
http://tools.ietf.org/html/rfc5128
即使未来的“纯 IPv6 世界”仍可能包含防火墙,这些防火墙采用与 NAT 类似的过滤行为,但没有地址转换。过滤行为会干扰 P2P 应用程序的功能。因此,使用本文档中描述的技术进行 NAT 穿越的 IPv6 应用程序也可能与某些具有与 NAT 类似的过滤行为的防火墙兼容。
http://stackoverflow.com/questions/4647633/nat-traversal-and-ipv6
防火墙不会很快消失,参见
http://tools.ietf.org/html/draft-ietf-v6ops-cpe-simple-security-16
“为提供住宅 IPv6 互联网服务而建议在客户端设备中采用的简单安全功能”。... 您可以预料到,无处不在的防火墙将继续干扰应用程序协议,并要求您执行 IPv4/NAT 所需的所有相同的基本遍历方法,以便在应用程序路径的中间盒中维护状态记录。
http://news.ycombinator.com/item?id=8229327
人们一直说,你应该使用原生 IPv6 和防火墙来代替 NAT 攻击,以获得相同或更好的保护级别。但是,有状态 IPv6 防火墙不会带来与 NAT 相同的问题吗?我是否仍然需要使用保持活动数据包或 PCP 等协议才能实际使用 P2P?
我也在焦急地等待 IPv6 的兴起,但我猜测 - 在一个理智的世界里 - 消费者路由器仍然会默认使用 IPv6 的状态防火墙,因此需要继续进行漏洞挖掘。:/
然而,这些似乎表明 IPv6 不会有任何类似 NAT 的防火墙规则,或者打洞过程是不必要的:
http://www.raknet.net/raknet/manual/ipv6support.html
仅使用 IPV6 时无需 NAT Punchthrough。只要您知道系统的 IP 地址,您就可以直接连接到该系统,即使该系统位于路由器后面。
http://www.zerotier.com/blog/?p=226
这是对基本限制的一种丑陋的解决方法,IPv6 越早淘汰它,我们就越早开始真正部署新一代互联网协议。... 因为 NAT 几乎总是有状态的,所以需要频繁的保持活动数据包来保持所有连接打开。... 如果您不每 120 秒发送一次数据包(对于典型的 NAT),您的连接将被遗忘并重置。使用 SSH 的 NAT 后面的用户在尝试长时间保持 SSH 会话打开时可能已经发现了这一点,SSH(与大多数协议一样)有一个协议保持活动选项可用作解决方法。
答案1
在回答这些问题之前,我想先谈谈其中的一些假设。
NAT 的防火墙特性也有利于安全。
这种情况经常被重复,但事实并非如此;见下文。
IPv4 NAT 防火墙规则是“阻止传入数据包远程地址:端口 -> 本地地址:端口,除非在过去 X 秒内发送传出数据包本地地址:端口 -> 远程地址:端口”。
这些不是 NAT 规则,但是有状态的规则。有状态规则比之前的旧式无状态规则更安全,因为它们本质上是自适应的;也就是说,防火墙对出站流量的仔细研究使其能够对入站流量做出比单纯基于端口/地址的规则更精细的判断。
NAT 防火墙确实是隐式状态的,但重要的是要认识到状态性是您所追求的,而不是 NAT,因为 NAT 在 ipv6 社区的某些角落声誉很差,而且正如您所看到的,在 ipv6 中实现它面临着很大的阻力。
您描述的 UDP“引介器”过程不仅限于 NAT 场景,还适用于服务不依赖于单个知名端口号的情况。RPC 是一个典型的例子,服务绑定到一个(半)随机端口,然后向端口映射器注册该端口及其名称,这做使用一个众所周知的端口(111/TCP 和 111/UDP)。希望连接的客户端联系端口映射器以找出他们所需的服务今天在哪个端口上运行,然后启动与该端口的连接。这正是您的图表所显示的,并且这种情况每天在世界各地运行 NFS 的平面(非 NAT)网络上发生数百万次。
至于你的问题,问题(1)实际上应该是“如果我的 ipv6 防火墙配置为拒绝没有匹配状态的入站 UDP 流量,我的 UDP 客户端是否仍需要发起与外部服务的所有任意连接“。不幸的是,答案是“这取决于“。状态扩展(例如RELATED
中的扩展iptables
)确实允许防火墙允许没有简单匹配状态的流量,因为预先存在的连接已在应用层请求此信息 - 主动模式 FTP 就是典型示例 - 但它需要一个了解相关协议细节的内核模块,而端到端加密的部署使这种深度数据包检查变得越来越困难。因此,如果没有这样的解决方法,问题 1 的答案是是的。顺便说一句,这对于没有知名端口号的 TCP 服务同样适用。
至于问题 (2),对 SOHO 设备的详尽调查可能超出了 ServerFault 的职权范围和能力,但我多年来没有见过防火墙设备 - v4或者v6 - 附带默认打开配置。