Next Previous Contents

6. 用 Cisco 和/或 6bone 进行 IPv6 tunneling (IPv6 tunneling with Cisco and/or 6bone)

By Marco Davids <marco@sara.nl>

维护者需知﹕

据我所知﹐目前这个 IPv6-IPv4 tunneling 并非由 GRE tunneling 定义。虽然﹐您可以用 GRE tunnel 设备进行 IPv6 over IPv4 的 tunnel (GRE 可在 IPv4 上作任何的 tunnel)﹐但在这里使用的设备("sit")﹐仅对 IPv6 over IPv4 进行 tunnel 而已﹐因此或和其它技术有别。

6.1 IPv6 Tunneling

这是 Linux 在 tunneling 技术上的另一应用。这在已经使用 IPv6 的界面上很普遍﹐当然啰﹐您认为很前卫也未尝不可。后面的 '实作' 范例绝对不是唯一的 IPv6 tunneling 方法。不过﹐它却是在 Linux 与 Cisco IPv6 兼容路由器之间进行 tunnel 的最常用武器﹐而实验证明许多人对此也趋之若骛。我不怕以一赔十和您赌一赌 ;-)

关于 IPv6 的小秘诀

比较起 IPv4 位址﹐IPv6 位址显如庞然大物﹕128 bits 对比 32 bits。这同时也只提供我们需要的事物﹕就是许多﹑许多的 IP 位址﹕340,282,266,920,938,463,463,374,607,431,768,211,465 是一个十分精确的例子。除此以外﹐ IPv6(或 IPng﹐也就是 IP Next Generation)﹐被认为可以在 Internet backbone 路由器上维护更小的路由表﹑更简单的设备设定﹑更好的 IP 层级安全﹑以及更佳的 QoS 支持。

例如﹕2002:836b:9820:0000:0000:0000:836b:9886

每次写这么长的 IPv6 位址﹐事实上蛮累人的。因此﹐不妨参考如下规则来简化一下﹕

参考此规则﹐一个如 2002:836b:9820:0000:0000:0000:836b:9886 的位址﹐也可以写成 2002:836b:9820::836b:9886﹐显然简洁得多。

用于 tunnels 上面

IPv6 一致被认为能够取代 IPv4 的地位。由于它相对而言还是一种崭新技术﹐目前尚难找到纯 IPv6 的原始网路。为了让我们更迅速的过渡﹐于是有了 6bone 的出现。

原始的 IPv6 网路联结﹐是透过将 IPv6 协定封装在 IPv4 封包中﹐然后利用现有的 IPv4 架构从一个 IPv6 站点送到其它站点去。

恰好﹐这正是 tunnels 切入之处。

为了使用 IPv6﹐我们必须要先有一个支持它的核心。目前已经有非常多的优秀文件告诉我们如何做到这点﹐不过﹐似乎全都不外乎这几路板斧﹕

如果您全都准备妥当﹐那您就可以继续上路﹐编译出一个 IPv6 兼容的核心﹕ 提示﹕不要使用?模块'的方式﹐这通常工作起来不很完善。

总而言之﹐将 IPv6 以 '内建' 方式编进核心就是了。然后您可以如常般将设定保存好﹐再继续核心的编译。

提示﹕在真正编译之前﹐不妨修改一下 Makefie﹕ EXTRAVERSION = -x ; --> ; EXTRAVERSION = -x-IPv6

关于核心的编译和安装﹐应该有很多优秀文件了﹐本文件就不再赘言。如果您在这里碰到麻烦﹐请按照您自己的规格参考 Linux 核心编译的相关文件。

/usr/src/linux/README 这个档应该是个不错的起点。等您过了这一关﹐再用新的核心重新启动系统﹐然后您可以输入 '/sbin/ifconfig -a' 命令﹐或许会发现一个全新的'sit0-device'。 SIT 就是 Simple Internet Transition 的意思。果真如此的话﹐不妨开香槟自我庆祝一番﹕您已经距离下一代的 IP 迈出了很大一步了 ;-)

