31.9. IPv6

Originally Written by Aaron Kaplan.
Restructured and Added by Tom Rhodes.
Extended by Brad Davis.

IPv6 (也被称作 IPng 下一代 IP) 是众所周知的 IP 协议 (也叫 IPv4) 的新版本。IPv6 有这些新功能:

和其他现代的 *BSD 系统一样, FreeBSD 包含了 http://www.kame.net/ 的 IPv6 参考实现。 因此, 您的 FreeBSD 系统包含了尝试 IPv6 所需要的所有工具。 这一节主要集中讨论如何配置和使用 IPv6。

31.9.1. IPv6 背景知识

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

单播(Unicast)地址

Unicast 地址是为人们所熟知的地址。一个被发送到 unicast 地址的包实际上会到达属于这个地址的接口。

任播(Anycast)地址

Anycast 地址语义上与 unicast 地址没有差别, 只是它们强调一组接口。指定为 anycast 地址的包会到达最近的 (以路由为单位) 接口。Anycast 地址可能只被路由器使用。

多播(Multicast)地址

Multicast 地址标识一组接口。指定为 multicast 地址的包会到达属于 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:0000:0000:0000:0000:0001

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

使用 ifconfig(8) 查看 FreeBSD 的 IPv6 地址:

# 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 地址为保留地址,详情参见 表 31.3 “已保留的IPv6位址”

表 31.3. 已保留的IPv6位址
保留的 IPv6 地址前缀长度(位)描述说明
::128 bits未指定类似 IPv4 中的 0.0.0.0
::1128 bits回环地址类似 IPv4 中的 127.0.0.1
::00:xx:xx:xx:xx96 bits嵌入式IPv4低 32 bits 是 IPv4 地址。这也称作 IPv4 兼容 IPv6 地址
::ff:xx:xx:xx:xx96 bitsIPv4 影射的 IPv6 地址低的 32 bits 是 IPv4 地址。 用于那些不支持 IPv6 的主机。
fe80::/1010 bitslink-local(链路本地地址)相当于IPv4中的 169.254.0.0/16 。
fc00::/77 bits唯一本地地址唯一的本地地址是用于本地通信,只在一组合作站点内进行路由。
ff00::8 bitsmulticast 
2000::-3fff:: 3 bits全球单播所有的全球单播地址都指定到这个地址池中。前三个二进制位是 001

关于 IPv6 地址的结构的更多信息,请参看 RFC3513

31.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"

31.9.3. 连接到 Provider

为了连接到其他IPv6网络,必须有一个支持IPv6的提供商或隧道:

  • 联系互联网服务提供商,看看他们是否提供IPv6

  • Hurricane Electric提供了遍布全球的具有端点的隧道。

注意:

从 package 或 port 安装 net/freenet6,用于拨号连接。

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

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

cloned_interfaces="gif0"

接下来,使用本地端和远程端的IPv4地址配置该接口。将MY_IPv4_ADDRREMOTE_IPv4_ADDR替换为实际的 IPv4 地址:

create_args_gif0="tunnel MY_IPv4_ADDR REMOTE_IPv4_ADDR"

要应用已分配的 IPv6地址作为 IPv6隧道端点使用,请添加此行,将 MY_ASSIGNED_IPv6_TUNNEL_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"

31.9.4. Router Advertisement与Host Auto Configuration

本节演示如何设置rtadvd(8),以通告IPv6默认路由。

将以下行添加到/etc/rc.conf,启用rtadvd(8)

rtadvd_enable="YES"

要在开机时启动的Jail应加入到rc.conf(5)档案中:

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#改为正确的值。

31.9.5. IPv6IPv6位址对应表

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

在大多数情况下,可能不需要此选项,仅用于兼容性。此选项将允许IPv6-only 应用程序在双栈环境中与IPv4一起工作。这对于可能不支持IPv6-only 环境的第三方应用程序来说是最有用的。要启用此功能,请在 /etc/rc.conf中添加以下内容:

ipv6_ipv4mapping="YES"

RFC3493节3.6和3.7以及RFC4038节4.2中的信息可能对一些管理员有用。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.