第21章 其他文件系统
附录 D. OpenPGP 密钥
32.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 相关的可伸缩性问题,即要求在 Internet 路由器之间交换每个分配的 IPv4 地址块,从而导致其路由表变得太大而无法进行有效路由。
  • 地址自动配置 (RFC2462)。
  • 强制多播地址。
  • 内置 IPsec(IP 安全)。
  • 简化的标头结构。
  • 支持移动 IP。
  • IPv6 到 IPv4 的转换机制。
FreeBSD 包括 http://www.kame.net/ IPv6 参考实现,并附带了使用 IPv6 所需的一切。本节重点介绍如何配置和运行 IPv6。

32.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)
1
# ifconfig
Copied!
1
rl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
2
inet 10.0.0.10 netmask 0xffffff00 broadcast 10.0.0.255
3
inet6 fe80::200:21ff:fe03:8e1%rl0 prefixlen 64 scopeid 0x1
4
ether 00:00:21:03:08:e1
5
media: Ethernet autoselect (100baseTX )
6
status: active
Copied!
在此示例中,rl0 接口使用 fe80::200:21ff:fe03:8e1%rl0,这是从 MAC 地址自动生成的自动配置的链接本地地址。
某些 IPv6 地址是保留的。这些保留地址的摘要见 保留 IPv6 地址
IPv6 地址
前缀长度(位)
描述
笔记
::
128 位
未指定
相当于在 IPv4 中的 0.0.0.0
::1
128 位
环回地址
相当于在 IPv4 中的 127.0.0.1
::00:xx:xx:xx:xx
96 位
嵌入式 IPv4
低 32 位是兼容 IPv4 地址。
::ff:xx:xx:xx:xx
96 位
IPv4 映射的 IPv6 地址
低 32 位是不支持 IPv6 的主机的 IPv4 地址。
fe80::/10
10 位
链接本地
相当于 IPv4 中的 169.254.0.0/16。
fc00::/7
7 位
独特的本地
唯一的本地地址用于本地通信,并且仅在一组协作站点中可路由。
ff00::
8 位
组 播
2000::-3fff::
3 位
全局单播
所有全局单播地址都是从此池中分配的。前 3 位是 001
有关 IPv6 地址结构的详细信息,请参阅 RFC3513

32.9.2. 配置 IPv6

要将 FreeBSD 系统配置为 IPv6 客户端,请将以下两行添加到 rc.conf 中:
1
ifconfig_rl0_ipv6="inet6 accept_rtadv"
2
rtsold_enable="YES"
Copied!
第一行使指定的接口能够接收路由器通告消息。第二行启用路由器请求守护程序 rtsol(8)
如果接口需要静态分配的 IPv6 地址,请添加一个条目以指定静态地址和关联的前缀长度:
1
ifconfig_rl0_ipv6="inet6 2001:db8:4672:6565:2026:5043:2d42:5344 prefixlen 64"
Copied!
要分配默认路由器,请指定其地址:
1
ipv6_defaultrouter="2001:db8:4672:6565::1"
Copied!

32.9.3. 连接到提供程序

为了连接到其他 IPv6 网络,必须具有支持 IPv6 的提供程序或隧道:
  • 请与互联网服务提供商联系,了解他们是否提供 IPv6。
  • Hurricane Electric 在全球范围内提供终点隧道。
注意
安装 net/freenet6 软件包或 port 以进行拨号连接。
本节演示如何从隧道提供程序获取方向,并将其转换为 /etc/rc.conf 设置,这些设置将在重新启动后持续存在。
第一个 /etc/rc.conf 条目创建通用隧道接口 gif0
1
cloned_interfaces="gif0"
Copied!
接下来,用本地和远程端点的 IPv4 地址配置该接口。用实际的 IPv4 地址替换 MY_IPv4_ADDRREMOTE_IPv4_ADDR
1
create_args_gif0="tunnel MY_IPv4_ADDR REMOTE_IPv4_ADDR"
Copied!
要应用已经分配的 IPv6 地址作为 IPv6 隧道端点,请添加这一行,用分配的地址替换 MY_ASSIGNED_IPv6_TUNNEL_ENDPOINT_ADDR
1
ifconfig_gif0_ipv6="inet6 MY_ASSIGNED_IPv6_TUNNEL_ENDPOINT_ADDR"
Copied!
然后,为 IPv6 隧道的另一端设置默认路由。将 MY_IPv6_REMOTE_TUNNEL_ENDPOINT_ADDR 替换为提供商分配的默认网关地址。
1
ipv6_defaultrouter="MY_IPv6_REMOTE_TUNNEL_ENDPOINT_ADDR"
Copied!
如果 FreeBSD 系统将在网络的其余部分和世界之间路由 IPv6 数据包,请使用以下行启用网关:
1
ipv6_gateway_enable="YES"
Copied!

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

本节演示如何设置 rtadvd(8) 来通告 IPv6 默认路由。
要启用 rtadvd(8),请将以下内容添加到 /etc/rc.conf
1
rtadvd_enable="YES"
Copied!
指定要在其上执行 IPv6 路由器通告的接口非常重要。例如,要告诉 rtadvd(8) 使用 rl0
1
rtadvd_interfaces="rl0"
Copied!
接下来,创建配置文件 /etc/rtadvd.conf,如以下示例所示:
1
rl0:\
2
:addrs#1:addr="2001:db8:1f11:246::":prefixlen#64:tc=ether:
Copied!
用要使用的接口替换 rl0,用分配的前缀替换 2001:db8:1f11:246::
对于一个专用的 /64 子网,其他都不需要改变。否则,将 prefixlen# 改成正确的值。

32.9.5. IPv6 和 IPv6 地址映射

在服务器上启用 IPv6 时,可能需要启用 IPv4 映射的 IPv6 地址通信。此兼容性选项允许将 IPv4 地址表示为 IPv6 地址。允许 IPv6 应用程序与 IPv4 通信,反之亦然,这可能是一个安全问题。
在大多数情况下,此选项可能不是必需的,并且仅用于兼容性。此选项将允许仅支持 IPv6 的应用程序在双堆栈环境中使用 IPv4。这对于可能不支持仅 IPv6 环境的第三方应用程序最有用。要启用此功能,请将以下内容添加到 /etc/rc.conf
1
ipv6_ipv4mapping="YES"
Copied!
查看 RFC 3493 第 3.6 节和第 3.7 节以及 RFC 4038 第 4.2 节中的信息可能对某些管理员有用。