接下来﹐您或许想要将机器连接起来﹐或是甚至将整个网路连接到其它 IPv6 兼容网路去。而 "6bone" 正是应此运而生的。

假设您获得一个这样的的 IPv6 网路﹕3ffe:604:6:8::/64 ﹐而您想要连接 6bone ﹐或是您的朋友。请注意﹕那个 /64 子网标记的使用办法参照常规的 IP 位址界定方式就可以了。

您的 IPv4 位址为 172.16.17.181﹐而 6bone 的 router 也有一个位址为 145.100.1.5。

# ip tunnel add sixbone mode sit remote 145.100.1.5 [local 145.100.24.181 ttl 225]
# ip link set sixbone up
# ip addr add 3FFE:604:6:7::2/126 dev sixbone
# ip route add 3ffe::0/16 dev sixbone

让们研究一下上面的句子。第一行﹐我们建立了一个 tunnel 设备﹐叫做 sixbone。然后设定为 sit 模式(IPv6 in IPv4 tunneling)﹐并且要连到哪里去 (remote)﹐还有从哪里来 (local)。而 TTL 呢﹐已设到最高﹕255。

接下来﹐我们将设备跑起来 (up)。再下来﹐我们新增自己的网路位址﹐同时透过这个 tunnel 为 3ffe::/15 设定一个路由 (目前均为 6bone)。如果您目前的执行主机是您的 IPv6 网关的话﹐请增加如下数行﹕

# echo 1 >/proc/sys/net/ipv6/conf/all/forwarding
# /usr/local/sbin/radvd
在最后面的 radvd 是一个路由器广告程序(advertisement daemon) - like zebra -﹐以支持 IPv6 的自动设定功能。如果您有兴趣﹐请用搜索引擎寻找它的相关信息。您可以用如下命令来检查一下﹕

# /sbin/ip -f inet6 addr

假如您已经在 IPv6 网关上将 radvd 跑起来﹐并在本地网路上启动 IPv6 兼容的 Linux 机器﹐那您应该可以享受到 IPv6 的自动设定功能了﹕

# /sbin/ip -f inet6 addr
1: lo: <LOOPBACK,UP> mtu 3924 qdisc noqueue inet6 ::1/128 scope host

3: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100
inet6 3ffe:604:6:8:5054:4cff:fe01:e3d6/64 scope global dynamic
valid_lft forever preferred_lft 604646sec inet6 fe80::5054:4cff:fe01:e3d6/10 
scope link

您还可以进而用 bind 设定 IPv6 位址。原来的 A 记录﹐在 IPv6 里面为﹕AAAA。而 in-addr.arpa 则改为 ip6.int。呵﹐光是这个题目就有一大堆资料了。

越来越多的应用程序已经开始支持 IPv6 了﹐包括 secure shell﹑telnet﹑inetd﹑Mozilla 浏灠器﹑Apache 网站伺服器﹑以及其它﹐数不胜数。不过﹐这些都不是本路由文件所要讨论的啦 ;-)

在 Cisco 那边﹐设定档或许会长得有点像下面的样子﹕

!
interface Tunnel1
description IPv6 tunnel
no ip address
no ip directed-broadcast
ipv6 enable
ipv6 address 3FFE:604:6:7::1/126
tunnel source Serial0
tunnel destination 145.100.24.181
tunnel mode ipv6ip
!
ipv6 route 3FFE:604:6:8::/64 Tunnel1
但是﹐如果您没有 Cisco 可供设定﹐那就尝试找 Internet 上的众多 IPv6 tunnel 经纪帮忙。相信他们都非常乐意在他们的 Cisco 上面为您设定额外的 tunnel 的。而且大部份都可以透过友善的 web 界面进行。您可以用搜索引擎找找 "ipv6 tunnel broker" 看。
Next Previous Contents