在 Linux 中配置 IPv4 到 IPv6 的 6to4 隧道

CompTIABeginner
立即练习

介绍

在本实验中,你将学习如何在 Linux 环境中配置 IPv4 到 IPv6 的 6to4 隧道。这个实践练习将指导你完成在现有 IPv4 网络上启用 IPv6 连接的过程,这是网络管理员的关键过渡机制。你将使用标准的 Linux 命令行工具从头开始构建和验证一个功能性的隧道。

遵循分步过程,你将首先准备一个概念性的公共 IPv4 地址,以模拟真实场景。然后,你将创建一个 SIT (Simple Internet Transition) 隧道接口,为其分配一个 6to4 格式的 IPv6 地址,并通过公共 6to4 中继添加一个默认 IPv6 路由。为了完成实验,你将使用 ping6 命令测试通过新配置隧道实现的端到端 IPv6 连接。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 97%。获得了学习者 100% 的好评率。

使用概念性公共 IPv4 地址准备隧道

在本步骤中,你将了解 6to4 隧道的基本要求:一个公共 IPv4 地址。我们将探讨如何识别你系统的 IP 地址,以及为什么在本实验中要使用一个特殊的、概念性的地址。

6to4 隧道是一种过渡机制,它将 IPv6 数据包封装在 IPv4 数据包中,使其能够穿越 IPv4 互联网。要在真实场景中实现这一点,你的系统(隧道端点)必须拥有一个公共 IPv4 地址,以便互联网上的其他设备能够将流量回传给它。在典型的实验或家庭环境中,你的计算机通常位于使用网络地址转换 (NAT) 的路由器后面,并拥有一个私有的 IPv4 地址,该地址无法从公共互联网访问。

首先,让我们检查在此实验环境中分配给你网络接口的实际 IPv4 地址。你可以使用 ip a 命令结合 grep 来过滤 IPv4 地址。

在你的终端中执行以下命令:

ip a | grep inet

你将看到类似以下的输出,列出了你系统上的 IPv4 和 IPv6 地址。请注意,这些 IPv4 地址是私有的,而不是公共的。

    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    inet 172.16.50.33/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
    inet6 fe80::216:3eff:fe01:236f/64 scope link
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0

如你所见,列出的地址是私有的(如 172.16.50.33)或回环地址(127.0.0.1)。它们不能用作 6to4 隧道的公共端点。为了模拟真实场景,我们将使用一个概念性公共 IPv4 地址。在本实验中,我们将使用 192.0.2.1。此地址属于一个专门为文档和示例保留的地址块 (RFC 5737),确保它不会与任何真实的公共 IP 地址冲突。所有后续步骤都将使用此占位符地址来构建我们的隧道配置。

使用 ip tunnel 命令创建 SIT 隧道接口

在本步骤中,你将创建虚拟隧道接口,它将作为我们 6to4 隧道的基石。我们将使用 ip 命令,这是 Linux 中一个强大的网络配置工具。

ip tunnel 命令用于创建、管理和删除隧道接口。对于 6to4,我们需要一种特定的隧道模式,称为 sit,它是 "Simple Internet Transition" 的缩写。这种模式将 IPv6 数据包直接封装在 IPv4 数据包中,这是 6to4 的核心机制。

现在,让我们创建一个名为 tun6to4 的隧道接口。我们将使用在上一步中确定的概念性公共 IPv4 地址 192.0.2.1 来配置它。

在你的终端中执行以下命令。你需要使用 sudo,因为创建网络接口是一项需要特权的操作。

sudo ip tunnel add tun6to4 mode sit local 192.0.2.1 remote any

让我们分解一下这个命令:

  • sudo ip tunnel add tun6to4: 这部分指示系统添加一个名为 tun6to4 的新隧道接口。
  • mode sit: 这指定了封装模式。sit 是 6to4 隧道正确的模式。
  • local 192.0.2.1: 这设置了隧道数据包的源 IPv4 地址。它是我们隧道的“本地”端点,我们用概念性公共 IP 来模拟它。
  • remote any: 这是 6to4 机制的一个关键部分。它告诉系统隧道可以连接到任何远程端点。实际上,这意味着它会将流量发送到一个众所周知的 6to4 中继路由器的“任播”地址,然后该路由器会将流量转发到 IPv6 互联网。

运行命令后,你可以验证隧道接口是否已创建。使用 ip tunnel show 命令:

