Wishlist 0 ¥0.00

配置IPv6地址

配置IPv6地址

更新时间:2021/07/27 GMT+08:00

操作场景

IPv6的使用,可以有效弥补IPv4网络地址资源有限的问题。如果当前云服务器使用IPv4,那么启用IPv6后,云服务器可在双栈模式下运行,即云服务器可以拥有两个不同版本的IP地址:IPv4地址和IPv6地址,这两个IP地址都可以进行内网/公网访问。

按照约束与限制中的网络环境要求创建的云服务器,有些不能动态获取到IPv6地址,需要进行相关配置才行。如果云服务器使用的是公共镜像,则支持情况如下:

  • Windows公共镜像默认已开启IPv6动态获取功能,无需配置,文中的Windows 2012操作系统和Windows 2008操作系统部分供您验证、参考。
  • Linux公共镜像开启动态获取IPv6功能时,需要先判断是否支持IPv6协议栈,再判断是否已开启动态获取IPv6。目前,所有Linux公共镜像均已支持IPv6协议栈,并且Ubuntu 16操作系统已默认开启动态获取IPv6。即Ubuntu 16操作系统无需配置,其他Linux公共镜像需要执行开启动态获取IPv6的操作。

约束与限制

  • 请确保云服务器所在的子网已开启IPv6功能。

    子网开启IPv6功能请参考“IPv4/IPv6双栈网络”。

  • 请确保创建云服务器时已选择“自动分配IPv6地址”。
    图1 选择“自动分配IPv6地址”
    只有以下云服务器才支持IPv6双栈:
    • “华北-北京四”区域的“可用区2”下,选择sn3规格
    • “华北-北京四”区域的“可用区7”下,选择s6、c6、kc1规格
    • “华东-上海一”区域的“可用区1”下,选择s6、c6s、c6、m6、c3、m3规格
    • “华东-上海一”区域的“可用区2”下,选择c6、m6、c3规格
    • “华东-上海一”区域的“可用区3”下,选择c6s、c6规格
    • “西南-贵阳一”区域的“可用区1”下,选择s6、c6s、c6、m6规格
    • “中国-香港”区域的“可用区1”下,选择c6规格
    • “中国-香港”区域的“可用区2”下,选择c6规格
  • 云服务器启动之后动态插拔的网卡不支持IPv6地址动态获取功能。
  • 仅弹性云服务器支持IPv6双栈,裸金属服务器不支持。
  • 同一个网卡上,只能绑定一个IPv6地址。

操作步骤

  • Windows系统:本文以Windows 2012版本、Windows 2008版本为例,介绍Windows操作系统启用IPv6的方法,如表1所示。
  • Linux系统:本文提供了自动配置、手动配置两种方式启用IPv6,推荐您使用自动配置方法,如表1所示。

    对于CentOS 6.x和Debian操作系统,云服务器内部配置IPv6自动获取功能之后,将该云服务器制作为私有镜像,使用该镜像在非IPv6网络环境中创建云服务器时,由于等待获取IPv6地址超时,导致云服务器启动较慢,此时您可以参考设置云服务器获取IPv6地址超时时间操作。

表1 不同操作系统启用IPv6操作指导

操作系统

方式

操作指导

Windows 2012

自动配置启用IPv6

Windows 2012操作系统

Windows 2008

自动配置启用IPv6

Windows 2008操作系统

Linux

自动配置启用IPv6(推荐)

Linux操作系统(自动配置启用IPv6)

Linux

手动配置启用IPv6

Linux操作系统(手动配置启用IPv6)

Windows 2012操作系统

  1. 检查是否启用IPv6。

     

    打开cmd窗口,执行如下命令,查看当前云服务器是否启用IPv6。

    ipconfig

    • 如果已启用IPv6,则会显示IPv6的地址。
      图2 显示IPv6的地址
    • 如果显示只有本地链接IPv6地址,则表示无法动态获取到IPv6地址。请执行2
      图3 本地链接IPv6地址
    • 如果未启用IPv6,则不会显示IPv6的地址。请执行3
      图4 未启用IPv6
      说明:

      Windows公共镜像默认已经配置了IPv6动态获取功能,即回显为情况一,无需特殊配置。

     

  2. 配置动态获取IPv6。

     

    1. 单击“开始 > 控制面板”。
    2. 单击“网络和共享中心”。
    3. 单击以太网连接。
      图5 以太网连接
    4. 在以太网状态的弹窗中单击左下角的“属性”。
    5. 勾选“Internet协议版本 6 (TCP/IPv6)”,然后单击“确定”。
      图6 配置动态获取IPv6
    6. 执行1检查是否已开启动态获取IPv6。

     

  3. 启用和配置IPv6。

     

    1. 在“Internet 协议版本 6(TCP/IPv6)属性”弹窗中,配置云服务器的IPv6地址和DNS服务器地址。
      • IPv6地址:创建云服务器时分配的IPv6地址,请从控制台云服务器的列表页面获取。
      • 子网前缀长度:64
      • DNS服务器:推荐使用240c::6666
      图7 在控制台获取IPv6地址
    2. (可选配置)根据操作系统不同请分别执行以下命令。

      Windows Server 2012操作系统云服务器请在PowerShell或者cmd中执行如下命令:

      Set-NetIPv6Protocol -RandomizeIdentifiers disabled

    3. 执行1检查是否已开启动态获取IPv6。

     

