在 Linux 中配置和验证 IPv6 地址

CompTIABeginner
立即练习

介绍

在本实验中,你将学习在 Linux 系统上配置和验证 IPv6 地址的基础技能。通过使用现代命令行工具,你将获得 IPv6 网络管理中关键任务的实践经验,涵盖从检查到静态配置和连通性测试。本实验侧重于使用 iproute2 套件中的 ip 命令和 ping6 工具,它们是 Ubuntu 22.04 等现代 Linux 发行版中的标准工具。

你将首先使用 ip a 命令来发现网络接口上自动配置的 IPv6 回环地址(loopback addresses)和链路本地地址(link-local addresses)。接下来,你将手动为接口分配一个全局单播地址(global unicast address)。最后,你将使用 ping6 命令来验证与回环地址、链路本地地址和新配置的全局单播地址的网络连通性,以确认你的 IPv6 设置是否正常工作。

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

使用 ip a 命令发现链路本地和回环地址

在本步骤中,你将学习如何发现系统中自动配置的 IPv6 地址。包括 Ubuntu 22.04 在内的现代 Linux 发行版默认启用了 IPv6。我们将使用 ip 命令,这是 Linux 中进行网络配置和检查的现代且推荐的工具。

首先,让我们检查网络接口及其分配的地址。命令 ip aip address 的简写。

  1. 打开一个终端。你的默认路径是 ~/project
  2. 执行 ip a 命令来列出所有网络接口及其地址。
ip a

你将看到类似以下的输出。具体的接口名称(如 eth0)和地址可能会有所不同,但结构将是相同的。

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:00:54:72 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 172.16.50.202/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
       valid_lft 1892159972sec preferred_lft 1892159972sec
    inet6 fe80::216:3eff:fe00:5472/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:89:01:6f:fc brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

现在,让我们分析输出以识别关键的 IPv6 地址:

  • 回环地址 (Loopback Address):查看名为 lo 的接口。这是虚拟回环接口,用于在本地机器上测试网络堆栈。你将看到 IPv6 地址 ::1/128。这是 IPv6 回环地址,相当于 IPv4 中的 127.0.0.1scope host 表明它仅在主机本身内有效。

  • 链路本地地址 (Link-Local Address):查看你的主网络接口(例如 eth0enp0s3)。你将找到一个以 fe80:: 开头的 inet6 地址。这是你的链路本地地址。它会自动分配给每个启用了 IPv6 的接口,并仅用于本地网络段(例如你的本地以太网 LAN)上的通信。scope link 确认此地址仅在本地链路中有效,并且在互联网上不可路由。

你现在已成功识别出系统中两种基本的自动配置 IPv6 地址类型。

使用 ip addr add 添加静态全局单播地址

在本步骤中,你将手动为网络接口配置一个全局单播地址 (Global Unicast Address, GUA)。虽然链路本地地址用于本地网络段的通信,但 GUA 是 IPv6 中公共 IPv4 地址的等价物。它们是全局唯一的,并且可以在互联网上路由。

在本实验中,我们将使用 2001:db8::/32 地址块中的一个地址,该地址块专门保留用于文档和示例。这可以确保我们不会意外使用一个真实存在的、正在使用的互联网地址。

  1. 我们将把静态 GUA 2001:db8:acad::1/64 添加到 eth0 接口。/64 表示前缀长度,这是大多数局域网 (LAN) 的标准。我们需要 sudo,因为修改网络接口需要管理员权限。

    sudo ip -6 addr add 2001:db8:acad::1/64 dev eth0
    • 注意: 此更改是临时的,如果重启系统,该地址将被移除。在 Ubuntu 上进行永久配置,通常需要编辑 /etc/netplan/ 目录下的文件,但这超出了本实验的范围。
  2. 现在,验证新 GUA 是否已成功分配。再次运行 ip a 命令来检查你的网络接口。

    ip a

    现在你应该能在 eth0 接口下看到新添加的地址。注意 scope global,这表明这是一个可路由的地址。

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        ...
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
        link/ether 00:16:3e:00:54:72 brd ff:ff:ff:ff:ff:ff
        altname enp0s5
        altname ens5
        inet 172.16.50.202/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
           valid_lft 1892159959sec preferred_lft 1892159959sec
        inet6 2001:db8:acad::1/64 scope global
           valid_lft forever preferred_lft forever
        inet6 fe80::216:3eff:fe00:5472/64 scope link
           valid_lft forever preferred_lft forever

你已成功为网络接口分配了一个静态 IPv6 GUA。在下一步中,我们将测试与此新地址的连通性。

使用 ping6 测试到回环地址和 GUA 的连通性

在本步骤中,你将使用 ping6 工具来测试 IPv6 连通性。此命令是熟悉的 ping 命令的 IPv6 等价物,对于网络诊断至关重要。我们将验证你的本地 IPv6 堆栈是否正常工作,以及你在上一步配置的全局单播地址 (GUA) 是否有响应。

