IPv6是一场彻头彻尾的噩梦--这就是为什么

2020-11-05 20:09:40

理论上,IPv6是解决很多问题的解决方案,包括不断缩小的IPv4地址空间。IPv6是1997年的草案(!),并于2017年成为真正的互联网标准。坦率地说,它只是在没有足够好处的情况下增加了太多麻烦的事情之一。

好吧,是的,IPV6的地址空间很大。IPV4使用32位地址,总共有4,294,967,296个地址。IPV6使用128位地址,这意味着…。340,282,366,920,938,463,463,374,607,431,768,211,456地址。1整个v4空间可以放入v6空间$7.922816251426434\x 10^{28}$。2分配给人的默认地址为a/64,这意味着前一半的地址是固定的,而整个后半部分是网络唯一的部分,这意味着大多数人在家里有18,446,744,073,709,551,616个地址可以玩。3与v4相比,在v4中,大多数网络都在/24左右,这意味着前三个分组是固定的,您得到的是…。254个地址。另外,在上下文中,标准/64分配可以再次将整个v4地址空间放入其内部4,294,967,296次。(是的,这是IPv4地址空间中的地址数量。这就是当你将一个权力除以一半的权力时会发生的事情。)。

考虑到大多数高级管理机构已经用完了地址,IPv4地址是稀疏的,但是因为CIDR和NAT是一种东西,我们真的已经开始压缩我们的使用了。我的整个房子有60多个IP,占据了…。2,根据世界其他地区的说法。

人们批评IPv4的一件事是分配太糟糕了。例如,任何以127开头的地址都是本地主机。通常情况下是127.0.0.1,但从127.0.0.0到127.255.255.255的任何地址都意味着完全相同的东西。那就是16,777,216个地址,字面上都是本地主机地址。按数字计算,地址空间的0.39%,但请记住这一点。

同样,任何以0开头的地址实际上都是“当前网络”(仅作为源地址有效),也就是另外1600万个地址。

私有网络还有多个地址块,10.0.0.0/8、172.16.0.0/12和192.168.0.0/16,总共有17,891,328个地址。