Windows 2008操作系统

  1. 检查是否启用IPv6。

     

    打开cmd窗口,执行如下命令,查看当前云服务器是否启用IPv6。

    ipconfig

    • 如果已启用IPv6,则会显示IPv6的地址。
      图8 显示IPv6的地址
    • 如果显示只有本地链接IPv6地址,则表示无法动态获取到IPv6地址。请执行2
      图9 本地链接IPv6地址
    • 如果未启用IPv6,则不会显示IPv6的地址。请执行3
      图10 未启用IPv6
      说明:

      Windows公共镜像默认已经配置了IPv6动态获取功能,即回显为情况一,无需特殊配置。

     

  2. 配置动态获取IPv6。

     

    1. 单击“开始 > 控制面板”。
    2. 单击“网络和共享中心”。
    3. 左键单击“更改适配器设置”。
    4. 右键单击网络连接并选择“属性”。
    5. 勾选“Internet协议版本 6 (TCP/IPv6)”,然后单击“确定”。
      图11 配置动态获取IPv6
    6. 执行1检查是否已开启动态获取IPv6。

     

  3. 启用和配置IPv6。

     

    1. 选择“开始 > 控制面板 > 网络连接 > 本地连接”。
    2. 选择“属性”,确认勾选以下选项后单击“安装”。
      图12 启用和配置IPv6
    3. 选择“协议”,然后单击“添加”。
      图13 添加协议
    4. 在网络协议列表中选择“Microsoft TCP/IP版本 6”,然后单击“确定”。
      图14 网络协议列表
    5. (可选配置)根据操作系统不同请分别执行以下命令。

      Windows Server 2008操作系统云服务器请在PowerShell或者cmd中执行如下命令:

      netsh interface ipv6 set global randomizeidentifiers=disable

      设置云服务器先禁用本地连接,再重启本地连接。

      禁用本地连接:单击“开始 > 控制面板 > 网络和共享中心 > 更改适配器配置”,选择本地连接,单击右键选择“禁用”。

      重启本地连接:单击“开始 > 控制面板 > 网络和共享中心 > 更改适配器配置”,选择本地连接,单击右键选择“启用”。

    6. 执行1检查是否已开启动态获取IPv6。

     

Linux操作系统(自动配置启用IPv6)

ipv6-setup-xxx工具能为开启IPv6协议栈的Linux操作系统自动配置动态获取IPv6地址。其中,xxx表示工具系列:rhel或debian。

您也可以参考Linux操作系统(手动配置启用IPv6)手动配置启用IPv6。

注意:
  • ipv6-setup-xxx工具运行时会自动重启网络服务,导致网络短暂不可用。
  • CentOS 6.x和Debian操作系统的云服务器内部配置IPv6自动获取功能之后,将该云服务器制作为私有镜像,使用该镜像在非IPv6网络环境中创建云服务器时,由于等待获取IPv6地址超时,导致云服务器启动较慢,您可以参考设置云服务器获取IPv6地址超时时间设置获取IPv6地址超时时间为30s,然后再重新制作私有镜像。
  1. 执行如下命令,查看当前云服务器是否启用IPv6。

     

    ip addr

    • 如果没有开启IPv6协议栈,则只能看到IPv4地址,如下图所示,请参考2先开启IPv6协议栈。
      图15 云服务器未开启IPv6协议栈
    • 如果已开启IPv6协议栈,则可以看到LLA地址(fe80开头)。
      图16 云服务器已开启IPv6协议栈
    • 如果已开启IPv6协议栈并且已获取到IPv6地址,则会看到如下地址:
      图17 云服务器已开启IPv6协议栈并且已获取到IPv6地址
    说明:

    Linux公共镜像均已开启IPv6协议栈(即情况二);Ubuntu 16公共镜像不仅已开启IPv6协议栈,而且可以获取到IPv6地址(即情况三),无需特殊配置。

     

  2. 开启Linux云服务器IPv6协议栈。

     

    1. 执行如下命令,确认内核是否支持IPv6协议栈。

      sysctl -a | grep ipv6

      • 如果有输出信息,表示内核支持IPv6协议栈。
      • 如果没有任何输出,说明内核不支持IPv6协议栈,需要执行2.b加载IPv6模块。
    2. 执行以下命令,加载IPv6模块。

      modprobe ipv6

    3. 修改“/etc/sysctl.conf”配置文件,增加如下配置:

      net.ipv6.conf.all.disable_ipv6=0

    4. 保存配置并退出,然后执行如下命令,加载配置。

      sysctl -p

     

  3. 自动配置启用IPv6。

     

    1. 下载对应系统版本的工具ipv6-setup-rhel或ipv6-setup-debian,并上传至待操作的云服务器。

      ipv6-setup-xxx工具会添加或者修改网卡设备的配置文件,添加IPv6动态获取的配置信息,然后重启网卡或者网络服务。ipv6-setup-rhel和ipv6-setup-debian的工具下载地址如表2所示。

      表2 工具下载地址

      系列

      发行版

      下载地址

      RHEL

      • CentOS 6/7
      • EulerOS 2.2/2.3
      • Fedora 25

      https://ecs-instance-driver.obs.cn-north-1.myhuaweicloud.com/ipv6/ipv6-setup-rhel

      Debian

      • Ubuntu 16/18
      • Debian 8/9

      https://ecs-instance-driver.obs.cn-north-1.myhuaweicloud.com/ipv6/ipv6-setup-debian

    2. 执行以下命令,添加执行权限。

      chmod +x ipv6-setup-xxx

    3. 执行以下命令,指定一个网卡设备,配置动态获取IPv6地址。

      ./ipv6-setup-xxx --dev [dev]

      示例:

      ./ipv6-setup-xxx --dev eth0

      说明:
      • 如需对所有网卡配置动态获取IPv6地址,命令为./ipv6-setup-xxx,即不带参数。
      • 如需查询工具的用法,请执行命令./ipv6-setup-xxx --help

     

Linux操作系统(手动配置启用IPv6)

注意:

