系统管理指南:IP 服务

第 11 章 IPv6 详解(参考)

本章包含以下有关 Oracle Solaris 10 IPv6 实现的参考信息。

有关 IPv6 的概述,请参阅第 3 章。有关配置启用 IPv6 的网络的任务,请参阅第 7 章

IPv6 中的新增功能详解

在 Solaris 10 7/07 中,/etc/inet/ipnodes 文件已过时。只能对早期 Oracle Solaris 10 发行版使用 /etc/inet/ipnodes,如以下各个过程中所述。

IPv6 寻址格式进阶

第 3 章介绍了最常见的 IPv6 寻址格式:单点传送站点地址和链路本地地址。本节深入说明了第 3 章中未详细介绍的寻址格式:

6to4 派生地址

如果计划从路由器或主机端点配置 6to4 隧道,则必须在端点系统上的 /etc/inet/ndpd.conf 文件中通告 6to4 站点前缀。有关配置 6to4 隧道的介绍和任务,请参阅如何配置 6to4 隧道

下图显示了 6to4 站点前缀的各个部分。

图 11–1 6to4 站点前缀的各个部分

该图显示了 6to4 站点前缀的格式及其示例。该图中的信息在所列举的表中进行了说明。

下图显示了 6to4 站点的子网前缀(如 ndpd.conf 文件中包含的子网前缀)的各个部分。

图 11–2 6to4 子网前缀的各个部分

该图显示了 6to4 前缀的格式及其示例。下面的内容介绍了该图中的信息。

本表解释了 6to4 子网前缀的各个部分、这些部分各自的长度及其定义。

部分 

长度 

定义 

前缀 

16 位 

6to4 前缀标签 2002 (0x2002)。 

IPv4 地址 

32 位 

已在 6to4 接口上配置的唯一的 IPv4 地址。对于通告,需要指定用十六进制形式表示的 IPv4 地址,而不要指定点分十进制形式的 IPv4 地址。 

子网 ID 

16 位 

子网 ID,对于 6to4 站点上的链路必须唯一。 

主机上的 6to4 派生地址

当 IPv6 主机以路由器通告的形式收到 6to4 派生前缀时,它会自动在接口上重新配置 6to4 派生地址。6to4 派生地址具有以下格式:


prefix:IPv4-address:subnet-ID:interface-ID/64

在具有 6to4 接口的主机上执行 ifconfig -a 命令所产生的输出类似于以下内容:


qfe1:3: flags=2180841<UP,RUNNING,MULTICAST,ADDRCONF,ROUTER,IPv6>
 mtu 1500 index 7
        inet6 2002:8192:56bb:9258:a00:20ff:fea9:4521/64 

在该输出中,inet6 后面是 6to4 派生地址。

本表解释了 6to4 派生地址的各个部分、这些部分的长度以及它们提供的信息。

地址中的各个部分 

长度 

定义 

prefix

16 位 

2002,6to4 前缀

IPv4-address

32 位 

8192:56bb,在 6to4 路由器上配置的 6to4 伪接口的 IPv4 地址(用十六进制形式表示)

subnet-ID

16 位 

9258,此主机所属的子网的地址

interface-ID

64 位 

a00:20ff:fea9:4521,为 6to4 配置的主机接口的接口 ID

IPv6 多点传送地址详解

IPv6 多点传送地址提供了一种将相同的信息或服务分发到一组已定义接口(称为多点传送组)的方法。通常,多点传送组的接口位于不同的节点上。一个接口可以属于任意数量的多点传送组。发送到多点传送地址的包将到达多点传送组的所有成员。例如,使用多点传送地址的一种情况就是广播信息,这与 IPv4 广播地址的功能相似。

下表显示了多点传送地址的格式。

表 11–1 IPv6 多点传送地址的格式

8 位 

4 位 

4 位 

8 位 

8 位 

64 位 

32 位 

11111111

FLGS

SCOP

Reserved

Plen

Network prefix

Group ID

下面是每个字段的内容摘要。

有关多点传送格式的完整详细信息,请参阅RFC 3306, "Unicast-Prefix-based IPv6 Multicast Addresses

某些 IPv6 多点传送地址是由 Internet 编号分配机构 (Internet Assigned Numbers Authority, IANA) 永久指定的。所有 IPv6 主机和 IPv6 路由器必需的“所有节点多点传送地址”和“所有路由器多点传送地址”就是这样的地址。IPv6 多点传送地址也可以由系统动态分配。有关正确使用多点传送地址和组的更多信息,请参见 RFC 3307, "Allocation Guidelines for IPv6 Multicast Addresses"

IPv6 数据包头的格式

IPv6 协议定义一组数据包头,包括基本 IPv6 数据包头和 IPv6 扩展头。下图显示了 IPv6 数据包头中的字段以及这些字段的顺序。

图 11–3 IPv6 基本数据包头的格式

该图显示 128 位 IPv6 数据包头由八个字段(包括源地址和目标地址)组成。

以下列表介绍了每个头字段的功能。

IPv6 扩展头

IPv6 选项位于包中的 IPv6 数据包头和传输层头之间的单独扩展头中。在包到达其最终目标之前,包传送路径中的任何路由器都不会检查或处理大多数 IPv6 扩展头。此功能显著改进了路由器对于包含选项的包的路由性能。在 IPv4 中,只要存在任何选项,就会要求路由器检查所有的选项。

与 IPv4 选项不同,IPv6 扩展头可以为任意长度。此外,一个包可承载的选项数量也不限于 40 字节。除了 IPv6 选项的处理方式,此功能还允许将 IPv6 选项用于那些在 IPv4 中不可行的功能。

为了在处理后续选项头以及随后的传输协议时提高性能,IPv6 选项始终设置为 8 个八位字节长度的整数倍。8 个八位字节长度的整数倍可以使后续的头保持对齐。

下面是目前已定义的 IPv6 扩展头:

双栈协议

双栈通常是指协议栈中的所有级别(从应用层到网络层)都是重复的。同时运行 OSI 协议和 TCP/IP 协议的系统就是完全重复的示例。

Oracle Solaris : 是双栈协议,即 Oracle Solaris : 同时实现了 IPv4 和 IPv6 协议。安装操作系统时,可以选择在 IP 层启用 IPv6 协议,或者只使用缺省的 IPv4 协议。TCP/IP 栈的其余部分是相同的。因此,相同的 TCP、UDP 和 SCTP 传输协议可同时在 IPv4 和 IPv6 上运行。此外,相同的应用程序也可同时在 IPv4 和 IPv6 上运行。图 11–4 显示了 IPv4 和 IPv6 协议如何作为双栈协议在 Internet 协议套件的各个层中工作。

图 11–4 双栈协议体系结构

说明 IPv4 和 IPv6 协议如何作为双栈协议在各个 OSI 层中工作。

在双栈方案中,除支持 IPv4 之外,部分主机和路由器还应升级为支持 IPv6。双栈方案可以确保已升级的节点始终能够使用 IPv4 与仅支持 IPv4 的节点进行交互。

Oracle Solaris 10 IPv6 实现

本节介绍在 Oracle Solaris : 中启用 IPv6 的文件、命令和守护进程。

IPv6 配置文件

本节介绍属于 IPv6 实现的配置文件:

ndpd.conf 配置文件

/etc/inet/ndpd.conf 文件用于配置由 in.ndpd 相邻节点搜索守护进程使用的选项。对于路由器,主要使用 ndpd.conf 来配置要通告到链路上的站点前缀。对于主机,可使用 ndpd.conf 禁用地址自动配置功能或配置临时地址。