是的,与IPV6相比,IPV6是更好的…。在理论上。只有一个环回地址,::1。同时…。FC00::/7(26,58,455,991,569,831,745,807,614,120,560,689,152地址)是私有地址空间(稍后将详细介绍),FE80::/10(332,306,998,946,228,968,225,951,765,070,086,144地址是本地地址空间,FF00::/8(1,329,227,995,784,915,872,903,807,060,280,344,576地址。)。是组播。是的,你看到一种重复出现的模式吗?尽管整个“特殊”地址分配恰好占整个IPV6地址空间的1.271,但我们仍然在分配大量的地址。历史会重演,你可以在这里看到这一点。

我承认,IPV6中的多播是特殊的,因为地址中的一些位是特殊标志,而且一种形式的多播实际上包括响应节点的地址,所以它不只是一个任意数字,而是…。得了吧,有这么大的空间,这有点不必要。

我们都知道IPV4地址是什么样子的,对吧?0-255范围内的四个点分十进制分组。例如,192.168.5.225。IPv6使用八个分组,每组四个十六进制数字,用冒号分隔。例如,2607:f0d0:1002:0051:0000:0000:0000:0004.That’s…。非常不好用,所以我们有几条缩写规则。可以删除组前的任何零,结果是:2607:f0d0:1002:51:0:0:0:4。由于这仍然是重复的,您可以用空的:2607:f0d0:1002:51::4替换一个包含多组全零的序列。为了记录,这就是环回地址为::1的原因。完整地址为0000。而且比IPv4地址更难说。

请记住,此地址违反了url规范,因为:字符专门用于将主机部分(例如,google.com)与要连接的端口(假设是非标准的)分开。例如,我可以通过http://192.168.5.43:9091.See到达我的Torrent客户端:那里?因为传输侦听的是端口9091,而不是端口80。我们如何解决这个问题?好的,通过自然地再次断开它。要连接到原始的IPV6地址,你把它包在方括号里。要直接连接到2607:f0d0:1002:51::4,那是http://[2607:f0d0:1002:51::4]/为什么这是一件事?!

好吧,诚然,自从…以来,IPV6有点依赖于域名系统。几乎所有东西都使用dns,当然,实际名称比32位十六进制数字更容易记住,但dns并不神奇。除非你有自己的dns服务器(实际上没有那么难),否则你仍然需要手动输入地址。当然,如果你有pfense来管理你的网络,每个静态dhcp租约都会在dns中注册,但它必须占用dhcp租约。如果这个设备不能…,那么你还是需要手动输入地址。当然,如果你有pfense来管理你的网络,每个静态的dhcp租约都会在dns中注册,但它必须占用dhcp租约。如果这个设备不能pfense。好吧,我希望你不介意手动打出来连接,这样你就可以配置它了。

更棒的是,rDNS.rDNS,或反向DNS,是使用在PTR记录中返回相关主机名的IP地址执行的DNS查询。例如,google.com解析到的IPv4,216.58.192.142,可以被查询为142.192.58.216.in-addr.arpa以获得它的“真实”名称,这是ord36s01-in-f142.1e100.net的PTR记录。前面有in-addr.arpa。它是向后的,因为DNS的分层性质,它从右到左运行,与IP相反。当然,还有用于IPv6的RDNS:

$Dig-x 2607:f0d0:1002:51::4;<;<;>;dig9.11.3-1ubuntu1.12-Ubuntu<;<;>;-x 2607:f0d0:1002:51::4;;全局选项:+cmd;;得到答案:;;->;>;Header<;<;OPT PSEUDOSECTION:;EDNS:版本:0,标志:;UDP:65494;;问题SECTION:;4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.5.0.0.2.0.0.1.0.d.0.f.7.0.6.2.ip6.arpa.。在Ptr;中;回答SECTION:4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.5.0.0.2.0.0.1.0.d.0.f.7.0.6.2.ip6.arpa.。3600in PTR 4000.0000.0000.0000.1500.2001.0d0f.7062.ip6.static.sl-reverse.com.;;查询时间:731毫秒;服务器:127.0.0.53#53(127.0.0.53);;时间:美国东部时间2020年8月30日00:52:50;消息大小接收:180。

这太疯狂了。IPV6RDNS TLD只有ip6.arpa,而IP部分是…。每一个十六进制数字,颠倒过来。

IPv6的核心支柱之一是大多数流量的处理应该发生在端点-路由器除了读取和转发之外不做太多的工作,实际的数据处理很少。IPv6报头虽然比较庞大(因为巨大的地址),但也简单得多。固定的版本代码(6),流量类别(DiffServ+ECN),流标签,它实际上是一个随机值,对于每个属于相同逻辑连接的数据包、长度、下一个报头类型和TTL来说都是恒定不变的。它是一个固定的版本代码(6)、流量类别(DiffServ+ECN)、流标签(Flow Label),对于属于相同逻辑连接、长度、下一个报头类型和TTL的每个数据包来说,该值是恒定的。显然)。就是这样。IPv4报头包含13个字段外加可选部分,而IPv6报头包含平面8。当然,您实际上可能需要其他细节,这就是下一个报头字段的用武之地。IPv6不是将各种选项打包到标准的全局报头中,而是使用附加的报头扩展,这些扩展可以一个接一个地附加以提供信息,比如用于分段或IPsec。4Next Header字段中的值标识下一步的内容,该行中的最后一个Header将使用该字段指示包含的协议,可以是TCP、UDP或其他协议。

我的意思是,几乎每个设备都使用以太网,以太网有帧校验序列,udp有校验和选项,tcp有必需的校验和…。如果我们想要简单地处理数据包,丢弃总和。确实,在某种程度上这是有意义的。即使没有这个,这也意味着大多数程序都有两个校验和:帧传输时的以太网FCS

最后一点是,这也给另一个协议带来了变化:UDP。在IPv4中,UDP校验和字段可以(通常也会)留空为全零,这意味着“没有校验和”。在IPv6中,这现在是不允许的,并且仍然会对全零校验和进行…检查。然后发现无效。所有IPv6上的UDP数据包都必须计算有效的校验和。

因此,设备之间的每条链路都有MTU(最大传输单位)。对于普通的以太网链路,减去帧开销,这是1500字节。如果您的设备支持巨型帧,则接近9000字节。并不是所有的链路都是相等的。有些设备可能一端具有高MTU链路,而另一端具有较低的MTU链路。例如,我的路由器可能在内部支持巨型帧,但广域网端不允许这样做。为了解决这个问题,我们有碎片。

如果路由器由于MTU差异而无法转发帧,则在允许的情况下,它将使用IPv4报头的More Fragments标志和片段偏移量字段将数据包分成多个块,并将数据包分成多个帧逐个发送,另一端可以重新组装。请注意,我说的是“如果允许”。IPv4报头中有一个“不要分片”标志,如果发送设备设置了该标志,则不能支持这种大小的数据包的路由器将发回ICMP“Packet Too Large”(数据包太大)消息,该消息会弹回。这意味着,在发送数据时,您唯一关心的MTU是您直接连接的设备的MTU;你自己的链接。