CentOS 6.x和Debian操作系统的云服务器内部配置IPv6自动获取功能之后,将该云服务器制作为私有镜像,使用该镜像在非IPv6网络环境中创建云服务器时,由于等待获取IPv6地址超时,导致云服务器启动较慢,您可以参考设置云服务器获取IPv6地址超时时间设置获取IPv6地址超时时间为30s,然后再重新制作私有镜像。

  1. 执行如下命令,查看当前云服务器是否启用IPv6。

     

    ip addr

    • 如果没有开启IPv6协议栈,则只能看到IPv4地址,如下图所示,请参考2先开启IPv6协议栈。
      图18 未开启IPv6协议栈
    • 如果已开启IPv6协议栈,则可以看到LLA地址(fe80开头)。
      图19 已开启IPv6协议栈
    • 如果已开启IPv6协议栈并且已获取到IPv6地址,则会看到如下地址:
      图20 已开启IPv6协议栈并且已获取到IPv6地址
    说明:

    Linux公共镜像均已开启IPv6协议栈(即情况二);Ubuntu 16公共镜像不仅已开启IPv6协议栈,而且可以获取到IPv6地址(即情况三),无需特殊配置。

     

  2. 开启Linux云服务器IPv6协议栈。

     

    1. 执行如下命令,确认内核是否支持IPv6协议栈。

      sysctl -a | grep ipv6

      • 如果有输出信息,表示内核支持IPv6协议栈。
      • 如果没有任何输出,说明内核不支持IPv6协议栈,需要执行2.b加载IPv6模块。
    2. 执行以下命令,加载IPv6模块。

      modprobe ipv6

    3. 修改“/etc/sysctl.conf”配置文件,增加如下配置:

      net.ipv6.conf.all.disable_ipv6=0

    4. 保存配置并退出,然后执行如下命令,加载配置。

      sysctl -p

     

  3. 手动配置启用IPv6。操作系统不同,步骤有所差别。

     

    • Ubuntu操作系统云服务器配置动态获取IPv6。
      说明:

      Ubuntu 18.04请执行以下操作步骤;Ubuntu 16.04操作系统已默认启用IPv6,不需要做任何配置操作。

      1. 修改“/etc/network/interface”配置文件,在“iface eth0 inet dhcp”下增加一行配置:
        iface eth0 inet6 dhcp
      1.  

        CentOS 6.3系统中默认ip6tables会过滤dhcpv6-client请求,所以CentOS 6.3除了需要编辑“ifcfg-eth*”文件外,还需要额外添加一条允许dhcpv6-client请求的ip6tables规则。操作如下:

        1. 执行以下命令,添加ip6tables规则。

          ip6tables -A INPUT -m state --state NEW -m udp -p udp --dport 546 -d fe80::/64 -j ACCEPT

        2. 执行以下命令,保存ip6tables规则。

          service ip6tables save

          图21 命令示例
      2. (可选配置)CentOS 7系列需要将扩展网卡的IPv6 LLA地址模式修改为EUI64。
        1. 执行如下命令查看网卡信息。

          nmcli con

          图22 查看网卡信息
        2. 将eth1的IPv6 LLA地址模式按以下命令修改为EUI64:

          nmcli con modify "Wired connection 1" ipv6.addr-gen-mode eui64

        3. 通过ifconfig命令将eth1进行down/up操作。

          ifdown eth1

          ifup eth1

      3. 重启网络服务。
        1. CentOS 6系列执行以下命令,重启网络服务。

          service network restart

        2. CentOS 7/EulerOS/Fedora系列执行以下命令,重启网络服务。

          systemctl restart NetworkManager

      4. 执行步骤1检查是否已开启动态IPv6。
    • SUSE/openSUSE/CoreOS操作系统云服务器配置动态获取IPv6。

      SUSE 11 SP4不支持IPv6自动获取。

      SUSE 12 SP1、SUSE 12 SP2无需特殊配置。

      openSUSE 13.2、openSUSE 42.2无需特殊配置。

      CoreOS 10.10.5无需特殊配置。

     

设置云服务器获取IPv6地址超时时间

CentOS 6.x和Debian操作系统的云服务器内部配置IPv6自动获取功能之后,将该云服务器制作为私有镜像,使用该镜像在非IPv6网络环境中创建云服务器时,由于等待获取IPv6地址超时,导致云服务器启动较慢,您可以参考本节操作设置获取IPv6地址超时时间为30s,然后再重新制作私有镜像。

  • CentOS 6.x:
    1. 执行以下命令编辑“dhclient.conf”文件。

      vi /etc/dhcp/dhclient.conf

    2. 按“i”进入编辑模式,在文件中增加timeout属性。
      timeout  30;
  •  
  • (可选配置)配置网卡IPv6 LLA地址的生成方式为EUI64。
    nmcli con modify "Wired connection 1" ipv6.addr-gen-mode eui64
    1.  
    2. 执行以下命令,重启网络服务。

      ifdown eth0

      ifup eth0

  • Debian操作系统云服务器配置动态获取IPv6。
    1. 编辑“/etc/network/interfaces”文件,使之包含以下内容:
      auto lo 
      iface lo inet loopback 
      auto eth0
      iface eth0 inet dhcp
      iface eth0 inet6 dhcp 
           pre-up sleep 3
  •  
  • 如果有多个网卡,则在“/etc/network/interfaces”文件中,增加对应网卡的配置,以eth1为例,需要增加:
    auto eth1
    iface eth1 inet dhcp
    iface eth1 inet6 dhcp 
         pre-up sleep 3
    1.  
    2. 执行如下命令重启网络服务。

      service networking restart

      说明:

      如果将网卡进行down/up操作之后无法获取IPv6地址,也可以通过此命令重启网络服务。

    3. 执行步骤1检查是否已开启动态IPv6。
  • CentOS/EulerOS/Fedora操作系统云服务器配置动态获取IPv6。
    1. 编辑主网卡配置文件“/etc/sysconfig/network-scripts/ifcfg-eth0”。
      补充如下配置项:
      IPV6INIT=yes
      DHCPV6C=yes
  •  
  • 编辑“/etc/sysconfig/network”,按如下所示添加或修改以下行。
    NETWORKING_IPV6=yes
  •  
  • CentOS 6系列从网卡需要编辑对应的配置文件,以eth1为例,编辑“/etc/sysconfig/network-scripts/ifcfg-eth1”。
    补充如下配置项:
    IPV6INIT=yes
    DHCPV6C=yes
    1.  
    2. 输入:wq保存后退出。
  • Debian 7.5:
    1. 执行以下命令编辑“networking”文件。

      vi /etc/init.d/networking

    1. 按“i”进入编辑模式,增加延迟命令timeout,修改点如下图所示。
      图23 修改点1
      图24 修改点2
  • Debian 8.2.0/8.8.0
    1. 执行以下命令编辑“network-pre.conf”文件。

      vi /lib/systemd/system/networking.service.d/network-pre.conf

    2. 按“i”进入编辑模式,在文件中增加timeout属性。
      [Service]
      TimeoutStartSec=30
    1.  
  • Debian 9.0
    1. 执行以下命令编辑“networking.service”文件。

      vi /etc/system/system/network-online.target.wants/networking.service

    2. 按“i”进入编辑模式,将TimeoutStartSec=5min改为TimeoutStartSec=30。

