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 地址块,从而导致其路由表变得太大而无法进行有效路由。
- 地址自动配置(RFC2462)。
- 强制多播地址。
- 内置 IPsec(IP 安全)。
- 简化的标头结构。
- 支持移动 IP。
- IPv6 到 IPv4 的转换机制。
FreeBSD 包括 http://www.kame.net/ 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):
# 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 地址:
表 2. 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。
33.9.2. 配置 IPv6
要将 FreeBSD 系统配置为 IPv6 客户端,请将以下两行添加到 rc.conf 中:
ifconfig_rl0_ipv6="inet6 accept_rtadv"
rtsold_enable="YES"
第一行使指定的接口能够接收路由器通告消息。第二行启用路由器请求守护程序 rtsol(8)。
如果接口需要静态分配的 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 的提供程序或隧道:
- 请与互联网服务提供商联系,了解他们是否提供 IPv6。
- Hurricane Electric 在全球范围内提供终点隧道。
通过软件包或 port 安装 net/freenet6 以进行拨号连接。
本节演示如何从隧道提供程序获取方向,并将其转换为 /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) 来通告 IPv6 默认路由。
要启用 rtadvd(8),请将以下内容添加到 /etc/rc.conf:
rtadvd_enable="YES"
指定要在其上执行 IPv6 路由器通告的接口非常重要。例如,要告诉 rtadvd(8) 使用 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 节中的信息可能对某些管理员有用。