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 而已﹐因此或和其它技术有别。
这是 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 位址﹐事实上蛮累人的。因此﹐不妨参考如下规则来简化一下﹕
用于 tunnels 上面
IPv6 一致被认为能够取代 IPv4 的地位。由于它相对而言还是一种崭新技术﹐目前尚难找到纯 IPv6 的原始网路。为了让我们更迅速的过渡﹐于是有了 6bone 的出现。
原始的 IPv6 网路联结﹐是透过将 IPv6 协定封装在 IPv4 封包中﹐然后利用现有的 IPv4 架构从一个 IPv6 站点送到其它站点去。
恰好﹐这正是 tunnels 切入之处。
为了使用 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" 看。