IPv6子网划分如何工作?与IPv4子网划分有何不同?

我对IPv4子网划分了解很多,并且在准备(部署)IPv6网络时,我需要知道这些知识中有多少是可以转让的,以及我仍然需要学习什么。乍看起来,IPv6比IPv4复杂得多。所以我想知道:

  • IPv6是128位,那么/ 64为什么是主机推荐的最小子网?与此相关:
    • 为什么建议在路由器之间的点对点链接中使用/ 127,为什么过去却反对使用?我应该将现有的路由器链接更改为使用/ 127吗?
    • 为什么要为虚拟机配置少于/ 64的地址?
    • 在其他情况下,我会使用小于/ 64的子网吗?
  • 我可以直接从IPv4子网映射到IPv6子网吗?例如,IPv4 / 24是否直接对应于IPv6 / 56或/ 120?
  • 我的接口有几个IPv6地址。所有子网的子网都必须相同吗?
  • 为什么有时在IPv6地址中看到%而不是/,这是什么意思?
  • 我在浪费太多子网吗?我们不只是要再次耗尽吗?
  • IPv6子网与IPv4子网在其他哪些主要方面不同?
networking  ipv6  subnet 
— 迈克尔·汉普顿
source

Answers:


138

关于IPv6子网划分,首先要提到的是需要一种不同的思维方式。在IPv4中,您通常会考虑可用的地址数量以及如何为每个最终用户分配足够的地址。在IPv6中,通常会考虑可用的子网数(/ 64),以及如何将其分配给最终用户。您几乎不必担心给定子网中将使用多少个IP地址。除了点对点链接之类的特殊情况外,每个子网都只是拥有比其所需的更多地址可用的地址,因此,您不必担心分配子网,而不必担心它们内部的主机。

IPv6子网通常为/ 64,因为这是SLAAC(无状态地址自动配置)正常工作所必需的。即使未使用SLAAC,也可能有其他原因使用/ 64。例如,可能有一些最终用户设备仅假设/ 64,否则在某些路由器上,比/ 64长的路由子网可能效率低下,因为路由器实施者已对/ 64或更短的路由进行了优化,以节省时间。路由表内存。

为什么建议将/ 127用于点对点链接

对于点对点链接的特定情况,建议使用/ 127而不是/ 64,以避免出现这样的漏洞:子网上到达未使用地址的四分之一地址的数据包地址会导致不必要的邻居请求和表条目,可能会淹没路由器。此类地址错误的数据包可能是恶意的或偶然的。但是,即使您实际上将点对点链接配置为/ 127,也有人主张无论如何都要分配整个/ 64以便保持一致。

为什么要为虚拟机配置小于/ 64的子网?

我不知道为什么要为虚拟机配置小于/ 64的子网。也许是因为托管服务提供商假设服务器就像最终用户,并且只需要一个(/ 64)子网,却没有想到该服务器实际上是需要内部路由拓扑的VM的集合?也可以仅通过使寻址计划更易于记忆来完成:主机获取PREFIX::/64,然后每个VM获取PREFIX:0:NNNN::/96NNNN唯一的VM,VM可以随意分配PREFIX:0:NNNN:XXXX:YYYY

我可以直接从IPv4子网映射到IPv6子网吗?例如,IPv4 / 24是否直接对应于IPv6 / 56或/ 120?

从寻址和路由工作原理的低级角度来看,前缀长度在IPv6和IPv4中具有相同的含义。在该级别上,您可以进行类比,例如“ IPv4 / 16将一半的位用于网络地址,一半的位用于主机地址,这类似于IPv6中的/ 64”。但是这种比较并不是很恰当。IPv6中出现了强大的约定,这些约定使网络大小的划分看起来更像是IPv4中有类网络的旧世界。可以肯定的是,IPv6不会重新引入分类寻址,在该分类寻址中,地址的最高有效位会强制使用特定的网络掩码,但是IPv6 确实具有某些[事实上/传统上]的标准网络大小:

  • / 64:单个子网的基本大小:LAN,WAN,Web虚拟主机的地址块等...永远不要期望“普通”子网比/ 64小(更长的前缀)。绝不会期望子网比/ 64更大(前缀更短),因为/ 64的主机地址值远远超出了我们的想象。
  • / 56:256个基本子网的块。即使当前的策略允许ISP向每个最终用户分发最大为/ 48的数据块,并且仍然认为其地址利用率是合理的,但某些ISP可能(并且已经这样做)选择将/ 56分配给消费级客户,以作为一种折衷方案。为它们分配大量子网并解决经济问题。
  • / 48:65535个基本子网的块,以及每个ISP客户端站点应接收的建议大小的块。
  • / 32:大多数ISP每次从区域地址注册中心请求更多地址时将接收的默认块大小。

在服务提供商和企业网络内部,可以看到比这4个更多的前缀长度。查看这些网络内部路由器的路由表时,IPv4和IPv6有很多共通之处,包括路由工作的大多数方式:较长前缀的路由会覆盖较短前缀的路由,因此可以进行汇总(缩短)并进行钻取向下(延长)路线。像在IPv4中一样,可以将路由聚合或汇总为具有较短前缀的较大块,以最小化路由表的大小。

IPv4和IPv6之间映射的另一个问题是如何协调双堆栈计算机上的IPv4和IPv6分配,以便可以轻松理解寻址计划。到目前为止,确实有一些通用的约定可以做到这一点:将IPv4“子网号”嵌入到IPv6前缀的一部分中,可以使用BCD(例如,10.0.234.0/24变成2001:db8:abcd:234::/64)或二进制(10.0.234.0/24变成2001:db8:abcd:ea::/64)。

我的接口有几个IPv6地址。所有子网的子网都必须相同吗?