IPv6不允许这样做。中间路由器不允许对数据包进行分段,而是会发回ICMP错误。如果您要对数据包进行分段(这也是非常不鼓励的),则发送设备可以添加分段报头扩展。因此,要么根本不对数据包进行分段,要么从始发设备对数据包进行分段。IPv6还希望发送者通过实际侦听ICMP数据包太大的消息来执行路径MTU发现,该消息包含该节点的MTU。因此,IPv6还希望发送者执行路径MTU发现,方法是实际侦听包含该节点MTU的ICMP数据包太大的消息。因此,IPv6不允许对数据包进行分段,而是将其发回ICMP错误。如果您要对数据包进行分段(这也是非常不鼓励的),则发送设备可以添加分段报头扩展。不要超过IPv6的最小MTU,即1280字节。

如果你了解我,你就知道我总是说,计算机网络是一个奇迹,只有通过胶带、工程师的祈祷和愚蠢的运气才能维系在一起。没有什么比将IPv6引入网络更正确的了,在这个网络中,几乎每个与我交谈的人都在为他们提供选择的所有东西上彻底禁用了IPv6-这太令人头疼了,不得不处理所有这些-如果它被启用,90%的新网络问题变成了这样一个事实,即设备现在正在做你从未想过的意想不到的IPv6事情。这是一个令人头疼的问题,如果它被启用,90%的新网络问题变成了这样一个事实,即设备现在正在做你从未想过的意想不到的IPv6事情。

但除此之外,如果你想用IPv6运行网络,你可能不得不同时运行4和6,因为IPv4仍然很强大。这意味着对于涉及特定主机或网络的每条防火墙规则,你都需要两条:一条用于IPv4块,另一条用于IPv6块。如果你改变了一个,而忘记了另一个,那是不可能的。

一般情况下,当你得到一个IP地址后,这个地址就可以在全球范围内进行路由了--任何人都可以从任何地方访问它,就像好莱坞式的那样。

但是,如果您想要私有网络,有一个前缀:从fc00:0000:0000:0000:0000:0000:0000:0000:0000:0000:0000:0000到fdff:ffff:ffff(fc00::/7)之间的任何内容都被认为是私有网络不可路由的。从技术上讲,这里允许您修改的第一位应该始终是1,这意味着您实际的rfc兼容范围是fd00::/8,即fd00:0000:0000:0000:0000:0000:0000:0000到fdff:ffff:fff。地址的一半,但仍然很多。是的,实际的规范更复杂,并且在“网络”区域定义了几个部分,但是…。好吧,你明白我的意思了。

所以现在的问题是:假设你已经做到了这一点。你如何将数据包路由到这些私有IP?答案是网络地址前缀转换。等待…。什么?

是。NAT是一种IPv4协议。NPT是一种IPv6技术。使用IPv4,你可以扫描信息包,如果它们符合一定的标准(比如,去往已知地址,比如你的广域网地址),就用一个新的地址交换目的地(或源)地址。这就是我对我的所有服务只使用一个IP的方式:目的地端口决定你的请求被路由到哪个服务器。从这个意义上说,所有未知的流量都会被丢弃,我对其有NAT规则的流量也会被允许通过防火墙。这是一个“默认丢弃系统”(Default Drop System)。这是一个“默认丢弃系统”(Default Drop System)。从这个意义上说,所有未知的流量都会被丢弃,而我对其有NAT规则的流量也会被允许通过防火墙。

例如,假设我在私有地址fd2c:a7c6:2aae:ef93::41上有一个主机,然后我可以为添加一个npt规则,将fd2c:a7c6:2aae:ef93::转换为2607:f0d0:1002:51::。这实际上是1:1的映射,这意味着它是双向的,入站和出站都将被转换。

为此,我可以(也许使用aaaa记录)将服务器的公共IP通告为2607:f0d0:1002:51::41,当数据包以…格式传入时。

这不仅意味着我暴露了我的整个网络,而且我需要为每个不同的目的地提供不同的IP,此外,我还会泄露我的网络的内部结构!你可能不知道前缀,但你会知道确切的子网地址,因为我只翻译一个前缀!

那个“不同的IP”位听起来可能有点…。嗯,那么请记住,对于我运行的一些系统(比如这个博客,使用NNTP),端口号本身就决定了目的地,你甚至仍然可以使用相同的域名进行计数。使用NPT,你无法做到这一点,你必须有一个额外的设备,如第7层代理(如HAProxy)来接收所有内容并将其发送到正确的目的地,这意味着我需要一台专用主机来做IPv4 NAT本来就可以做的事情!

而且情况会变得更好。记住,这将会盲目地交换前缀。过去的日子是“只有我显式地为其创建规则的流量才能进入”。现在,只需添加一个步骤,就可以默认地暴露您的整个网络!现在,您需要防火墙规则来拦截您不想要的内容,并添加显式允许,这一次是手动作为额外的步骤。这更像是一种“默认通过”路由--除非我告诉您不要这样做,否则就让它通过。现在,大多数防火墙都是这样做的。如果某个东西没有NAT规则,那么即使它被允许通过,它实际上也不知道路由到哪里。有了《不扩散核武器条约》,你就没有了那层安全层,防火墙是外部世界和你的网络之间唯一的东西。

