系统管理指南:IP 服务

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 添加或修改服务时,请记住以下几点: