33.9.IPv6

IPv6 是众所周知的 IP 协议(也称为 IPv4)的新版本。与 IPv4 相比,IPv6 具有多项优势以及许多新功能:

  • 其 128 位地址空间包含了 340,282,366,920,938,463,463,374,607,431,768,211,456 个地址。这解决了 IPv4 地址短缺和 IPv4 地址最终耗尽的问题。
  • 路由器仅在其路由表中存储网络聚合地址,从而将路由表的平均空间减少到 8192 个条目。这解决了与 IPv4 相关的可伸缩性问题,即要求在互联网路由器之间交换每个分配的 IPv4 地址块,从而导致其路由表变得太大而无法进行有效路由。
  • 地址自动配置(RFC2462open in new window)。
  • 强制多播地址。
  • 内置 IPsec(IP 安全)。
  • 简化的标头结构。
  • 支持移动 IP。
  • IPv6 到 IPv4 的转换机制。

FreeBSD 包括 http://www.kame.net/open in new window IPv6 参考实现,并附带了使用 IPv6 所需的一切。本节重点介绍如何配置和运行 IPv6。

33.9.1. IPv6 地址的背景

有三种不同类型的 IPv6 地址:

  • Unicast

    发送到单播地址的数据包到达属于该地址的接口。

  • Anycast

    这些地址在语法上与单播地址无法区分,但它们寻址一组接口。发往任播地址的数据包将到达最近的路由器接口。任播地址仅由路由器使用。

  • Multicast

    这些地址识别一组接口。一个以多播地址为目的地的数据包将到达属于该多播组的所有接口。IPv4 的广播地址,通常是xxx.xxx.xxx.255,在 IPv6 中由多播地址表示。

当读取 IPv6 地址时,典型形式表示为 x:x:x:x:x:x:x:x,其中每个 x 代表一个 16 位十六进制值。例如 FEBC:A574:382B:23C1:AA49:4592:4EFE:9982

通常,一个地址会有很长的全零子串。::(双冒号)可以用来替换每个地址的一个子串。另外,每个十六进制值最多可以省略三个前导 0。例如,fe80::1 应于规范的形式 fe80:0000:0000:0000:0000:0001

第三种形式是使用众所周知的 IPv4 符号来写最后 32 位。例如,2002::10.0.0.1 对应于十六进制的典型代表 2002:0000:0000:0000:0000:0001,这又相当于 2002::a00:1

要查看 FreeBSD 系统的 IPv6 地址,请使用 ifconfig(8)open in new window

# ifconfig
rl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
         inet 10.0.0.10 netmask 0xffffff00 broadcast 10.0.0.255
         inet6 fe80::200:21ff:fe03:8e1%rl0 prefixlen 64 scopeid 0x1
         ether 00:00:21:03:08:e1
         media: Ethernet autoselect (100baseTX )
         status: active

在此示例中,rl0 接口使用 fe80::200:21ff:fe03:8e1%rl0,这是从 MAC 地址自动生成的自动配置的链接本地地址。

某些 IPv6 地址是保留的。这些保留地址的摘要见保留 IPv6 地址open in new window

表 2. IPv6 保留地址

IPv6 地址前缀长度(位)说明注意
::128 位未指定相当于在 IPv4 中的 0.0.0.0
::1128 位环回地址相当于在 IPv4 中的 127.0.0.1
::00:xx:xx:xx:xx96 位嵌入式 IPv4低 32 位是兼容 IPv4 地址。
::ff:xx:xx:xx:xx96 位IPv4 映射的 IPv6 地址低 32 位是不支持 IPv6 的主机的 IPv4 地址。
fe80::/1010 位链接本地相当于 IPv4 中的 169.254.0.0/16
fc00::/77 位独特的本地唯一的本地地址用于本地通信,并且仅在一组协作站点中可路由。
ff00::8 位组播
2000::-3fff::3 位全局单播所有全局单播地址都是从此池中分配的。前 3 位是 001

有关 IPv6 地址结构的详细信息,请参阅 RFC3513open in new window