下表显示了 ndpd.conf 文件中使用的关键字。

表 11–2 /etc/inet/ndpd.conf 关键字

变量 

说明 

ifdefault

指定所有接口的路由器行为。使用以下语法设置路由器参数和相应的值: 

ifdefault [variable-value]

prefixdefault

指定前缀通告的缺省行为。使用以下语法设置路由器参数和相应的值: 

prefixdefault [variable-value]

if

设置每个接口的参数。使用以下语法: 

if interface [variable-value ]

prefix

通告每个接口的前缀信息。使用以下语法: 

prefix prefix/length interface [variable-value]

ndpd.conf 文件中,可以将该表中的关键字与一组路由器配置变量结合使用。这些变量在 RFC 2461, Neighbor Discovery for IP Version 6 (IPv6) 中进行了详细定义。

下表显示了配置接口的变量及其简短定义。

表 11–3 /etc/inet/ndpd.conf 接口配置变量

变量 

缺省值 

定义 

AdvRetransTimer

指定路由器所发送的通告消息中“重新传输计时器”字段的值。 

AdvCurHopLimit

Internet 的当前直径 

指定路由器所发送的通告消息中当前跃点限制的值。 

AdvDefaultLifetime

3 + MaxRtrAdvInterval

指定路由器通告的缺省生命周期。 

AdvLinkMTU

指定路由器所发送的最大传输单元 (maximum transmission unit, MTU) 值。零表示没有为路由器指定 MTU 选项。 

AdvManaged Flag

False 

指示路由器通告中“管理地址配置”标志的值。 

AdvOtherConfigFlag

False 

指示路由器通告中“其他有状态配置”标志的值。 

AdvReachableTime

指定路由器所发送的通告消息中“可访问时间”字段的值。 

AdvSendAdvertisements

False 

指示节点是否应当发出通告并响应路由器请求。需要在 ndpd.conf 文件中将该变量明确设置为 "TRUE" 以启用路由器通告功能。有关更多信息,请参阅如何配置启用了 IPv6 的路由器

DupAddrDetect

Transmits

定义在对本地节点地址进行重复地址检测期间,相邻节点搜索协议应当发送的连续相邻节点请求消息的数量。 

MaxRtrAdvInterval

600 秒 

指定在两次发送未经请求的多点传送通告之间等待的最长时间。 

MinRtrAdvInterval

200 秒 

指定在两次发送未经请求的多点传送通告之间等待的最短时间。 

StatelessAddrConf

True 

控制节点是否通过无状态地址自动配置功能来配置节点的 IPv6 地址。如果在 ndpd.conf 中声明为 False,则必须手动配置地址。有关更多信息,请参阅如何配置用户指定的 IPv6 标记

TmpAddrsEnabled

False 

指示是否为一个节点的所有接口或某个特定接口创建临时地址。有关更多信息,请参阅如何配置临时地址

TmpMaxDesyncFactor

600 秒 

指定一个随机值,启动 in.ndpd 命令时会从首选的生命周期变量 TmpPreferredLifetime 中减去该值。TmpMaxDesyncFactor 变量旨在防止网络上的所有系统同时重新生成它们的临时地址。TmpMaxDesyncFactor 允许您更改这个随机值的上限。

TmpPreferredLifetime

False 

设置临时地址的首选生命周期。有关更多信息,请参阅如何配置临时地址

TmpRegenAdvance

False 

为临时地址指定地址过时之前的前导时间。有关更多信息,请参阅如何配置临时地址

TmpValidLifetime

False 

设置临时地址的有效生命周期。有关更多信息,请参阅如何配置临时地址

下表显示了用于配置 IPv6 前缀的变量。

表 11–4 /etc/inet/ndpd.conf 前缀配置变量

变量 

缺省值 

定义 

AdvAutonomousFlag

True 

指定“前缀信息”选项中“自治标志”字段的值。  

AdvOnLinkFlag

True 

 

指定“前缀信息”选项中“在链路 (on-link)”标记(“L 位”)的值。 

AdvPreferredExpiration

未设置 

指定首选的前缀失效日期。 

AdvPreferredLifetime

604800 秒 

指定“前缀信息”选项中首选生命周期的值。  

AdvValidExpiration

未设置 

指定有效的前缀失效日期。 

AdvValidLifetime

2592000 秒 

指定所配置的前缀的有效生命周期。 


示例 11–1 /etc/inet/ndpd.conf 文件