绝对不!与IPv4一样,通过同时具有来自不同子网的多个IP地址,有望使IPv6主机成为多宿主。如果使用SLAAC对它们进行自动配置,则不同的子网可能来自不同路由器的路由器通告。

为什么有时在IPv6地址中看到%而不是/,这是什么意思?

您不会看到一个而不是另一个。它们具有不同的含义。斜杠表示前缀(子网),表示所有以相同n位开头的地址块。没有斜杠的地址是主机地址。您可能会认为该地址的末尾有一个隐含的“ / 128”,这意味着指定了所有128位。

百分号随附链接本地地址。在IPv6中,每个接口除了可能具有的任何其他IP地址之外,还具有链路本地地址。但问题是,链接本地地址始终无一例外地位于该fe80::/10块中。但是,如果我们尝试使用链接本地地址与对等方通信,并且本地主机具有多个接口,我们如何知道要使用哪个接口与该对等方通信?通常,路由表会告诉我们用于特定前缀的接口,但是在这里,它将告诉我们fe80::/10通过每个接口可访问的接口。

答案是我们必须使用语法告诉它使用哪个接口address%interface。例如,fe80::1234:5678:8765:4321%eth0

我在浪费太多子网吗?我们不只是要再次耗尽吗?

没人知道。谁能告诉未来?

但是考虑一下。在IPv6中,可用子网的数量是IPv4 中可用单个地址的数量的平方。确实很多。不,我的意思是真的很多!

但是,仍然:我们会自动将/ 32分发给任何请求它的ISP,而我们会向每个ISP客户分发/ 48。也许我们夸张了,毕竟我们将浪费IPv6。但是有一个规定:到目前为止,只有IPv8空间的八分之一可供使用:2000::/3。这个想法是,如果我们把前八名搞得一团糟,而我们不得不大刀阔斧地修改自由派分配政策,那么在陷入麻烦之前,我们必须再尝试七次。

最后:IPv6不必永远持续下去。也许它的寿命比IPv4更长(已经是一个令人印象深刻的寿命,并且还没有结束),但是像每种技术一样,它总有一天将不再重要。我们只需要做到这一点。

 
— 塞拉达
source

13
很好的解释!特别是关于不同的心态。如果看一下数字,您会发现2000 :: / 3中有536,870,912 / 32(小型ISP)。世界人口为70亿,每13个人中就有一个ISP,每个这样的ISP可以拥有65,536个客户,每个客户/ 48。无需担心浪费地址:-)
Sander Steffann 2012年

 
是的,这是一个很好的解释。
Fergus 2012年

2
对2000 :: / 3的具体细节有很好的解释。
— Koos van den Hout 2012年

5
很好的解释。对最终评论+1。我希望每个人都已经看到了:xkcd.com/865
— Nico,

 
@SanderSteffann如果出现问题,ISP将新的/ 64分配给住宅用户而不是/ 48是合理的,而小型ISP一次请求请求4096个块(/ 52个块) )。当前的方案只是为了在每个层次上留出扩展空间而设计的。
immibis

45

IPv6是128位,那么/ 64为什么是主机推荐的最小子网?

首先,从RFC中获得一些ASCII技术来建立术语:

|         n bits         |   m bits  |       128-n-m bits         |
+------------------------+-----------+----------------------------+
| global routing prefix  | subnet ID |       interface ID         |
+------------------------+-----------+----------------------------+

全局路由前缀通常标识该地址所属的整个网络。通常为48位。接口ID标识给定的网络接口。通常是64位。剩下的16位是您的子网ID。

OK,继续说明:

根据RFC 4291-IP版本6寻址架构:

除以二进制000开头的地址外,所有全局单播地址都有一个64位接口ID字段。

RFC 5375-IPv6单播地址分配注意事项

IPv4寻址计划的重要部分是确定每个子网前缀的长度。与IPv4不同,IPv6寻址体系结构[RFC4291]指定使用全局唯一地址和ULA的所有子网始终具有相同的64位前缀长度。

因此,忽略000前缀异常,接口ID 始终完全是64位。这是所有本地广播网络始终都是64位的另一种说法。如果您有IPv6地址,则其网络掩码始终为 64位。永不止息。如果为您分配的地址空间大于该地址空间(比64位短的网络掩码),则假定您将把该地址空间划分为64位网络并自己处理路由。如果为您提供的网络小于该网络(较长的网络掩码),则可能有人搞砸了。

那么,为什么是64位呢?

通常,IPv6地址是自动配置的,而不是分配的。路由器将通告可用的网络前缀(路由前缀+子网ID:前64位),并且您的计算机将使用其自己的唯一标识符填充后64位。您的计算机如何提供唯一标识符?有几种可能性,最常见的是使用接口的MAC地址。您将MAC分成两部分(供应商一半/串行一半),翻转供应商一侧的通用本FF:FE地位,然后将它们与中间部分重新连接在一起。如此00:30:48:01:23:45成为0230:48ff:fe01:2345。现在,在其左侧放置广告的64位网络前缀,您便拥有了IP地址。

这里的重点是,如果遵循此方案,则不会发生IP地址冲突。由于给定广播网络上的每个设备都需要一个唯一的MAC地址才能工作,因此将接口ID绑定到MAC地址意味着只要广播流量不冲突,IPv6地址也不会冲突。使用64位(而不只是48个专用于MAC地址的地址)提供了一些摆动空间,而不仅仅是该方案提供的地址(还有其他几个地址)。

在其他情况下,我会使用小于/ 64的子网吗?

不。除非你很伤心,否则不会。好吧,您可能有基于本地要求的理由,可以使用现有网络设置手动路由。但是请记住,这样做可能会使您一团糟:

RFC 5375开始-IPv6单播地址分配注意事项

使用/ 64以外的子网前缀长度将破坏IPv6的许多功能,包括邻居发现(ND),安全邻居发现(SEND)[RFC3971],隐私扩展[RFC4941],移动IPv6的一部分[RFC4866],协议独立多播-具有嵌入式RP [RFC3956]的稀疏模式(PIM-SM),以及通过IPv6中介(SHIM6)[SHIM6]进行的站点多宿主。当前正在开发或正在提议中的许多其他功能也依赖于/ 64子网前缀。