33.9.2. 配置 IPv6

要将 FreeBSD 系统配置为 IPv6 客户端,请将以下两行添加到 rc.conf 中:

ifconfig_rl0_ipv6="inet6 accept_rtadv"
rtsold_enable="YES"

第一行使指定的接口能够接收路由器通告消息。第二行启用路由器请求守护程序 rtsol(8)open in new window

如果接口需要静态分配的 IPv6 地址,请添加一个条目以指定静态地址和关联的前缀长度:

ifconfig_rl0_ipv6="inet6 2001:db8:4672:6565:2026:5043:2d42:5344 prefixlen 64"

要分配默认路由器,请指定其地址:

ipv6_defaultrouter="2001:db8:4672:6565::1"

33.9.3. 进行链接

为了连接到其他 IPv6 网络,必须具有支持 IPv6 的提供程序或隧道:


通过软件包或 port 安装 net/freenet6open in new window 以进行拨号连接。

本节演示如何从隧道提供程序获取方向,并将其转换为 /etc/rc.conf 设置,这些设置将在重新启动后持续存在。

第一个 /etc/rc.conf 条目创建通用隧道接口 gif0

cloned_interfaces="gif0"

接下来,用本地和远程端点的 IPv4 地址配置该接口。用实际的 IPv4 地址替换 MY_IPv4_ADDR* 和 *REMOTE_IPv4_ADDR`

create_args_gif0="tunnel MY_IPv4_ADDR REMOTE_IPv4_ADDR"

要应用已经分配的 IPv6 地址作为 IPv6 隧道端点,请添加这一行,用分配的地址替换 MY_ASSIGNED_IPv6_TUNNEL_ENDPOINT_ADDR

ifconfig_gif0_ipv6="inet6 MY_ASSIGNED_IPv6_TUNNEL_ENDPOINT_ADDR"

然后,为 IPv6 隧道的另一端设置默认路由。将 MY_IPv6_REMOTE_TUNNEL_ENDPOINT_ADDR 替换为提供商分配的默认网关地址。

ipv6_defaultrouter="MY_IPv6_REMOTE_TUNNEL_ENDPOINT_ADDR"

如果 FreeBSD 系统将在网络的其余部分和世界之间路由 IPv6 数据包,请使用以下行启用网关:

ipv6_gateway_enable="YES"

33.9.4. 路由器通告和主机自动配置

本节演示如何设置 rtadvd(8)open in new window 来通告 IPv6 默认路由。

要启用 rtadvd(8)open in new window,请将以下内容添加到 /etc/rc.conf

rtadvd_enable="YES"

指定要在其上执行 IPv6 路由器通告的接口非常重要。例如,要告诉 rtadvd(8)open in new window 使用 rl0

rtadvd_interfaces="rl0"

接下来,创建配置文件 /etc/rtadvd.conf,如以下示例所示:

rl0:\
	:addrs#1:addr="2001:db8:1f11:246::":prefixlen#64:tc=ether:

用要使用的接口替换 rl0,用分配的前缀替换 2001:db8:1f11:246::

对于一个专用的 /64 子网,其他都不需要改变。否则,将 prefixlen# 改成正确的值。

33.9.5. IPv6 和 IPv4 地址映射

在服务器上启用 IPv6 时,可能需要启用 IPv4 映射的 IPv6 地址通信。此兼容性选项允许将 IPv4 地址表示为 IPv6 地址。允许 IPv6 应用程序与 IPv4 通信,反之亦然,这可能是存在安全问题。

在大多数情况下,此选项可能不是必需的,并且仅用于兼容性。此选项将允许仅支持 IPv6 的应用程序在双堆栈环境中使用 IPv4。这对于可能不支持仅 IPv6 环境的第三方应用程序最有用。要启用此功能,请将以下内容添加到 /etc/rc.conf

ipv6_ipv4mapping="YES"

查看 RFC 3493 第 3.6 节和第 3.7 节以及 RFC 4038 第 4.2 节中的信息可能对某些管理员有用。

Loading...