IPv6 (也叫 IPng “IP下一代”) 是著名的 IP 协议 (也叫 IPv4) 的新版。象其它当前的 *BSD 系统一样,FreeBSD 包括了 KAME IPv6 相关工具。因此您的 FreeBSD 系统事带有所有您在体验 IPv6 时所需要的。这部分主要集中在 IPv6 的配置和运行上。
在二十世纪 90 年代早期,人们开始当心迅速缩小的 IPv4 地址空间。根据互联网的膨胀率,有两点需要考虑:
所有的 IP 地址用光。今天不再那么当心了, 因为有私有地址空间 (10.0.0.0/8、 192.168.0.0/24 等等) 和网络地址转换 (NAT) 可以利用。
路由表条目变得太大。这点今天仍然是焦点。
IPv6 解决这些和其它许多的问题:
128 位地址空间。换句话,理论上有 340,282,366,920,938,463,463,374,607,431,768,211,456 个地址可以使用。这意味着在我们的星球上每平方米大约有 6.67 * 10^27 个 IPv6 地址。
路由器仅在它们的路由表里存放网络地址集, 这就减少路由表的平均空间到 8192 个条目。
IPv6 还有其它许多有用的功能,如:
地址自动配置 (RFC2462)
Anycast (任意播) 地址(“一对多”)
强制的多播地址
IPsec (IP 安全)
简单的头结构
移动的 (Mobile) IP
IPv6 到 IPv4 的转换机制
要更多信息,请查看:
IPv6 概观,在 playground.sun.com
有几种不同类型的 IPv6 地址:Unicast,Anycast 和 Multicast。
Unicast 地址是为人们所熟知的地址。一个被发送到 unicast 地址的包实际上会到达属于这个地址的接口。
Anycast 地址语义上与 unicast 地址没有差别, 只是它们强调一组接口。指定为 anycast 地址的包会到达最近的 (以路由为单位) 接口。Anycast 地址可能只被路由器使用。
Multicast 地址标识一组接口。指定为 multicast 地址的包会到达属于 multicast 组的所有的接口。
Note: IPv4 广播地址 (通常为 xxx.xxx.xxx.255) 由 IPv6 的 multicast 地址来表示。
Table 24-2. 保留的 IPv6 地址
IPv6 地址 | 预定长度 (bits) | 描述 | 备注 |
---|---|---|---|
:: | 128 bits | 未指定 | 类似 IPv4 中的 0.0.0.0 |
::1 | 128 bits | 环回地址 | 类似 IPv4 中的 127.0.0.1 |
::00:xx:xx:xx:xx | 96 bits | 嵌入的 IPv4 | 低 32 bits 是 IPv4 地址。这也称作 “IPv4 兼容 IPv6 地址” |
::ff:xx:xx:xx:xx | 96 bits | IPv4 影射的 IPv6 地址 | 低的 32 bits 是 IPv4 地址。 用于那些不支持 IPv6 的主机。 |
fe80:: - feb:: | 10 bits | 链路环回 | 类似 IPv4 的环回地址。 |
fec0:: - fef:: | 10 bits | 站点环回 | |
ff:: | 8 bits | 多播 | |
001 (base 2) | 3 bits | 全球多播 | 所有的全球多播地址都指定到这个地址池中。前三个二进制位是 “001”。 |
规范形式被描述为:x:x:x:x:x:x:x:x, 每一个“x”就是一个 16 位的 16 进制值。当然, 每个十六进制块以三个“0”开始头的也可以省略。如 FEBC:A574:382B:23C1:AA49:4592:4EFE:9982
通常一个地址会有很长的子串全部为零, 因此每个地址的这种子串常被简写为“::”。 例如:fe80::1 对应的规范形式是 fe80:0000:0000:0000:0000:0000:0000:0001。
第三种形式是以众所周知的用点“.”作为分隔符的十进制 IPv4 形式,写出最后 32 Bit 的部分。例如 2002::10.0.0.1 对应的十进制正规表达方式是 2002:0000:0000:0000:0000:0000:0a00:0001 它也相当于写成 2002::a00:1.
到现在,读者应该能理解下面的内容了:
# 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
fe80::200:21ff:fe03:8e1%rl0 是一个自动配置的链路环回地址。它作为自动配置的一部分由 MAC 生成。
关于 IPv6 地址的结构的更多信息,请参看 RFC3513。
目前,有四种方式可以连接到其它 IPv6 主机和网络:
加入试验性的 6bone(骨干)
从您的上一级提供商那里获得 IPv6 网络。与您的互联网提供商讨论以求指导。
使用 6-to-4 通道 (RFC3068)
如果您是括号连接 (dial-up connection),请使用 net/freenet6 port。
这里我们就讨论如何连接到 6bone,因为它目前看来是最流行的一种方式。
首先看一下 6bone 网站,并找出离您最近的 6bone 连接。给某位值得信赖的人写信过去, 如果运气好,您就会得到关于如何设置您的连接的指导。通常这包括了设置 GRE (gif) 通道。
这里有一个典型的关于设置 gif(4) 通道的例子。
# ifconfig gif0 create # ifconfig gif0 gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280 # ifconfig gif0 tunnel MY_IPv4_ADDR HIS_IPv4_ADDR # ifconfig gif0 inet6 alias MY_ASSIGNED_IPv6_TUNNEL_ENDPOINT_ADDR
把大写字母换成您从上一级 6bone 节点收到的信息。
这样就建立了通道。通过 ping6(8) ff02::1%gif0, 检查通道是否工作。您应该会收到两个 ping 回应。
Note: 或许您会对地址 ff02:1%gif0 感兴趣,它是一个 multicast 地址。%gif0 表明在网络接口 gif0 上的 multicast 地址已经用上了。因为我们 ping 一个 multicast 地址的时候, 通道的另一端也应该会回应。
到现在,设置一个到 6bone 上级连接的路由应该是相当简单了。
# route add -inet6 default -interface gif0 # ping6 -n MY_UPLINK
# traceroute6 www.jp.FreeBSD.org (3ffe:505:2008:1:2a0:24ff:fe57:e561) from 3ffe:8060:100::40:2, 30 hops max, 12 byte packets 1 atnet-meta6 14.147 ms 15.499 ms 24.319 ms 2 6bone-gw2-ATNET-NT.ipv6.tilab.com 103.408 ms 95.072 ms * 3 3ffe:1831:0:ffff::4 138.645 ms 134.437 ms 144.257 ms 4 3ffe:1810:0:6:290:27ff:fe79:7677 282.975 ms 278.666 ms 292.811 ms 5 3ffe:1800:0:ff00::4 400.131 ms 396.324 ms 394.769 ms 6 3ffe:1800:0:3:290:27ff:fe14:cdee 394.712 ms 397.19 ms 394.102 ms
这个输出可能随机器而不同。到现在,您应该可以到达 IPv6 站点www.kame.net, 并看到那只正跳舞的乌龟 -- 如果您有一个支持 IPv6 的浏览器,如 www/mozilla、 Konqueror (x11/kdebase3的一部分) 或 www/epiphany。
对于 IPv6 有两种类型的 DNS 记录:IETF 已经宣布 A6 是过时标准;现行的标准是 AAAA 记录。
使用AAAA记录是很简单的。通过增加下面内容, 给您的主机分配置您刚才接收到的新的 IPv6 地址:
MYHOSTNAME AAAA MYIPv6ADDR
到您的主域 DNS 文件里,就可以完成。要是您自已没有 DNS 域服务,您可以询问您的 DNS 提供商。目前的 bind 版本 (version 8.3 与 9) 和 dns/djbdns(含IPv6补丁) 支持 AAAA 记录。
这些设置将帮助您把一台您 LAN 上的机器配置为一台客户机, 而不是路由器。 要让 rtsol(8) 在启动时自动配置您的网卡, 只需添加:
ipv6_enable="YES"
要自动地静态指定 IP 地址, 例如 2001:471:1f11:251:290:27ff:fee0:2093, 到 fxp0 上, 则写上:
ipv6_ifconfig_fxp0="2001:471:1f11:251:290:27ff:fee0:2093"
要指定 2001:471:1f11:251::1 作为默认路由, 需要在 /etc/rc.conf 中加入:
ipv6_defaultrouter="2001:471:1f11:251::1"
这将帮助您从隧道提供商, 例如 6bone 那里取得必要的资料, 并将这些资料转化为在重启时能够保持住的设置。 要在启动时恢复您的隧道, 需要在 /etc/rc.conf 中增加:
列出要配置的通用隧道接口, 例如 gif0:
gif_interfaces="gif0"
配置该接口使用本地端地址 MY_IPv4_ADDR 和远程端地址 REMOTE_IPv4_ADDR:
gifconfig_gif0="MY_IPv4_ADDR REMOTE_IPv4_ADDR"
应用分配给您用于 IPv6 隧道远端的 IPv6 地址, 需要增加:
ipv6_ifconfig_gif0="MY_ASSIGNED_IPv6_TUNNEL_ENDPOINT_ADDR"
此后十设置 IPv6 的默认路由。 这是 IPv6 隧道的另一端:
ipv6_defaultrouter="MY_IPv6_REMOTE_TUNNEL_ENDPOINT_ADDR"
这节将帮助您配置 rtadvd(8) 来宣示默认的 IPv6 路由。
要启用 rtadvd(8) 您需要在 /etc/rc.conf 中添加:
rtadvd_enable="YES"
指定由哪个网络接口来完成 IPv6 路由请求非常重要。 举例来说, 让 rtadvd(8) 使用 fxp0:
rtadvd_interfaces="fxp0"
接下来我们需要创建配置文件, /etc/rtadvd.conf。 示例如下:
fxp0:\ :addrs#1:addr="2001:471:1f11:246::":prefixlen#64:tc=ether:
将 fxp0 改为您打算使用的接口名。
接下来, 将 2001:471:1f11:246:: 改为分配给您的地址前缀。
如果您拥有专用的 /64 子网, 则不需要修改其他设置。 反之, 您需要把 prefixlen# 改为正确的值。