ip tunnel show

输出应确认你新创建的 tun6to4 接口及其配置。你可能还会看到一个默认的 sit0 接口,在本实验中可以忽略它。

sit0: ipv6/ip remote any local any ttl 64 nopmtudisc 6rd-prefix 2002::/16
tun6to4: ipv6/ip remote any local 192.0.2.1 ttl inherit 6rd-prefix 2002::/16

你也可以通过再次运行 ip a 来查看新接口,但此时它还没有分配任何 IP 地址。我们将在下一步处理这个问题。

为隧道接口分配 6to4 格式的 IPv6 地址

在本步骤中,你将通过为其分配一个特殊的 6to4 格式的 IPv6 地址来配置你刚刚创建的 tun6to4 接口。这个地址并非随意指定;它直接源自隧道端点的公共 IPv4 地址。

6to4 寻址方案被设计为自动化的。它使用一个指定的 IPv6 前缀 2002::/16。此后跟的 32 位由公共 IPv4 地址填充,并转换为十六进制格式。这为拥有至少一个公共 IPv4 地址的任何组织创建了一个唯一的 /48 IPv6 前缀。

让我们计算一下我们概念性 IPv4 地址 192.0.2.1 的十六进制表示:

  • 十进制的 192 在十六进制中是 c0
  • 十进制的 0 在十六进制中是 00
  • 十进制的 2 在十六进制中是 02
  • 十进制的 1 在十六进制中是 01

将它们组合起来,192.0.2.1 的十六进制表示是 c000:0201。因此,我们唯一的 6to4 前缀是 2002:c000:0201::/48

现在,我们将从这个前缀中为我们的 tun6to4 接口分配一个特定的 IPv6 地址。我们将使用第一个子网中的第一个地址 2002:c000:0201::1/64。执行以下命令来分配地址:

sudo ip -6 addr add 2002:c000:0201::1/64 dev tun6to4

创建接口并分配地址后,接口默认仍处于“DOWN”状态。你需要将其设置为“UP”才能使其正常工作。为此,请使用 ip link set 命令:

sudo ip link set tun6to4 up

最后,让我们验证接口是否已启动并具有正确的 IPv6 地址。使用 ip a 命令并查找 tun6to4 接口:

ip a

你应该会看到一个包含 tun6to4 接口的输出,该接口现在已激活并配置了 IPv6 地址。请注意,接口编号(例如 5:)可能会有所不同,并且你可能会看到其他接口,如 docker0sit0

5: tun6to4@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000
    link/sit 192.0.2.1 brd 0.0.0.0
    inet6 ::192.0.2.1/96 scope global
       valid_lft forever preferred_lft forever
    inet6 2002:c000:201::1/64 scope global
       valid_lft forever preferred_lft forever

请注意,除了你配置的 2002:... 地址外,系统还自动添加了一个 IPv4 兼容的 IPv6 地址(::192.0.2.1/96)。这是预期的行为。

通过 6to4 中继地址添加默认 IPv6 路由

在本步骤中,你将配置出站连接的最后一块拼图:默认路由。仅仅在 tun6to4 接口上有一个 IP 地址是不够的;你的系统需要知道将目标为全球互联网的 IPv6 流量发送到哪里。我们将将其指向一个特殊的 6to4 中继路由器。

6to4 依赖于公共中继路由器,这些路由器将 6to4 世界连接到原生 IPv6 互联网。这些路由器在一个特定的、众所周知的任播 IPv4 地址 192.88.99.1 上监听封装的流量。当我们的系统将 IPv6 数据包发送到外部目的地时,它会将其封装在 IPv4 数据包中并发送到此中继地址。然后,中继路由器会解开数据包并将其转发到 IPv6 网络。

为了进行设置,我们将使用 ip -6 route add 命令添加一个默认 IPv6 路由。在你的终端中执行以下命令:

sudo ip -6 route add default via ::192.88.99.1 dev tun6to4

让我们分析一下这个命令:

  • default: 这指定了该路由是所有不匹配路由表中更具体路由的 IPv6 流量的“默认网关”。
  • via ::192.88.99.1: 这设置了下一跳网关。::192.88.99.1 语法是在 IPv6 上下文中表示 IPv4 地址的一种特殊方式,它告诉系统将流量发送到 IPv4 地址 192.88.99.1
  • dev tun6to4: 这明确告诉系统为此路由使用我们的 tun6to4 接口。