首先,让我们通过 ping 回环地址来测试本地 IPv6 堆栈。

  1. Ping IPv6 回环地址 ::1。我们将使用 -c 3 选项发送 3 个数据包,而不是无限期 ping。

    ping6 -c 3 ::1

    成功的测试将显示数据包已发送并接收,丢包率为 0%,这证实了你的本地 IPv6 堆栈正在运行。

    PING ::1(::1) 56 data bytes
    64 bytes from ::1: icmp_seq=1 ttl=64 time=0.026 ms
    64 bytes from ::1: icmp_seq=2 ttl=64 time=0.021 ms
    64 bytes from ::1: icmp_seq=3 ttl=64 time=0.035 ms
    
    --- ::1 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2030ms
    rtt min/avg/max/mdev = 0.021/0.027/0.035/0.005 ms

接下来,让我们测试你手动分配给 eth0 接口的 GUA。这可以确认接口已正确配置并在该地址上监听。

  1. Ping 你在上一步添加的 GUA 2001:db8:acad::1

    ping6 -c 3 2001:db8:acad::1

    与回环测试类似,成功的测试结果将显示来自该地址的回复,确认它已正确分配并且在主机上可达。

    PING 2001:db8:acad::1(2001:db8:acad::1) 56 data bytes
    64 bytes from 2001:db8:acad::1: icmp_seq=1 ttl=64 time=0.028 ms
    64 bytes from 2001:db8:acad::1: icmp_seq=2 ttl=64 time=0.037 ms
    64 bytes from 2001:db8:acad::1: icmp_seq=3 ttl=64 time=0.038 ms
    
    --- 2001:db8:acad::1 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2034ms
    rtt min/avg/max/mdev = 0.028/0.034/0.038/0.004 ms

你现在已成功验证了与回环地址和手动配置的全局单播地址的连通性。

使用 ping6 测试链路本地地址连通性

在本步骤中,你将学习如何测试到链路本地地址的连通性。正如你之前发现的,这些地址以 fe80:: 开头,并且只在单个网络段(“链路”)上有效。由于它们不是全局唯一的,你必须向 ping6 命令提供额外的信息来指定应该使用哪个网络接口发送 ping。这被称为“区域索引”或“作用域 ID” (scope ID)。

首先,你需要再次找到 eth0 接口的链路本地地址。

  1. 运行 ip a 命令,并识别 eth0 接口以 fe80:: 开头的 inet6 地址。

    ip a show eth0

    输出将与此类似。你需要复制该地址(例如,fe80::xxxx:xxff:fexx:xxxx)。

    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
        link/ether 00:16:3e:00:54:72 brd ff:ff:ff:ff:ff:ff
        altname enp0s5
        altname ens5
        inet 172.16.50.202/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
           valid_lft 1892159869sec preferred_lft 1892159869sec
        inet6 2001:db8:acad::1/64 scope global
           valid_lft forever preferred_lft forever
        inet6 fe80::216:3eff:fe00:5472/64 scope link
           valid_lft forever preferred_lft forever
  2. 现在,ping 这个链路本地地址。要指定区域索引,你需要在地址后附加 %,然后是接口名称 (eth0)。将 YOUR_LINK_LOCAL_ADDRESS 替换为你刚刚找到的实际地址。

    ping6 -c 3 YOUR_LINK_LOCAL_ADDRESS%eth0

    例如,如果你的地址是 fe80::216:3eff:fe00:5472,命令将是:
    ping6 -c 3 fe80::216:3eff:fe00:5472%eth0

    成功的 ping 确认接口正在响应其链路本地地址。

    PING fe80::216:3eff:fe00:5472%eth0(fe80::216:3eff:fe00:5472%eth0) 56 data bytes
    64 bytes from fe80::216:3eff:fe00:5472%eth0: icmp_seq=1 ttl=64 time=0.031 ms
    64 bytes from fe80::216:3eff:fe00:5472%eth0: icmp_seq=2 ttl=64 time=0.030 ms
    64 bytes from fe80::216:3eff:fe00:5472%eth0: icmp_seq=3 ttl=64 time=0.030 ms
    
    --- fe80::216:3eff:fe00:5472%eth0 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2028ms
    rtt min/avg/max/mdev = 0.030/0.030/0.031/0.000 ms

    如果你忘记了 %eth0 部分,命令将会失败,因为系统不知道要使用哪个接口来访问链路本地目标。这种特殊的语法是处理链路本地 IPv6 地址的关键概念。

总结

在本实验中,你学习了如何使用 ip 命令集在 Linux 系统上执行基本的 IPv6 配置和验证任务。你首先使用 ip a 来检查网络接口,成功识别了 lo 接口上自动分配的 IPv6 回环地址 (::1) 以及主网络接口上的链路本地地址(以 fe80:: 开头)。然后,你使用 ip addr add 命令继续手动为主接口配置静态全局单播地址 (GUA)。

为了验证配置,你使用了 ping6 工具。通过 ping 回环地址,你确认了本地网络堆栈正在运行,并验证了静态 GUA 已正确分配且可达。最后,你学习了测试链路本地地址的特定要求,这涉及到在 ping6 中使用 %interface 语法来显式指定区域索引(出接口),这是由于这些地址的“链路”作用域而必需的步骤。