....

但是,某些网络管理员对连接路由器的链接使用的前缀长于/ 64,通常在点对点链接上仅使用两个路由器。在通过手动配置分配了所有地址且链接上的所有节点都是网络已知的路由器(不是终端主机)的链接上,管理员不需要任何依赖于/ 64子网前缀的IPv6功能,这能行得通。不建议一般使用长度大于/ 64的子网前缀,将其用于包含最终主机的链接将不是一个好主意,因为很难预测主机将来将使用哪些IPv6功能。

为什么建议在路由器之间的点对点链接中使用/ 127,为什么过去却反对使用?

您可能希望掩盖RFC 3627-在认为有害的路由器之间使用/ 127前缀长度。然后看看随后的RFC 6164-在路由器间链接上使用127位IPv6前缀

反对在路由器上使用长于/ 64的前缀的原因与路由器自动配置有关,在极少数情况下可能会失败。反对使用短于/ 127(仅2个主机)的前缀,这与许多与将数据包发送到未路由地址有关的潜在拒绝服务问题有关。由于现实世界中的拒绝服务问题比理论上的自动配置失败要严重,因此/ 127是新的首选。

我应该将现有的路由器链接更改为使用/ 127吗?

如果您控制IPv6路由器,建议您阅读两个RFC(它们很短!),然后自己决定。

我可以直接从IPv4子网映射到IPv6子网吗?

例如,IPv4 / 24是否直接对应于IPv6 / 56或/ 120?

其实,是。还记得我们之前故意忽略的000前缀吗?好吧,这是一个用途:

在双堆栈系统(同时具有IPv4和IPv6堆栈的系统)上,可以使用IPv6机制表示IPv4。他们称其为“ IPv4映射的IPv6地址 ”。模式为全零,后跟FFFF,后跟32位IPv4地址。

因此,192.168.100.21变得::FFFF:C0A8:6415-或更简单地说: ::FFFF:192.168.100.21。由于该右手位表示一个IPv4地址,因此通常以点分十进制形式写出。

由于这是实际的IPv4地址,因此仍使用IPv4标头等,这意味着必须存在IPv4堆栈,必须设置IPv4路由等。优点是您可以使用单个地址结构表示IPv4和IPv6地址,这可以简化应用程序开发。就网络而言,这没有什么区别。


20
  1. IPv6是128位,那么/ 64为什么是主机推荐的最小子网?

    此前缀大小最初是在较旧的RFC中建议的-此后已对该策略进行了修订,其中考虑了邻居发现攻击的问题,并且使用/ 126是有效的缓解方法-尽管如此,如果您要通过以下方式设置PtP链接:路由流量的唯一目的是,另一种选择是坚持使用/ 64和该子网的防火墙。更好的是,为自己分配一个池,从中可以提取/ 64个子网,并将整个池作为边缘(以及可能来自于敌意的任何其他地方)的黑名单目的地

  2. 为什么建议在路由器之间的点对点链接中使用/ 127,为什么过去却反对使用?我应该将现有的路由器链接更改为使用/ 127吗?

    不建议在路由器之间使用/ 127,并且绝对不要使用/ 127-全路由器的Anycast地址是子网的全零地址;这意味着/ 127在技术上仅在两台机器之间有效,其中一台机器充当路由器。/ 126当然可以。

    但是,无论如何,除非您的设备容易受到邻居发现缓存泛洪攻击,否则我不建议您切换现有的/ 64链接-即使在这种情况下,也要先确定您是否真的要使用/ 64进行互联网连接,如果答案是否定的,只需对其进行防火墙处理。

  3. 为什么要为虚拟机配置小于/ 64的子网?

    这会破坏SLAAC和RA,除非您真的非常了解自己在做什么,否则您不太可能有充分的理由这样做-也许您的上游只给了您一个/ 64,但是如果是这样,您就需要返回给他们并要求更多,如果他们想向您收取费用,请开始寻找新的提供商,还可能向他们发送一些链接到相关RFC的肮脏电子邮件。

  4. 在其他情况下,我会使用小于/ 64的子网吗?

    老实说 可能不是。如果出于合理的原因,出于防止NDP攻击之外的目的,最好使用较小的子网,则将在本节中进行编辑。

    相反,在某些情况下,您希望使用小于/ 64的子网-特别是在您使用硬件转发设备运行环境的任何地方(请考虑使用名牌路由器和L3交换机)-有些情况将无法进行前缀的硬件路由比/ 64更长的时间,其他人必须将操作分成多个比较,因此,您至少应尽力确保/ 64是(OSPF / ISIS / EIGRP / etc)主干网中的最长前缀。

  5. 我可以直接从IPv4子网映射到IPv6子网吗?例如,IPv4 / 24是否直接对应于IPv6 / 56或/ 120?

    正式地,:: ffff:xxxx是IPv6映射的IPv4地址的格式-当然,还有许多转换机制,即6to4及其相对的6rd,它们将IPv4地址映射到全局IPv6中。通过创建从其继承的IPv4地址派生的IPv6前缀来提供对IPv4的IPv6访问。

  6. 我的接口有几个IPv6地址。所有子网的子网都必须相同吗?

    不,在同一接口上使用不同的地址和子网大小应该不是问题。如果是这样,则说明实现存在错误。当然,更好的问题是您为什么要这样做?

  7. 为什么有时在IPv6地址中看到%而不是/,这是什么意思?

    这是一个分隔符,通常应用于链接本地地址(fe80 :: / 12)-由于同一链接本地地址可以合法存在于多个接口上,因此%分隔符用于允许指定要使用的接口。在执行涉及本地链接的操作时,Linux通常会强制指定接口。Windows Vista / 2008及更高版本更加智能,除非链接本地不是唯一的,否则不会抱怨。

  8. 我在浪费太多子网吗?我们不只是要再次耗尽吗?

    否。这是一匹死马,它被WAAAAAAAAAY浪费了太多次-当前的全球IPv6互联网是2000 :: / 3-如果某种程度上,如果地球上的每个RIR都耗尽了IANA,则IANA可以开始使用更多前缀地址股票。因此,不会,我们将不会用完空间,即使这样做,也需要轻按一下笔才能出现新的前缀,而不是技术上的改变。这个问题真正强调的唯一一件事是人的大脑无法完全理解地址空间有多么荒谬。

  9. IPv6子网与IPv4子网在其他哪些主要方面不同?

    除了不在乎正在使用多少空间外,请记住没有广播地址,并且“子网零”地址现在是所有路由器的任意播地址(基本上是隐含在配置的所有节点上的地址)以转发IPv6数据包)-这有一个非常有用的副作用,允许您将全零地址用作网络中的默认路由(不,它不会导致数据包重复,它是ANYcast,而不是MULTIcast)-请切记尽管主机可能每隔几秒钟便会在路由器之间翻转一次,所以如果连接跟踪未在它们之间进行同步,则这不适用于有状态防火墙设置。

    除此之外,另一个主要区别是IPv6关心重复地址和死邻居(NUD)-因此,与IPv4不同,主机可以确定链接上的另一个节点已经在使用该地址,因此它将拒绝使用该地址。 。另一方面,如果您要配置静态路由,则NUD很有用-您实际上可以为具有不同度量的前缀定义多个单独的路由,并且它们实际上可以工作,这与IPv4不同,在IPv4中,将使用最低的度量路由,而不考虑下一条-hop死了还是活着(尽管对于某些使用ARP验证路由的IPv4实施(例如Cisco和其他主要路由器供应商)可能并非如此)

    TLDR;IPv6检测到重复的地址和不可达的邻居。全零地址是所有路由器的任播地址,没有广播这样的东西,全一是常规地址。