如果你还记得关于IPv6的一件事,那就是这件事。正确的。这就是我暂时不会开始运行IPv6网络的原因。

但我还没做完,整个实践都是…。PfSense手册甚至说,我刚才说的可能也不能正确工作,所以,不错,但同时,ipv6的全部要点是所有节点都是全球可路由的,你不需要特殊的私有地址空间或任何类型的转换,它就可以工作。如果你想,哈,隐私,这就是防火墙的用途。这就是…。好的,说真的,这就像是一群不知道技术应该如何工作的人被要求设计一种技术文盲可以真正理解和流利使用的东西,我们有…。这个。就像现在,IETF在写RFC时是不是看了一些网络犯罪电影?世界上任何地方的每台计算机默认情况下都是可以访问的,除非你特别防火墙。我知道即使是在IPv4中,事情也是这样运作的,直到你设置了一个子网边界,但在V6中,它要么是防火墙,要么是没有保护。从技术角度来看,这种端到端的焦点性质真的是考虑不周。而且,正如数据显示的那样,那些积极使用IPv6的设备。从“只是工作”的角度来看,这是不错的,但就像最近的许多事情一样,“好的,它需要无缝工作”这一方面与“实际有用的功能”这一方面严重冲突。

客户端从源0.0.0.0向广播地址发送一个DHCPDISCOVER数据包。

服务器向广播IP(但目的MAC)发送一个DHCPOFFER,其中包含提供的客户端IP、子网掩码、DNS服务器、租用时间和其他信息。

服务器发送带有提议中相同信息的DHCPACK,从而确认IP分配。

这里的DHCP还包括大量编号选项形式的数据,但以下是一些常见的值:

还可以发送一些额外的值,比如默认的MTU(选项26)。有254个有效选项,0x00是填充,0xff是消息的结尾。

在短短四个UDP消息中,一台主机只需开机就可以获得它可能需要的几乎每一位信息。

DHCPv6…。不是很多。协议一分为二,让我们先来看看DHCPv6。这也是一个四步过程:

客户端从其本地链路向“All DHCP”组播地址ff02::1:2发送请求。

一些过时的选项,比如WINS服务器被移除了,但是你会注意到一些东西完全丢失了,比如网络网关。同样,DHCP服务器只提供地址的本地部分,它甚至不提供网络前缀。但是在我们开始之前,这里有一些有趣的东西:DHCP(V4)使用客户端的MAC地址作为它的标识符,IP被租给特定的MAC。DHCPv6使用一个DHCP唯一标识符(DUID),通常是MAC地址,还有其他东西。DUID(Duid),通常是MAC地址。在我们开始之前,这里有一些有趣的事情:DHCP(V4)使用客户端的MAC地址作为它的标识符,IP被租给特定的MAC。DHCPv6使用一个DHCP唯一标识符(DUID),通常是MAC地址,还有其他东西。基于UUID。IP租给DUID而不是Mac,所以实际上很难提前预订。最简单的做法是等待客户端获得租约,然后将其升级为静态分配。哦,当然,这里有一个MAC+Time DUID的示例:00-01-00-01-18-BA-30-56-D8-9D-67-C9-FA-33。您注意到这里的模式了吗。为了简单起见,创造了不必要的复杂性,这是我在计算和网络领域看到的最具讽刺意味的转折之一。

还要注意的是,这在默认情况下也不会发生。只有在SLAAC/RA允许的情况下才会使用DHCP。虽然我马上就会讲到SLAAC,但让我们来谈谈邻居发现协议和路由器通告。

当一台支持IPv6的主机加入网络时,它将发送路由器请求(嗯,我在这里几次看到“Solicate”作为动词,我想我找到了每个人最喜欢的新单词)。可转发帧的可用的IPv6网关将定期发送路由器通告消息,或者,如果它们看到请求,将立即发出广告。

通告包含M和O标志(等待)、最多三个DNS服务器、一个搜索列表(与DHCP相同)和网络前缀。通告包含M和O标志(等待)、最多三个DNS服务器、搜索列表(与DHCP相同)和网络前缀。通告还包含该特定路由器的优先级(低、正常或高)之一。为什么只有三个?问倒我了。不,在同一优先级上有多个路由器通常不是一个简单的想法。如果一个网络上有三个以上的网关(因为这是你现在可以做的事情),那就玩得开心。不管怎么说,托管的和其他有状态的标志可以更深入地控制主机的行为。还有更多关于前缀dat的标志。

.