以下示例显示了如何在 ndpd.conf 文件中使用关键字和配置变量。删除注释符号 (#) 可激活相应的变量。


# ifdefault      [variable-value ]*
# prefixdefault [variable-value ]*
# if ifname   [variable-value ]*
# prefix prefix/length ifname
#
#  Per interface configuration variables
#
#DupAddrDetectTransmits
#AdvSendAdvertisements
#MaxRtrAdvInterval
#MinRtrAdvInterval
#AdvManagedFlag
#AdvOtherConfigFlag
#AdvLinkMTU
#AdvReachableTime
#AdvRetransTimer
#AdvCurHopLimit
#AdvDefaultLifetime
#
# Per Prefix:  AdvPrefixList configuration variables
#
#
#AdvValidLifetime
#AdvOnLinkFlag
#AdvPreferredLifetime
#AdvAutonomousFlag
#AdvValidExpiration
#AdvPreferredExpiration

ifdefault AdvReachableTime 30000 AdvRetransTimer 2000
prefixdefault AdvValidLifetime 240m AdvPreferredLifetime 120m

if qe0 AdvSendAdvertisements 1
prefix 2:0:0:56::/64 qe0
prefix fec0:0:0:56::/64 qe0

if qe1 AdvSendAdvertisements 1
prefix 2:0:0:55::/64 qe1
prefix fec0:0:0:56::/64 qe1

if hme1 AdvSendAdvertisements 1
prefix  2002:8192:56bb:1::/64 qfe0 

if hme1 AdvSendAdvertisements 1
prefix  2002:8192:56bb:2::/64 hme1

IPv6 接口配置文件

IPv6 在启动时使用 /etc/hostname6.interface 文件自动定义 IPv6 逻辑接口。如果在安装 Oracle Solaris : 的过程中选择“启用 IPv6”选项,除了 /etc/hostname.interface 文件之外,安装程序还会为主网络接口创建一个 /etc/hostname6.interface 文件。

如果在安装过程中检测到多个物理接口,系统将提示您是否要配置这些接口。安装程序会为指定的其他各个接口创建 IPv4 物理接口配置文件和 IPv6 逻辑接口配置文件。

与 IPv4 接口一样,您也可以在安装 Oracle Solaris : 之后手动配置 IPv6 接口。请为新接口创建 /etc/hostname6.interface 文件。有关手动配置接口的说明,请参阅在 Solaris 10 3/05 中管理接口第 6 章

网络接口配置文件名称的语法如下所示:


hostname.interface
hostname6.interface

interface 变量的语法如下所示:


dev[.module[.module ...]]PPA
dev

指示网络接口设备。可以是物理网络接口(如 eriqfe),也可以是逻辑接口(如隧道)。有关更多详细信息,请参见IPv6 接口配置文件

Module

列出一个或多个在检测设备时要推入设备的 STREAMS 模块。

PPA

指示物理连接点。

也可以使用语法 [.[.]]。


示例 11–2 IPv6 接口配置文件

以下是 IPv6 配置文件有效名称的示例:


hostname6.qfe0
hostname.ip.tun0
hostname.ip6.tun0
hostname6.ip6to4tun0
hostname6.ip.tun0
hostname6.ip6.tun0

/etc/inet/ipaddrsel.conf 配置文件

/etc/inet/ipaddrsel.conf 文件包含 IPv6 缺省地址选择策略表。如果在安装 Oracle Solaris : 时启用了 IPv6,则该文件包含表 11–5 中所示的内容。

可以编辑 /etc/inet/ipaddrsel.conf 的内容。但是,在大多数情况下,应当避免修改此文件。如果一定要进行修改,请参阅如何管理 IPv6 地址选择策略表过程。有关 ippaddrsel.conf 的更多信息,请参阅修改 IPv6 地址选择策略表的原因ipaddrsel.conf(4) 手册页。

与 IPv6 相关的命令

本节介绍实现 Oracle Solaris : IPv6 时添加的命令,还会介绍为支持 IPv6 而对现有命令进行的修改。

ipaddrsel 命令

使用 ipaddrsel 命令,可以修改 IPv6 缺省地址选择策略表。

Oracle Solaris : 内核使用 IPv6 缺省地址选择策略表为 IPv6 数据包头执行目标地址排序和源地址选择。/etc/inet/ipaddrsel.conf 文件包含该策略表。

下表列出了缺省地址的格式以及它们的策略表优先级。有关 IPv6 地址选择的技术详细信息,请参见 inet6(7P) 手册页。

表 11–5 IPv6 地址选择策略表

前缀 

优先级 

定义 

::1/128

50 

回送 

::/0

40 

缺省值 

2002::/16

30 

6to4 

::/96

20 

与 IPv4 兼容 

::ffff:0:0/96

10 

IPv4 

在该表中,IPv6 前缀(::1/128::/0)优先于 6to4 地址 (2002::/16)、IPv4 地址(::/96::ffff:0:0/96)。因此,在缺省情况下,内核将为转至另一个 IPv6 目标的包选择接口的全局 IPv6 地址。接口的 IPv4 地址具有较低的优先级,对于转至 IPv6 目标的包尤其如此。如果给出了选定的 IPv6 源地址,内核针对目标地址也使用 IPv6 格式。

修改 IPv6 地址选择策略表的原因

在许多情况下,您不必更改 IPv6 缺省地址选择策略表。如果确实需要管理策略表,请使用 ipaddrsel 命令。

在下列情况下,您可能希望修改策略表:

有关 ipaddrsel 命令的详细信息,请参阅 ipaddrsel(1M) 手册页。

6to4relay 命令

使用 6to4 隧道连接,可以在相互隔离的 6to4 站点之间进行通信。但是,要使用本地的非 6to4 IPv6 站点传输包,6to4 路由器必须使用 6to4 中继路由器建立一个隧道。然后,6to4 中继路由器将 6to4 包转发到 IPv6 网络,并最终将其传输到本地 IPv6 站点。如果启用了 6to4 的站点必须与本地 IPv6 站点交换数据,请使用 6to4relay 命令启用相应的隧道。

由于使用中继路由器不太安全,因此 Oracle Solaris : 在缺省情况下会禁用与中继路由器的隧道连接。在部署该方案之前,请认真考虑在建立通往 6to4 中继路由器的隧道时所涉及的问题。有关 6to4 中继路由器的详细信息,请参阅6to4 中继路由器隧道的注意事项。如果决定启用 6to4 中继路由器支持,可以参阅如何配置 6to4 隧道中的相关操作步骤。

6to4relay 的语法

6to4relay 命令的语法如下:


6to4relay -e [-a IPv4-address] -d -h
-e

在 6to4 路由器和某个任意点传送 6to4 中继路由器之间启用隧道支持。隧道端点地址随后将设置为 192.88.99.1(6to4 中继路由器任意点传送组的缺省地址)。

-a IPv4-address

在 6to4 路由器和具有指定 IPv4-address 的 6to4 中继路由器之间启用隧道支持。

-d

禁用对通往 6to4 中继路由器的隧道的支持,这是 Oracle Solaris : 的缺省设置。

-h

显示 6to4relay 的帮助。

有关更多信息,请参阅 6to4relay(1M) 手册页。


示例 11–3 6to4 中继路由器支持的缺省状态

不带参数的 6to4relay 命令显示 6to4 中继路由器支持的当前状态。以下示例显示了在 Oracle Solaris : 中实现的 IPv6 的缺省状态。


# /usr/sbin/6to4relay
6to4relay:6to4 Relay Router communication support is disabled


示例 11–4 在启用了 6to4 中继路由器支持的情况下所显示的状态

如果启用了中继路由器支持,6to4relay 将显示以下输出:


# /usr/sbin/6to4relay
6to4relay:6to4 Relay Router communication support is enabled
IPv4 destination address of Relay Router=192.88.99.1


示例 11–5 指定了 6to4 中继路由器时显示的状态

如果为 -6to4relay 命令指定了 a 选项和 IPv4 地址,将显示用 -a 提供的 IPv4 地址,而不显示 192.88.99.1

6to4relay 不报告 -d-e-a IPv4 address 选项是否成功执行。但是,6to4relay 会显示在运行这些选项时可能生成的任何错误消息。


为支持 IPv6 而对 ifconfig 命令进行的扩展

可以使用 ifconfig 命令对IPv6 接口和隧道连接模块进行检测。ifconfig 使用一组经过扩展的 ioctl 来配置 IPv4 和 IPv6 网络接口。下面描述了可支持 IPv6 操作的 ifconfig 选项。有关涉及 ifconfig 命令的一系列 IPv4 和 IPv6 任务,请参见使用 ifconfig 命令监视接口配置

index

设置接口索引。

tsrc/tdst

设置隧道源或目标。

addif

创建下一个可用的逻辑接口。

removeif

删除具有特定 IP 地址的逻辑接口。

destination

设置接口的点对点目标地址。

set

为接口设置地址和/或网络掩码。

subnet

设置接口的子网地址。

xmit/-xmit

启用或禁用在接口上传输包。

第 7 章介绍了 IPv6 配置过程。


示例 11–6 在 ifconfig 命令中使用 -addif 选项添加 IPv6 逻辑接口

以下形式的 ifconfig 命令可创建 hme0:3 逻辑接口:


# ifconfig hme0 inet6 addif up
Created new logical interface hme0:3

以下形式的 ifconfig 可验证是否创建了新接口:


# ifconfig hme0:3 inet6
hme0:3: flags=2000841<UP,RUNNING,MULTICAST,IPv6> mtu 1500 index 2
		inet6  inet6 fe80::203:baff:fe11:b321/10


示例 11–7 在 ifconfig 命令中使用 -removeif 选项删除 IPv6 逻辑接口

以下形式的 ifconfig 命令可删除 hme0:3 逻辑接口:


# ifconfig hme0:3 inet6 down

# ifconfig hme0 inet6 removeif 1234::5678


示例 11–8 使用 ifconfig 配置 IPv6 隧道源


# ifconfig ip.tun0 inet6 plumb index 13

打开要与物理接口名称相关联的隧道。


# ifconfig ip.tun0 inet6
ip.tun0: flags=2200850<POINTOPOINT,RUNNING,MULTICAST,NONUD,
#IPv6> mtu 1480 index 13
		inet tunnel src 0.0.0.0 
		inet6 fe80::/10 --> :: 

配置 TCP/IP 使用隧道设备并报告设备状态所需要的流。


# ifconfig ip.tun0 inet6 tsrc 120.46.86.158 tdst 120.46.86.122

配置隧道的源地址和目标地址。


# ifconfig ip.tun0 inet6
ip.tun0: flags=2200850<POINTOPOINT,RUNNING,MULTICAST,NONUD,
IPv6> mtu 1480 index 13
		inet tunnel src 120.46.86.158  tunnel dst 120.46.86.122
		inet6 fe80::8192:569e/10 --> fe80::8192:567a

在配置之后报告设备的新状态。



示例 11–9 通过 ifconfig 配置 6to4 隧道(长格式)

以下示例显示在 6to4 伪接口配置中子网 ID 为 1,并以十六进制形式指定主机 ID。


# ifconfig ip.6to4tun0 inet6 plumb
# ifconfig ip.6to4tun0 inet tsrc 129.146.86.187 \
2002:8192:56bb:1::8192:56bb/64 up

# ifconfig ip.6to4tun0 inet6
ip.6to4tun0: flags=2200041<UP,RUNNING,NONUD,IPv6>mtu 1480 index 11
        inet tunnel src 129.146.86.187 
        tunnel hop limit 60 
        inet6 2002:8192:56bb:1::8192:56bb/64 


示例 11–10 通过 ifconfig 配置 6to4 隧道(短格式)

以下示例显示了配置 6to4 隧道的短格式:


# ifconfig ip.6to4tun0 inet6 plumb
# ifconfig ip.6to4tun0 inet tsrc 129.146.86.187 up

# ifconfig ip.6to4tun0 inet6
ip.6to4tun0: flags=2200041<UP,RUNNING,NONUD,IPv6>mtu 1480 index 11
        inet tunnel src 129.146.86.187 
        tunnel hop limit 60 
        inet6 2002:8192:56bb::1/64 

为支持 IPv6 而对 netstat 命令进行的修改

netstat 命令显示 IPv4 和 IPv6 网络状态。可通过在 /etc/default/inet_type 文件中设置 DEFAULT_IP 值或者使用 -f 命令行选项来选择要显示的协议信息。如果永久设置 DEFAULT_IP,则可以确保 netstat 仅显示 IPv4 信息。可以使用 -f 选项来覆盖该设置。有关 inet_type 文件的更多信息,请参见 inet_type(4) 手册页。

netstat 命令的 -p 选项显示 net-to-media 表。对于 IPv4,该表是 ARP 表;对于 IPv6,该表是相邻节点高速缓存。有关详细信息,请参见 netstat(1M) 手册页。有关使用此命令的过程的说明,请参见如何显示套接字的状态

为支持 IPv6 而对 snoop 命令进行的修改

snoop 命令可以捕获 IPv4 和 IPv6 包。此命令可以显示 IPv6 数据包头、IPv6 扩展头、ICMPv6 数据包头和相邻节点搜索协议数据。缺省情况下,snoop 命令既可以显示 IPv4 包又可以显示 IPv6 包。如果您指定了 ipip6 协议关键字,snoop 命令将只显示 IPv4 包或 IPv6 包。使用 IPv6 的过滤选项,可以对所有的 IPv4 和 IPv6 包进行过滤,以便仅显示 IPv6 包。有关详细信息,请参见 snoop(1M) 手册页。有关使用 snoop 命令的过程,请参见如何监视 IPv6 网络通信

为支持 IPv6 而对 route 命令进行的修改

route 命令既作用于 IPv4 路由又作用于 IPv6 路由,IPv4 路由是缺省设置。如果在命令行中紧跟 route 命令之后使用 -inet6 选项,系统将针对 IPv6 路由执行操作。有关详细信息,请参见 route(1M) 手册页。

为支持 IPv6 而对 ping 命令进行的修改

ping 命令既可以使用 IPv4 协议又可以使用 IPv6 协议来探测目标主机。具体选择哪个协议取决于由特定目标主机的名称服务器所返回的地址。缺省情况下,如果名称服务器返回目标主机的 IPv6 地址,ping 命令将使用 IPv6 协议。如果名称服务器仅返回 IPv4 地址,ping 命令将使用 IPv4 协议。可以使用 -A 命令行选项指定要使用的协议以覆盖该操作。

有关详细信息,请参见 ping(1M) 手册页。有关使用 ping 的过程,请参阅使用 ping 命令探测远程主机

为支持 IPv6 而对 traceroute 命令进行的修改

可以使用 traceroute 命令跟踪到特定主机的 IPv4 和 IPv6 路由。从协议的角度看,tracerouteping 使用相同的算法。使用 -A 命令行选项可覆盖此选择。使用 -a 命令行选项,可以跟踪到多宿主主机的每个地址的各个单独路由。

有关详细信息,请参见 traceroute(1M) 手册页。有关使用 traceroute 的过程,请参阅使用 traceroute 命令显示路由信息

与 IPv6 相关的守护进程

本节讨论与 IPv6 相关的守护进程。

用于相邻节点搜索功能的 in.ndpd 守护进程

in.ndpd 守护进程可实现 IPv6 相邻节点搜索协议和路由器搜索。该守护进程还可实现 IPv6 的地址自动配置功能。下面显示了 in.ndpd 支持的选项。

-d

启用调试功能。

-D

针对特定事件启用调试功能。

-f

指定要从中读取配置数据的文件,而不是缺省的 /etc/inet/ndpd.conf 文件。

-I

列显与每个接口相关的信息。

-n

不回送路由器通告。

-r

忽略收到的包。

-v

指定详细模式,报告各种类型的诊断消息。

-t

启用包跟踪功能。

in.ndpd 守护进程由在 /etc/inet/ndpd.conf 配置文件中设置的参数以及 /var/inet/ndpd_state.interface 启动文件中适用的参数来控制。

如果 /etc/inet/ndpd.conf 文件存在,系统将解析该文件并使用它将节点配置为路由器。表 11–2 列出了此文件中可能出现的有效关键字。当主机引导之后,路由器可能无法立即使用。由路由器通告的包可能会被丢弃,当然,它们可能将无法送达到主机。

/var/inet/ndpd_state.interface 文件是一个状态文件。由每个节点定期更新。当该节点失败并重新启动之后,该节点可以在没有路由器的情况下配置其接口。此文件包含接口地址、上次更新文件的时间以及文件的有效期。此文件还包含从以前的路由器通告中“获知”的其他参数。


注 –

您不必修改状态文件的内容,in.ndpd 守护进程会自动维护状态文件。


有关配置变量和可允许值的列表,请参见 in.ndpd(1M) 手册页和 ndpd.conf(4) 手册页。

用于 IPv6 路由的 in.ripngd 守护进程

in.ripngd 守护进程可实现用于 IPv6 路由器的下一代路由信息协议 (Routing Information Protocol next-generation, RIPng)。RIPng 定义 IPv6 中与 RIP 等效的协议。在使用 routeadm 命令配置 IPv6 路由器并启用 IPv6 路由时,in.ripngd 守护进程可在路由器上实现 RIPng。

下面显示了 RIPng 支持的选项:

-p n

n 指定用于收发 RIPnG 包的备用端口号。

-q

禁止显示路由信息。

-s

强制显示路由信息,即使该守护进程充当路由器也是如此。

-P

禁止使用毒性逆转 (poison reverse)。

-S

如果 in.ripngd 不充当路由器,该守护进程将只输入每个路由器的缺省路由。

inetd 守护进程和 IPv6 服务

启用了 IPv6 的服务器应用程序可以既处理 IPv4 请求又处理 IPv6 请求,也可以仅处理 IPv6 请求。服务器始终通过 IPv6 套接字处理请求。另外,服务器还与相应的客户机使用相同的协议。要为 IPv6 添加或修改服务,请使用服务管理工具 (Service Management Facility, SMF) 中的命令。

要配置 IPv6 服务,必须确保该服务 inetadm 配置文件中的 proto 字段中列出了相应的值:

如果用其他实现来替代 Oracle Solaris : 命令,则必须验证所实现的服务是否支持 IPv6。如果该服务不支持 IPv6,则必须将 proto 值指定为 tcpudpsctp

下面是针对 echo 服务清单运行 inetadm 时生成的配置文件,该服务清单既支持 IPv4 又支持 IPv6,并且在 SCTP 上运行:


# inetadm -l svc:/network/echo:sctp_stream
	SCOPE    NAME=VALUE	  name="echo"
	         endpoint_type="stream"
	         proto="sctp6"
	         isrpc=FALSE
	         wait=FALSE
	         exec="/usr/lib/inet/in.echod -s"
	         user="root"
	default  bind_addr=""
	default  bind_fail_max=-1
	default  bind_fail_interval=-1
	default  max_con_rate=-1
	default  max_copies=-1
	default  con_rate_offline=-1
	default  failrate_cnt=40
	default  failrate_interval=60
	default  inherit_env=TRUE
	default  tcp_trace=FALSE
	default  tcp_wrappers=FALSE

要更改 proto 字段的值,请使用以下语法:


# inetadm -m FMRI proto="transport-protocols"

随 Oracle Solaris : 软件一起提供的所有服务器都只需要一个用来将 proto 指定为 tcp6udp6sctp6 的配置文件项。但是,远程 shell 服务器 (shell) 和远程执行服务器 (exec) 现在由单个服务实例组成,该服务实例要求 proto 值中同时包含 tcptcp6only 值。例如,要为 shell 设置 proto 值,可发出以下命令:


# inetadm -m network/shell:default proto="tcp,tcp6only"

有关写入使用套接字且启用了 IPv6 的服务器的更多详细信息,请参见《编程接口指南》中的“IPv6 extensions to the Socket API”。

在为 IPv6 配置服务时的注意事项

在为 IPv6 添加或修改服务时,请记住以下几点:

IPv6 相邻节点搜索协议

IPv6 引入了相邻节点搜索协议,如 RFC 2461, Neighbor Discovery for IP Version 6 (IPv6) 中所述。有关相邻节点搜索的主要功能的概述,请参阅IPv6 相邻节点搜索协议概述

本节讨论相邻节点搜索协议的以下功能:

相邻节点搜索功能中的 ICMP 消息

相邻节点搜索功能定义了五种新的 Internet 控制消息协议 (Internet Control Message Protocol, ICMP) 消息。这些消息具有以下用途:

自动配置过程

本节概述在自动配置过程中由接口执行的典型步骤。自动配置仅在能够进行多点传送的链路上执行。

  1. 启用能够进行多点传送的接口,例如,在启动某个节点上的系统时启用该接口。

  2. 节点在执行自动配置过程时首先为接口生成链路本地地址。

    链路本地地址是根据接口的介质访问控制 (Media Access Control, MAC) 地址构造的。

  3. 节点发送相邻节点请求消息,其中包含暂定为目标的链路本地地址。

    发送此消息的目的在于验证要使用的地址未由链路上的其他节点占用。在验证之后,可以将链路本地地址指定给接口。

    1. 如果建议的地址已被另一个节点使用,则该节点将返回一条相邻节点通告,声明该地址正在使用中。

    2. 如果另一个节点也正在尝试使用同一地址,则该节点也会针对该目标发送一条相邻节点请求。

      相邻节点请求传输或重新传输的数量以及连续请求之间的延迟与链路有关。如有必要,可以设置这些参数。

  4. 如果某个节点发现它要使用的链路本地地址不唯一,则自动配置过程会停止。此时,您必须手动配置该接口的链路本地地址。

    要简化恢复操作,可以提供一个备用接口 ID 来覆盖缺省标识符。这样,自动配置机制就可以使用这个可能唯一的新接口 ID 继续工作。

  5. 如果某个节点发现它要使用的链路本地地址唯一,该节点会将此地址指定给这个接口。

    此时,该节点与相邻节点具有 IP 级别的连通性。其余的自动配置步骤只能由主机执行。

获取路由器通告

自动配置的下一个阶段涉及到获取路由器通告或者确定是否没有路由器存在。如果存在路由器,路由器会发送路由器通告,以指定主机应当执行哪种类型的自动配置。

路由器定期发送路由器通告。但是,相邻通告之间的延迟通常比执行自动配置的主机可以等待的时间要长。为了快速获取通告,主机可以向所有路由器多点传送组发送一个或多个路由器请求。

前缀配置变量

路由器通告还包含前缀变量,其中包含无状态地址自动配置用于生成前缀的信息。路由器通告中“无状态地址自动配置”字段是单独处理的。“地址自动配置”标志是一个包含前缀信息的选项字段,它指示该选项是否可以应用于无状态自动配置过程。如果该选项字段确实适用,则其他选项字段中包含具有生命周期值的子网前缀。这些值指示根据前缀创建的地址保持优先和有效的时间长度。

因为路由器会定期生成路由器通告,所以主机会不断收到新通告。启用了 IPv6 的主机可处理包含在每个通告中的信息。主机会添加到这些信息中,还会刷新在以前的通告中收到的信息。

地址的唯一性

出于安全方面的考虑,在将每个地址指定给接口之前,必须测试它们是否唯一。对于通过无状态自动配置过程创建的地址,情况会有所不同。地址是否唯一主要由地址中基于接口 ID 创建的那一部分来确定。因此,如果经过验证,节点的链路本地地址唯一,则无需再逐一测试其他地址。这些地址必须是根据同一个接口 ID 创建的。与之相反,对于手动获取的所有地址,必须逐一测试它们是否唯一。某些站点的系统管理员认为执行重复地址检测得不偿失。对于这些站点,可通过设置每接口配置标志来禁用重复地址检测功能。

为了加速自动配置过程,主机可以生成其链路本地地址,并在等待路由器通告的同时验证该地址是否唯一。路由器可能会延迟几秒来响应路由器请求。因此,如果连续执行两个步骤,则完成自动配置所必需的总时间可能会非常长。

相邻节点请求和不可访问性

相邻节点搜索功能使用相邻节点请求消息来确定是否可以向同一个单点传送地址指定多个节点。相邻节点不可访问性检测功能检测相邻节点或到相邻节点的转发路径中是否有故障。该检测功能要求确认发送到某个相邻节点的包能够实际到达该相邻节点,还确定节点的 IP 层是否能够正确处理这些包。

相邻节点不可访问性检测功能使用来自以下两个来源的确认: 上层协议和相邻节点请求消息。如有可能,上层协议会确认某个连接正在执行转发。例如,当收到新的 TCP 确认时,上层协议会确认以前发送的数据已正确传送。

如果某个节点没有收到来自上层协议的肯定确认,该节点将发送单点传送相邻节点请求消息。这些消息会请求相邻节点通告,并根据此通告确认下一个跃点的可访问性。为了减少不必要的网络通信流量,探测消息只会发送到该节点将包实际发送到的相邻节点。

重复地址检测算法

为了确保所有已配置的地址在特定链路上的唯一性,节点需要针对这些地址运行重复地址检测算法。在将这些地址指定给接口之前,必须先针对节点运行该算法。重复地址检测算法是针对所有地址执行的。

本节中描述的自动配置过程仅适用于主机,而不适用于路由器。因为主机自动配置过程使用由路由器通告的信息,所以路由器需要通过其他方法进行配置。但是,路由器可使用本章中描述的机制来生成链路本地地址。另外,在将地址指定给接口之前,路由器应当能够通过针对所有地址的重复地址检测算法。

代理通告

代表目标地址接受包的路由器可以发出不可覆盖的相邻节点通告。路由器可以接受无法响应相邻节点请求的目标地址的包。目前未指定对于代理的使用。但是,代理通告有可能会用来处理诸如已移出链路的移动节点之类的情况。请注意,在处理未实现此协议的节点时,不应将使用代理作为一般机制。

传入负载平衡

具有复制接口的节点可能需要在同一个链路上的多个网络接口之间,对所收到的传入包进行负载平衡。这样的节点会将多个链路本地地址指定给同一个接口。例如,单个网络驱动程序可以将多个网络接口卡表示为具有多个链路本地地址的单个逻辑接口。

负载平衡的处理方式如下:允许路由器忽略来自路由器通告包的源链路本地地址。因此,相邻节点必须使用相邻节点请求消息来获知路由器的链路本地地址。于是,所返回的相邻节点通告消息可能包含链路本地地址,这些地址会因请求发出者而异。

链路本地地址更改

已知其链路本地地址发生更改的节点可以发出未经请求的多点传送相邻节点通告包。该节点可以向所有的节点发送多点传送包,从而更新所缓存的已无效的链路本地地址。发送未经请求的通告仅是为了提高性能。相邻节点不可访问性检测算法可确保所有的节点都能够可靠地搜索新地址,尽管延迟时间可能会稍长些。

相邻节点搜索协议与 ARP 和相关 IPv4 协议的比较

IPv6 相邻节点搜索协议的功能与下列 IPv4 协议的组合相对应: 地址解析协议 (Address Resolution Protocol, ARP)、Internet 控制消息协议 (Internet Control Message Protocol, ICMP)、路由器搜索和 ICMP 重定向。IPv4 对于相邻节点不可访问性检测没有公认的协议或机制。但是,主机要求确实为停用网关检测指定了一些可能的算法。停用网关检测所解决的问题是相邻节点不可访问性检测所能解决的问题的一部分。

以下是对相邻节点搜索协议和一组相关 IPv4 协议进行的比较。

IPv6 路由

在无类域间路由 (Classless Inter-Domain Routing, CIDR) 情况下,IPv6 中的路由与 IPv4 路由几乎完全相同。唯一的区别在于地址是 128 位 IPv6 地址,而非 32 位 IPv4 地址。通过非常简单的扩展,所有的 IPv4 路由算法,如 OSPF(开放式最短路径优先)、RIP(路由信息协议)、IDRP(域间路由协议)和 IS-IS(中间系统对中间系统),都可以用来路由 IPv6。

IPv6 还包括可支持功能强大的新路由功能的简单路由扩展。以下是对新路由功能的描述:

通过创建可使用 IPv6 路由选项的 IPv6 地址序列,可以获取新路由功能。IPv6 源使用路由选项列出在通往包目标的途中访问的中间节点(一个或多个)或拓扑组。此功能与 IPv4 的稀疏源路由选项和记录路由选项非常相似。

在大多数情况下,为了使地址序列成为一般功能,必须使用 IPv6 主机将主机所接收包中的路由反向。包必须使用 IPv6 验证头成功地进行验证。包中必须包含地址序列才能将包返回到其始发者。此方法会强制所实现的 IPv6 主机支持对源路由进行处理和反向。对源路由进行处理和反向非常重要,因为它使提供者能够使用实现了新 IPv6 功能(如提供器选择和扩展地址)的主机。

路由器通告

在能够进行多点传送的链路和点对点链路上,每个路由器都定期向多点传送组发送一个路由器通告包来公布其可用性。主机将从所有的路由器接收路由器通告,并创建缺省路由器的列表。路由器会频繁生成路由器通告,以便主机可以在几分钟内获知路由器是否存在。但是,路由器进行通告的频率不太高,因此不能依赖通告是否存在来检测路由器故障。可以通过用来确定相邻节点不可访问性的单独的检测算法来检测路由器故障。

路由器通告前缀

路由器通告中包含一系列子网前缀,这些前缀用来确定主机是否与路由器处在同一个链路上(在链路 (on-link)),还可用来配置自治地址。与前缀相关联的标志用来指定特定前缀的预定用法。主机使用通告的“在链路 (on-link)”前缀来创建和维护一个列表,该列表用于确定包的目标是在链路上还是在路由器外部。即使目标没有包含在所通告的任何“在链路 (on-link)”前缀中,目标也可以位于链路上。在这种情况下,路由器可以发送重定向消息。重定向功能通告发送者目标是相邻节点。

路由器通告和每前缀标志使路由器能够通告主机如何执行无状态地址自动配置。

路由器通告消息

路由器通告消息中还包含主机应当在外发包中使用的 Internet 参数(如跃点限制)。路由器通告消息中还可以包含链路参数,如链路 MTU。此功能允许对临界参数进行集中管理。这些参数可以针对路由器设置,它们可自动传播到所连接的全部主机。

节点可通过向多点传送组发送相邻节点请求以要求目标节点返回其链路层地址来完成地址解析。多点传送相邻节点请求消息会发送到目标地址中请求节点的多点传送地址。目标会在单点传送相邻节点通告消息中返回其链路层地址。对于启动器和目标来说,一个包请求/响应对就足以解析对方的链路层地址。启动器的相邻节点请求中包括其链路层地址。

IPv6 隧道

为了在双栈 IPv4/IPv6 站点中尽可能减少相关性,两个 IPv6 节点之间路径中的路由器不必都支持 IPv6。可支持类似网络配置的机制称作隧道。本质上,IPv6 包放在 IPv4 包中,IPv4 包随后通过 IPv4 路由器进行路由,下图说明通过 IPv4 路由器(在该图中用 "R" 指示)的隧道连接机制。

图 11–5 IPv6 隧道连接机制

说明如何将那些放在 IPv4 包中的 IPv6 包通过使用 IPv4 的路由器建立隧道连接。

Oracle Solaris : IPv6 实现中包括两种类型的隧道连接机制:

出于其他方面的考虑,目前在 Internet 上,例如,在 IPv4 MBONE(多点传送主干)上,使用已配置的隧道。从操作的角度看,隧道由两个路由器组成,这两个路由器配置为可通过 IPv4 网络建立虚拟的点对点链路。在可以预见的将来,这种隧道很有可能要用在 Internet 的某些部分上。

自动隧道要求使用与 IPv4 兼容的地址。当 IPv6 路由器不可用时,自动隧道可用来连接多个 IPv6 节点。这些隧道可以通过配置自动隧道连接网络接口来从双栈主机或双栈路由器发起。这些隧道总是在双栈主机终止。它们的工作方式如下:通过从与 IPv4 兼容的目标地址中提取目标 IPv4 地址(隧道的端点)来动态确定目标地址。

已配置的隧道

隧道连接接口具有以下格式:


ip.tun ppa

ppa 是物理连接点。

在系统启动时,隧道连接模块 (tun) 会由 ifconfig 命令推入 IP 的顶层,从而创建一个虚拟接口。推送操作可通过创建相应的 hostname6.* 文件来实现。

例如,要创建通过 IPv4 网络封装 IPv6 包的隧道(即 IPv6 over IPv4 隧道),可以创建以下文件名:


/etc/hostname6.ip.tun0

在对接口进行检测之后,此文件的内容将传递到 ifconfig。此文件内容将变成配置点对点隧道所必需的参数。


示例 11–11 IPv6 Over IPv4 隧道的 hostname6.ip.tun0 文件

下面举例说明 hostname6.ip.tun0 文件中的各项:


tsrc 10.10.10.23 tdst 172.16.7.19 up
addif 2001:db8:3b4c:1:5678:5678::2 up

在此示例中,源和目标 IPv4 地址用作自动配置 IPv6 链路本地地址的标记。这些地址分别是 ip.tun0 接口的源和目标。配置了两个接口。配置了 ip.tun0 接口。还配置了一个逻辑接口 ip.tun0:1。该逻辑接口的源和目标 IPv6 地址由 addif 命令指定。

当系统在多用户模式下启动后,这些配置文件的内容将会原封不动地传递到 ifconfig示例 11–11 中的项与以下各项等效:


# ifconfig ip.tun0 inet6 plumb
# ifconfig ip.tun0 inet6 tsrc 10.0.0.23 tdst 172.16.7.19 up
# ifconfig ip.tun0 inet6 addif 2001:db8:3b4c:1:5678:5678::2 up

下面显示了此隧道的 ifconfig -a 输出:


ip.tun0: flags=2200850<UP,POINTOPOINT,RUNNING,MULTICAST,
  NONUD,IPv6> mtu 1480 index 6
        inet tunnel src 10.0.0.23  tunnel dst 172.16.7.19
        inet6 fe80::c0a8:6417/10 --> fe80::c0a8:713
ip.tun0:1: flags=2200850<UP,POINTOPOINT,RUNNING,MULTICAST,NONUD,IPv6> mtu 1480 
  index 5
        inet6 2001:db8:3b4c:1:5678:5678::2 

可以使用以下语法,通过向配置文件中添加一些行来配置更多的逻辑接口:


addif IPv6-source IPv6-destination up

注 –

当隧道的任意一端是通过隧道通告一个或多个前缀的 IPv6 路由器时,不必在隧道配置文件中使用 addif 命令。可能只有 tsrctdst 才是必需的,因为所有其他地址都是自动配置的。


在某些情况下,需要为特定的隧道手动配置特定的源和目标链路本地地址。可通过更改配置文件的第一行来包括这些链路本地地址。下面是示例行:


tsrc 10.0.0.23 tdst 172.16.7.19 fe80::1/10 fe80::2 up

请注意,源链路本地地址的前缀长度为 10。在此示例中,ip.tun0 接口与以下内容类似:


ip.tun0: flags=2200850<UP,POINTOPOINT,RUNNING,MULTICAST,NONUD,IPv6> mtu 1480 
index 6
        inet tunnel src 10.0.0.23  tunnel dst 172.16.7.19
        inet6 fe80::1/10 --> fe80::2

要建立通过 IPv6 网络封装 IPv6 包的隧道(即 IPv6 over IPv6 隧道),可以创建以下文件名:


/etc/hostname6.ip6.tun0

示例 11–12 IPv6 over IPv6 隧道的 hostname6.ip6.tun0 文件

下面举例说明通过 IPv6 网络进行的 IPv6 封装的 hostname6.ip6.tun0 文件中的各项:


tsrc 2001:db8:3b4c:114:a00:20ff:fe72:668c 
        tdst 2001:db8:15fa:25:a00:20ff:fe9b:a1c3
fe80::4 fe80::61 up

要建立通过 IPv6 网络封装 IPv4 包的隧道(即 IPv4 over IPv6 隧道),可以创建以下文件名:


/etc/hostname.ip6.tun0

示例 11–13 IPv4 Over IPv6 隧道的 hostname.ip6.tun0 文件

下面举例说明通过 IPv6 网络进行的 IPv4 封装的 hostname.ip6.tun0 文件中的各项:


tsrc 2001:db8:3b4c:114:a00:20ff:fe72:668c 
         tdst 2001:db8:15fa:25:a00:20ff:fe9b:a1c3
10.0.0.4 10.0.0.61 up

要建立通过 IPv4 网络封装 IPv4 包的隧道(即 IPv4 over IPv4 隧道),可以创建以下文件名:


/etc/hostname.ip.tun0

示例 11–14 IPv4 Over IPv4 隧道的 hostname.ip.tun0 文件

下面举例说明通过 IPv4 网络进行的 IPv4 封装的 hostname.ip.tun0 文件中的各项:


tsrc 172.16.86.158 tdst 192.168.86.122
10.0.0.4 10.0.0.61 up

有关 tun 的具体信息,请参见 tun(7M) 手册页。有关在转换到 IPv6 的过程中隧道连接概念的一般说明,请参见IPv6 隧道概述。有关隧道配置过程的说明,请参见针对 IPv6 支持配置隧道所需的任务(任务列表)

6to4 自动隧道

Oracle Solaris : 中包括 6to4 隧道,这是用来从 IPv4 寻址过渡到 IPv6 寻址的临时首选方法。6to4 隧道允许 IPv6 隔离站点通过一个经由 IPv4 网络(不支持 IPv6)的自动隧道进行通信。要使用 6to4 隧道,必须将 IPv6 网络上的边界路由器配置为 6to4 自动隧道的一个端点。这样,6to4 路由器便可以参与通往另一个 6to4 站点的隧道,如果需要的话,还可以参与通往本地非 6to4 IPv6 站点的隧道。

本节提供有关下列 6to4 主题的参考资料:

下表介绍用来配置 6to4 隧道的额外任务,以及获得额外有用信息的资源。

任务或详细信息 

参考 

用来配置 6to4 隧道的任务 

如何配置 6to4 隧道

与 6to4 相关的 RFC(互联网信息文档和标准) 

RFC 3056, "Connection of IPv6 Domains via IPv4 Clouds"

有关 6to4relay 命令(该命令启用对通往 6to4 中继服务器的隧道的支持)的详细信息

6to4relay(1M)

6to4 安全问题 

Security Considerations for 6to4

6to4 隧道的拓扑

6to4 隧道提供到任何位置的所有 6to4 站点的 IPv6 连接。 如果 6to4 隧道配置为向中继路由器转发,该隧道也同样提供到所有 IPv6 站点的连接(包括本地 IPv6 Internet)。下图显示了 6to4 隧道如何提供两个 6to4 站点之间的连接。

图 11–6 两个 6to4 站点之间的隧道

下文将对该图中显示的 6to4 隧道进行说明。

此图描述了两个隔离的 6to4 网络:站点 A 和站点 B。每个站点都配置了能够连接到外部 IPv4 网络的路由器。跨 IPv4 网络的 6to4 隧道可以连接两个 6to4 站点。

必须至少配置一个路由器接口来支持 6to4,才能让 IPv6 站点成为 6to4 站点。此接口必须提供与 IPv4 网络的外部连接。在 qfe0 上配置的地址必须全局唯一。在上图中,边界路由器 A 的 qfe0 接口将站点 A 连接到 IPv4 网络。只有在用 IPv4 地址配置 qfe0 接口后,才能将 qfe0 配置为 6to4 伪接口。

在此图中,6to4 站点 A 由两个子网组成,这两个子网连接到路由器 A 上的接口 hme0hme1。站点 A 任一子网上的所有 IPv6 主机,在收到来自路由器 A 的通告时,都会自动使用 6to4 派生地址重新配置。

站点 B 是另一个隔离的 6to4 站点。为了正确地从站点 A 接收通信,必须在站点 B 上配置边界路由器以支持 6to4。否则,路由器从站点 A 接收的包将因无法识别而被丢弃。

通过 6to4 隧道的包流

本节介绍从一个 6to4 站点上的主机到远程 6to4 站点上的主机之间的包流。此方案使用图 11–6 中显示的拓扑。而且,它还假定已经配置了 6to4 路由器和 6to4 主机。

  1. 6to4 站点 A 的子网 1 上的主机发送传输请求,6to4 站点 B 上的主机作为目标。每个数据包头中均有 6to4 派生的源地址和 6to4 派生的目标地址。

  2. 站点 A 的路由器将每个 6to4 包封装到 IPv4 数据包头中。在该过程中,路由器将 IPv4 封装数据包头的目标地址设置为站点 B 的路由器地址。对于每个流经隧道接口的 IPv6 包,其 IPv6 目标地址同时也包含 IPv4 目标地址。因此,路由器将能够确定 IPv4 封装数据包头上设置的 IPv4 目标地址。路由器随后使用标准的 IPv4 路由过程,通过 IPv4 网络转发包。

  3. 包通过的任何 IPv4 路由器都使用包的 IPv4 目标地址进行转发。此地址是路由器 B 上某个接口的全局唯一 IPv4 地址,该接口还充当 6to4 伪接口。

  4. 来自站点 A 的包到达路由器 B,路由器 B 对 IPv4 数据包头中的 IPv6 包取消封装。

  5. 路由器 B 随后使用 IPv6 包中的目标地址将包转发到站点 B 上的接收主机。

6to4 中继路由器隧道的注意事项

6to4 中继路由器充当某些隧道的一个端点,这些隧道的另一个端点是需要与本地非 6to4 IPv6 网络通信的 6to4 路由器。本质上,中继路由器是 6to4 站点和本地 IPv6 站点之间的桥梁。因为此解决方案可能很不安全,所以,在缺省情况下,Oracle Solaris : 不启用对 6to4 中继路由器的支持。但是,如果站点需要这样的隧道,可以使用 6to4relay 命令来启用下面的隧道连接方案。

图 11–7 从 6to4 站点到 6to4 中继路由器的隧道

该图显示了 6to4 路由器和 6to4 中继路由器之间的隧道。下文将进一步描述该图。

图 11–7 中,6to4 站点 A 需要与本地 IPv6 站点 B 上的节点通信。该图显示了从站点 A 经由 IPv4 网络到达 6to4 隧道的通信路径。该隧道将 6to4 路由器 A 和 6to4 中继路由器作为其端点。IPv6 站点 B 所连接到的 IPv6 网络位于 6to4 中继路由器的外部。

6to4 站点和本地 IPv6 站点之间的包流

本节介绍从 6to4 站点到本地 IPv6 站点之间的包流。此方案使用图 11–7 中显示的拓扑。

  1. 6to4 站点 A 上的主机发送一个传输信号,将本地 IPv6 站点 B 上的主机指定为目标地址。每个数据包头都将 6to4 派生地址作为其源地址。目标地址是标准的 IPv6 地址。

  2. 站点 A 的 6to4 路由器将每个包封装到 IPv4 数据包头中,该 IPv4 数据包头将 6to4 中继路由器的 IPv4 地址作为其目标地址。6to4 路由器随后使用标准的 IPv4 路由过程,通过 IPv4 网络转发包。包遇到的任何 IPv4 路由器都会将包转发到 6to4 中继路由器。

  3. 物理位置距离站点 A 最近的任意点传送 6to4 中继路由器检索以 192.88.99.1 任意点传送组为目标的包。


    注 –

    6to4 中继路由器属于 6to4 中继路由器任意点传送组,它的 IP 地址为 192.88.99.1。此任意点传送地址是 6to4 中继路由器的缺省地址。如果您需要使用特定的 6to4 中继路由器,则可以覆盖缺省设置并指定该路由器的 IPv4 地址。


  4. 该中继路由器会对 6to4 包中的 IPv4 数据包头取消封装,并显示本地 IPv6 目标地址。

  5. 然后,该中继路由器将当前只包含 IPv6 的包发送到 IPv6 网络上,在该网络上,包最终将由站点 B 上的某个路由器检索到。检索到包的路由器随后会将包转发到目标 IPv6 节点。

Oracle Solaris : 名称服务的 IPv6 扩展

本节介绍在实现 IPv6 时引入的命名更改。可以将 IPv6 地址存储在任何 Oracle Solaris : 名称服务(如 NIS、LDAP、DNS 和 files)中。还可以使用 NIS over IPv6 RPC 传输机制来检索任何 NIS 数据。

DNS 的 IPv6 扩展

AAAA 资源记录是 IPv6 特定的资源记录,它已在 RFC 1886 "DNS Extensions to Support IP Version 6" 中指定。该 AAAA 记录将主机名映射到 128 位 IPv6 地址。IPv6 仍使用 PTR(指针)记录将 IP 地址映射为主机名。系统为 IPv6 地址保留了 128 位地址中的 32 个半字节(四位)。每个半字节都转换为与其相对应的十六进制 ASCII 值,然后再附加 ip6.int

nsswitch.conf 文件的更改

对于 Solaris 10 11/06 及早期发行版,除了通过 /etc/inet/ipnodes 查找 IPv6 地址的功能之外,还向 NIS、LDAP 和 DNS 名称服务中添加了 IPv6 支持。因此,已经对 nsswitch.conf 文件进行了修改以支持 IPv6 查找功能。


hosts:  files dns nisplus [NOTFOUND=return]
ipnodes: files dns nisplus [NOTFOUND=return]

注 –

在将 /etc/nsswitch.conf 文件更改为在多个名称服务中搜索 ipnodes 之前,请使用 IPv4 和 IPv6 地址填充这些 ipnodes 数据库。否则,不必要的延迟(包括可能的引导计时延迟)可能会导致解析主机地址。


下图显示了对于使用 gethostbynamegetipnodebyname 命令的应用程序,nsswitch.conf 文件和新名称服务数据库之间的新关系。斜体项为新项。gethostbyname 命令仅检查存储在 /etc/inet/hosts 中的 IPv4 地址。在 Solaris 10 11/06 及早期发行版中,getipnodebyname 命令会查阅在 nsswitch.conf 文件的 ipnodes 项中指定的数据库。如果查找失败,该命令会检查在 nsswitch.conf 文件中的 hosts 项中指定的数据库。

图 11–8 nsswitch.conf 和名称服务之间的关系

该图显示 NIS、NIS+、文件和 DNS 数据库与 nsswitch.conf 文件之间的关系。

有关名称服务的更多信息,请参见《系统管理指南:名称和目录服务(DNS、NIS 和 LDAP)》

名称服务命令的更改

为了支持 IPv6,可以用现有的名称服务命令查找 IPv6 地址。例如,ypmatch 命令可用于新的 NIS 映射。nslookup 命令可以在 DNS 中查找新的 AAAA 记录。

NFS 和 RPC IPv6 支持

NFS 软件和远程过程调用 (Remote Procedure Call, RPC) 软件以无缝方式支持 IPv6。与 NFS 服务相关的现有命令没有任何改变。而且大多数 RPC 应用程序无需任何更改即可运行于 IPv6 上。某些涉及到传输的高级 RPC 应用程序可能需要进行更新。

IPv6 Over ATM(异步传输模式)支持

Oracle Solaris : 支持 IPv6 over ATM、永久虚拟电路 (permanent virtual circuit, PVC) 和静态交换式虚拟电路 (switched virtual circuit, SVC)。