现在,你可以验证 IPv6 路由表是否已正确更新。运行以下命令:

ip -6 route show

输出现在应该包含一个指向通过你的隧道接口的 6to4 中继的默认路由。确切的输出可能略有不同,但关键是 default 行。

::1 dev lo proto kernel metric 256 pref medium
::/96 dev tun6to4 proto kernel metric 256 pref medium
2002:c000:201::/64 dev tun6to4 proto kernel metric 256 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
default via ::192.88.99.1 dev tun6to4 metric 1024 pref medium

有了这个路由,你的系统现在已完全配置为通过模拟的 6to4 隧道发送 IPv6 流量。

使用 ping6 测试隧道 IPv6 连通性

在本步骤中,你将尝试通过向公共目的地发送 IPv6 流量来测试你新配置的 6to4 隧道。我们将使用 ping6 命令,它是熟悉的 ping 工具的 IPv6 等效命令。

目标是查看我们的系统是否能够发送 IPv6 数据包,将其封装到 IPv4 数据包中,发送到 6to4 中继,然后转发到其最终目的地。我们将使用 ping6-I 标志来指定流量必须源自我们的 tun6to4 接口。

让我们尝试 ping 一个众所周知的支持 IPv6 的主机,例如 ipv6.google.com-c 4 标志会将命令限制为只发送 4 个数据包。

在你的终端中执行以下命令:

ping6 -c 4 -I tun6to4 ipv6.google.com

预期结果和解释

你将看到命令失败,并显示目的地不可达的输出。这是预期结果,并且 lab 的这一部分仅用于演示目的。

PING ipv6.google.com(sfo03s32-in-x0e.1e100.net (2607:f8b0:4005:814::200e)) from 2002:c000:201::1 tun6to4: 56 data bytes
From iZrj9hhbt3mi4boxowaqhxZ (2002:c000:201::1) icmp_seq=1 Destination unreachable: Address unreachable
From iZrj9hhbt3mi4boxowaqhxZ (2002:c000:201::1) icmp_seq=2 Destination unreachable: Address unreachable
From iZrj9hhbt3mi4boxowaqhxZ (2002:c000:201::1) icmp_seq=3 Destination unreachable: Address unreachable
From iZrj9hhbt3mi4boxowaqhxZ (2002:c000:201::1) icmp_seq=4 Destination unreachable: Address unreachable

--- ipv6.google.com ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3253ms

此失败并不意味着你配置有任何错误。 你已成功设置了 6to4 隧道的客户端。在此 lab 环境中,由于两个关键原因,此失败是符合预期的:

  1. Lab 环境: LabEx 虚拟机没有真实的公共 IPv4 地址。我们在配置中使用了概念性地址(192.0.2.1)。6to4 中继无法将回复发送回此不可路由地址。
  2. 过时的基础设施: 公共 6to4 中继基础设施(位于任播地址 192.88.99.1)在很大程度上已被弃用,并且在现代互联网上不再维护。网络运营商已转向更健壮和安全的 IPv6 过渡机制,如原生 IPv6、6rd 和 DS-Lite。

此 lab 的主要目的是教你一个具有历史意义的 IPv4 到 IPv6 隧道机制的概念和配置语法,这是 CompTIA Network+ 等网络认证中涵盖的主题。

总结

在此实验中,你学习了如何在 Linux 中配置 IPv4 到 IPv6 的 6to4 隧道。你首先理解了 6to4 隧道的核心要求:一个公共 IPv4 地址。在识别出 lab 环境中的私有 IP 地址后,你采用了一个概念性的公共 IPv4 地址(192.0.2.1)来模拟真实场景。然后,你使用 ip tunnel 命令创建了一个 SIT (Simple Internet Transition) 隧道接口,该接口作为将 IPv6 数据包封装到 IPv4 中的端点。

在建立了隧道接口后,你构建并分配了一个 6to4 格式的 IPv6 地址,该地址是根据概念性公共 IPv4 地址以编程方式派生的。为了将 IPv6 流量通过隧道进行路由,你添加了一个指向任播 6to4 中继地址的默认 IPv6 路由。最后,你使用 ping6 命令测试了配置。测试如预期般失败,这证实了虽然你的本地设置是正确的,但公共 6to4 中继基础设施已不再广泛可用,这表明了该技术现在被视为历史性的一个关键原因。