为了在双栈 IPv4/IPv6 站点中尽可能减少相关性,两个 IPv6 节点之间路径中的路由器不必都支持 IPv6。可支持类似网络配置的机制称作隧道。本质上,IPv6 包放在 IPv4 包中,IPv4 包随后通过 IPv4 路由器进行路由,下图说明通过 IPv4 路由器(在该图中用 "R" 指示)的隧道连接机制。
Oracle Solaris : IPv6 实现中包括两种类型的隧道连接机制:
在两个路由器之间配置的隧道,如图 11–5 所示
在端点主机终止的自动隧道
出于其他方面的考虑,目前在 Internet 上,例如,在 IPv4 MBONE(多点传送主干)上,使用已配置的隧道。从操作的角度看,隧道由两个路由器组成,这两个路由器配置为可通过 IPv4 网络建立虚拟的点对点链路。在可以预见的将来,这种隧道很有可能要用在 Internet 的某些部分上。
自动隧道要求使用与 IPv4 兼容的地址。当 IPv6 路由器不可用时,自动隧道可用来连接多个 IPv6 节点。这些隧道可以通过配置自动隧道连接网络接口来从双栈主机或双栈路由器发起。这些隧道总是在双栈主机终止。它们的工作方式如下:通过从与 IPv4 兼容的目标地址中提取目标 IPv4 地址(隧道的端点)来动态确定目标地址。
隧道连接接口具有以下格式:
ip.tun ppa |
在系统启动时,隧道连接模块 (tun) 会由 ifconfig 命令推入 IP 的顶层,从而创建一个虚拟接口。推送操作可通过创建相应的 hostname6.* 文件来实现。
例如,要创建通过 IPv4 网络封装 IPv6 包的隧道(即 IPv6 over IPv4 隧道),可以创建以下文件名:
/etc/hostname6.ip.tun0 |
在对接口进行检测之后,此文件的内容将传递到 ifconfig。此文件内容将变成配置点对点隧道所必需的参数。
下面举例说明 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 命令。可能只有 tsrc 和 tdst 才是必需的,因为所有其他地址都是自动配置的。
在某些情况下,需要为特定的隧道手动配置特定的源和目标链路本地地址。可通过更改配置文件的第一行来包括这些链路本地地址。下面是示例行:
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 |
下面举例说明通过 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 |
下面举例说明通过 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 |
下面举例说明通过 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 支持配置隧道所需的任务(任务列表)。
Oracle Solaris : 中包括 6to4 隧道,这是用来从 IPv4 寻址过渡到 IPv6 寻址的临时首选方法。6to4 隧道允许 IPv6 隔离站点通过一个经由 IPv4 网络(不支持 IPv6)的自动隧道进行通信。要使用 6to4 隧道,必须将 IPv6 网络上的边界路由器配置为 6to4 自动隧道的一个端点。这样,6to4 路由器便可以参与通往另一个 6to4 站点的隧道,如果需要的话,还可以参与通往本地非 6to4 IPv6 站点的隧道。
本节提供有关下列 6to4 主题的参考资料:
6to4 隧道的拓扑
6to4 寻址(包括通告格式)
通过 6to4 隧道的包流的说明
6to4 路由器和 6to4 中继路由器之间隧道的拓扑
配置 6to4 中继路由器支持之前的注意事项
下表介绍用来配置 6to4 隧道的额外任务,以及获得额外有用信息的资源。
任务或详细信息 |
参考 |
---|---|
用来配置 6to4 隧道的任务 | |
与 6to4 相关的 RFC(互联网信息文档和标准) | |
有关 6to4relay 命令(该命令启用对通往 6to4 中继服务器的隧道的支持)的详细信息 | |
6to4 安全问题 |
6to4 隧道提供到任何位置的所有 6to4 站点的 IPv6 连接。 如果 6to4 隧道配置为向中继路由器转发,该隧道也同样提供到所有 IPv6 站点的连接(包括本地 IPv6 Internet)。下图显示了 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 上的接口 hme0 和 hme1。站点 A 任一子网上的所有 IPv6 主机,在收到来自路由器 A 的通告时,都会自动使用 6to4 派生地址重新配置。
站点 B 是另一个隔离的 6to4 站点。为了正确地从站点 A 接收通信,必须在站点 B 上配置边界路由器以支持 6to4。否则,路由器从站点 A 接收的包将因无法识别而被丢弃。
本节介绍从一个 6to4 站点上的主机到远程 6to4 站点上的主机之间的包流。此方案使用图 11–6 中显示的拓扑。而且,它还假定已经配置了 6to4 路由器和 6to4 主机。
6to4 站点 A 的子网 1 上的主机发送传输请求,6to4 站点 B 上的主机作为目标。每个数据包头中均有 6to4 派生的源地址和 6to4 派生的目标地址。
站点 A 的路由器将每个 6to4 包封装到 IPv4 数据包头中。在该过程中,路由器将 IPv4 封装数据包头的目标地址设置为站点 B 的路由器地址。对于每个流经隧道接口的 IPv6 包,其 IPv6 目标地址同时也包含 IPv4 目标地址。因此,路由器将能够确定 IPv4 封装数据包头上设置的 IPv4 目标地址。路由器随后使用标准的 IPv4 路由过程,通过 IPv4 网络转发包。
包通过的任何 IPv4 路由器都使用包的 IPv4 目标地址进行转发。此地址是路由器 B 上某个接口的全局唯一 IPv4 地址,该接口还充当 6to4 伪接口。
来自站点 A 的包到达路由器 B,路由器 B 对 IPv4 数据包头中的 IPv6 包取消封装。
路由器 B 随后使用 IPv6 包中的目标地址将包转发到站点 B 上的接收主机。
6to4 中继路由器充当某些隧道的一个端点,这些隧道的另一个端点是需要与本地非 6to4 IPv6 网络通信的 6to4 路由器。本质上,中继路由器是 6to4 站点和本地 IPv6 站点之间的桥梁。因为此解决方案可能很不安全,所以,在缺省情况下,Oracle Solaris : 不启用对 6to4 中继路由器的支持。但是,如果站点需要这样的隧道,可以使用 6to4relay 命令来启用下面的隧道连接方案。
在图 11–7 中,6to4 站点 A 需要与本地 IPv6 站点 B 上的节点通信。该图显示了从站点 A 经由 IPv4 网络到达 6to4 隧道的通信路径。该隧道将 6to4 路由器 A 和 6to4 中继路由器作为其端点。IPv6 站点 B 所连接到的 IPv6 网络位于 6to4 中继路由器的外部。
本节介绍从 6to4 站点到本地 IPv6 站点之间的包流。此方案使用图 11–7 中显示的拓扑。
6to4 站点 A 上的主机发送一个传输信号,将本地 IPv6 站点 B 上的主机指定为目标地址。每个数据包头都将 6to4 派生地址作为其源地址。目标地址是标准的 IPv6 地址。
站点 A 的 6to4 路由器将每个包封装到 IPv4 数据包头中,该 IPv4 数据包头将 6to4 中继路由器的 IPv4 地址作为其目标地址。6to4 路由器随后使用标准的 IPv4 路由过程,通过 IPv4 网络转发包。包遇到的任何 IPv4 路由器都会将包转发到 6to4 中继路由器。
物理位置距离站点 A 最近的任意点传送 6to4 中继路由器检索以 192.88.99.1 任意点传送组为目标的包。
6to4 中继路由器属于 6to4 中继路由器任意点传送组,它的 IP 地址为 192.88.99.1。此任意点传送地址是 6to4 中继路由器的缺省地址。如果您需要使用特定的 6to4 中继路由器,则可以覆盖缺省设置并指定该路由器的 IPv4 地址。
该中继路由器会对 6to4 包中的 IPv4 数据包头取消封装,并显示本地 IPv6 目标地址。
然后,该中继路由器将当前只包含 IPv6 的包发送到 IPv6 网络上,在该网络上,包最终将由站点 B 上的某个路由器检索到。检索到包的路由器随后会将包转发到目标 IPv6 节点。