3

3

对于那些想知道规范中SLAAC的/ 64要求来自何处的人,这里有一些额外的参考资料:

IPv6无状态地址自动配置(RFC 4862)

如果前缀长度和接口标识符长度的总和不等于128位,则必须忽略“前缀信息”选项。[...]

系统管理员有责任确保路由器广告中包含的前缀长度与该链接类型的接口标识符的长度一致。

IP版本6寻址架构(RFC 4291)中

对于所有单播地址(以二进制值000开头的地址除外),接口ID的长度必须为64位,并以Modified EUI-64格式构造。

因此,因为接口ID必须为64位长,并且前缀长度和接口ID长度之和必须为128,所以使用SLAAC时前缀的唯一可能长度是64位。


2

IPv6是128位,那么/ 64为什么是主机推荐的最小子网?

因为IPv6支持者喜欢无状态自动配置的想法。

如果您选择任何其他子网大小,则无状态自动配置将中断。其他一些小问题也可能会中断,请阅读rfc7421以获取更多详细信息。

我个人认为无状态自动配置无论如何都是愚蠢的想法。它导致地址不可读,除了将块分配给子网之外,您几乎没有对地址的控制。

当然,使用约定的事情是,如果您遵循这些约定而出现问题,则可以指出该约定;如果您拒绝遵循这些约定而出现错误,那将是您的错。

为什么建议将/ 127用于路由器之间的点对点链接,

使用具有少量可用地址的子网可以避免邻居发现耗尽攻击。

当然,这种推理不仅适用于点对点链接。我猜想从政治上来说可能对点对点路由器链接提出此建议,但在政治上不可能对其他链接做出建议。

为什么要为虚拟机配置少于/ 64的地址?

我们需要在这里做出区分。主机提供商可以通过两种方式为计算机分配地址(物理的或虚拟的)。

他们可以为它们分配“链接”地址,以便机器可以在其中答复邻居发现请求。一些托管服务提供商选择给每台计算机提供一个/ 64,这在地址移动性方面具有优势,另一些托管服务提供商选择为每个VLAN提供一个/ 64,然后给各个机器的子块分配使用更少地址的子块,这可能意味着本地流量保持本地状态,而不是传递到路由器。

或者他们可以将机器视为路由器,并为其分配路由块。在这种情况下,它将需要足够的地址来寻址其所有内部子网。如果遵循“所有子网必须为/ 64”的约定,则意味着至少为其分配一个/ 64,并且可能分配更多。对于具有“机器内部网络”的机器,例如容器主机,这是有意义的。

我可以直接从IPv4子网映射到IPv6子网吗?例如,IPv4 / 24是否直接对应于IPv6 / 56或/ 120?

任何此类映射都取决于本地策略。

我的接口有几个IPv6地址。所有子网的子网都必须相同吗?

没有

为什么有时在IPv6地址中看到%而不是/,这是什么意思?

%是接口标识符。它与链接本地地址一起使用。因为一台机器可能具有多个接口,并且连接到这些接口的网络可能具有重叠的链接本地地址,所以需要它。

我在浪费太多子网吗?我们不只是要再次耗尽吗?

我不会为此担心太多。

即使IPv6设计人员做出了一个奇怪的决定,即使用128位地址空间然后将其丢弃近一半用于无状态自动配置,IPv6仍比IPv4拥有更大的空间。

而且,如果出现紧缩,只需花费几笔就可以恢复这个奇怪的决定。

IPv6可伸缩性的一个更大的问题是路由表的大小。强烈建议不要使用IPv6 NAT。在提供商分配的地址上运行大型网络会导致提供商锁定的巨大风险。

因此,我相信,随着IPv6对公司网络的渗透率不断提高,我们将看到对与提供商无关的IPv6空间的需求激增。

IPV6的前缀长度

IPv4 addresses have a subnet mask but instead of typing something like 255.255.255.0 we use a prefix length for IPv6. Here is an example of an IPv6 prefix:

2001:1111:2222:3333::/64

This is pretty much the same as using 192.168.1.1 /24. The number behind the / are the number of bits that we use for the prefix. In the example above it means that 2001:1111:2222:3333 is the prefix (64 bits) and everything behind it can be used for hosts.

When calculating subnets for IPv4 we can use the subnet mask to determine the network address and for IPv6 we can do something alike. For any given IPv6 address we can calculate what the prefix is but it works a bit different.

Let me show you what I’m talking about, here’s an IPv6 address that could be assigned to a host:

2001:1234:5678:1234:5678:ABCD:EF12:1234/64

What part from this IPv6 address is the prefix and what part identifies the host?

 

IPv6 prefix host blue green

 

Since we use a /64 it means that the first 64 bits are the prefix. Each hexadecimal character represents 4 binary bits so that means that this part is the prefix:

2001:1234:5678:1234

This part has 16 hexadecimal characters. 16 x 4 means 64 bits. So that’s the prefix right there. The rest of the IPv6 address identifies the host:

5678:ABCD:EF12:1234

So we figured out that “2001:1234:5678:1234” is the prefix part but writing it down like this is not correct. To write down the prefix correctly we need to add zeros at the end of this prefix so that it is a 128 bit address again and add the prefix length:

 

IPv6 prefix host blue green arrows

 

2001:1234:5678:1234:0000:0000:0000:0000/64 is a valid prefix but we can shorten it. This string of zeros can be removed and replace by a single ::

2001:1234:5678:1234::/64

That’s the shortest way to write down the prefix. Let’s look at another example:

3211::1234:ABCD:5678:1010:CAFE/64

Before we can see what the prefix is, we should write down the complete address as this one has been shortened (see the :: ). Just add the zeros until we have a full 128 bit address again:

3211:0000:0000:1234:ABCD:5678:1010:CAFE/64

We still have a prefix length of 64 bits. A single hexadecimal character represents 4 binary bits, so the first 16 hexadecimal characters are the prefix:

3211:0000:0000:1234

Now we can add zeros at the end to make it a 128 bit address again and add the prefix length:

3211:0000:0000:1234::/64

That’s a good looking prefix but we can make it a little shorter:

3211:0:0:1234::/64

4 zeroes in a row can be replaced by a single one, so “3211:0:0:1234::/64” is the shortest we can make this prefix.

Depending on the prefix length it makes the calculations very easy or (very) difficult. In the examples I just showed you both prefixes had a length of 64. What if I had a prefix length of /53 or something?

Each hexadecimal character represents 4 binary bits. When your prefix length is a multiple of 16 then it’s easy to calculate because 16 binary bits represent 4 hexadecimal characters.

Here’s an illustration:

 

IPv6 hexadecimal to binary

 

So with a prefix length of 64 we have 4 “blocks” with 4 hexadecimal characters each which makes it easy to calculate. When the prefix length is a multiple of 4 then it’s still not too bad because the boundary will be a single hexadecimal character.

When the prefix length is not a multiple of 16 or 4 it means we have to do some binary calculations. Let me give you an example!

2001:1234:abcd:5678:9877:3322:5541:aabb/53

This is our IPv6 address and I would like to know the prefix for this address. Where do I start?

First I have to determine in what “block” my 53rd bit is located:

 

IPv6 address 53rd bit

 

Somewhere in the blue block we will find the 53rd bit. To know what the prefix is we will have to calculate those hexadecimal characters to binary:

 

IPv6 hexadecimal to binary 53th bit

 

We now have the block that contains the 53rd, this is where the boundary is between “prefix” and “host”:

 

 
 

IPv6: 兼容地址(Compatibility Address)

为使现有网络能从IPv4平滑过渡到IPv6,需要用到一些IPv6转换机制。本文简单总结了较为流行的一些IPv6兼容地址,这些地址能够在特定转化机制下,在IPv4网络中使用:

1. IPv4-mapped IPv6 addresses

  • 地址格式 ::ffff:w.x.y.z

2. ISATAP(Intra-Site Automatic Tunnel Addressing Protocal)地址

  • 地址格式 ::0:5EFE:w.x.y.z
  • 任何一个可以用在unicast地址的64位前缀,都可以用作ISATAP地址的前缀
  • 例如Link-local地址(FE80::/64),则有Link-local ISATAP地址FE80::5EFE:w.x.y.z
  • 实现:Windows XP, Windows Vista, Windows 7, Windows Mobile, Linux

3. 6over4地址

  • 地址格式 ::wwxx:yyzz 其中ww,xx,yy,zz都是十六进制
  • 任何一个可以用在unicast地址的64位前缀,都可以用作6over4地址的前缀
  • 例如Link-local地址(FE80::/64),则有Link-local 6over4地址FE80::wwxx.yyzz
  • 局限:6over4需要IPv4多播支持

4. Teredo地址

  • 地址格式 2001::/32
  • Teredo地址属于Global Unicast地址
  • Teredo协议将IPv6数据包封装成IPv4 UDP包,这些数据包被转发到Teredo中继上
  • Teredo中继(连接到IPv6网络的Teredo节点)接收、解封这些数据包,并发送到IPv6网络上
  • 局限:Teredo对NAT支持不佳

5. 6to4地址

  • 地址格式 2002:wwxx:yyzz::/48 其中ww,xx,yy,zz都是十六进制
  • 6to4地址属于Global Unicast地址
  • IPv4地址包含在IPv6地址前缀中
  • 和Teredo类似,6to4需要中继服务器

地址转换示例:

Example: IPv4 address to 6to4 IPv6 address
    IPv4 dec:  192 . 0 . 2 . 4
    IPv4 hex:   C0 . 0 . 2 . 4
    IPv4 hex:     C000 0204
    IPv6 pre:2002:C000:0204::/48

6. IPv4-compatible地址【已弃用】

  • 地址格式 ::w.x.y.z

References:

[1] 戴友炜,Windows Server 2008 R2安装于管理,清华大学出版社
[2] IPv6(English Version)
[3] IPv6(中文版)
[4] ISATAP
[5] 6over4
[6] Teredo tunneling
[7] 6to4

About Us

Since 1996, our company has been focusing on domain name registration, web hosting, server hosting, website construction, e-commerce and other Internet services, and constantly practicing the concept of "providing enterprise-level solutions and providing personalized service support". As a Dell Authorized Solution Provider, we also provide hardware product solutions associated with the company's services.
 

Contact Us

Address: No. 2, Jingwu Road, Zhengzhou City, Henan Province

Phone: 0086-371-63520088 

QQ:76257322

Website: 800188.com

E-mail: This email address is being protected from spambots. You need JavaScript enabled to view it.