Next Previous Contents

4. 准备IPv6的运行系统

4.1 IPv6-ready kernel

现在的Linux发行版的核心都具备了运行IPv6的条件. IPv6功能被编译成一个可载入模块. 在一般情况下模块不会在开机的时候自动载入.

参照更新的信息: IPv6+Linux-Status-Distribution

检察现在的系统是否支持IPv6

注意您的/proc-file-system.必须有如下的结构:


/proc/net/if_inet6

一个简单的测试:


# test -f /proc/net/if_inet6 && echo "Running kernel is IPv6 ready"
 

如果失败, 表明模块没有载入.

试著载入模块

执行载入模块的命令:


# modprobe ipv6
  

如果成功, 模块会在列表中显示,执行如下命令:


# lsmod |grep -w 'ipv6' && echo "IPv6 module successfully loaded"
 

让模块自动载入

模块是可以自动载入的,只要在核心模块设定文件( /etc/modules.conf 或 /etc/conf.modules)中加入:


alias net-pf-10 ipv6  # automatically load IPv6 module on demand
 

也可以关掉IPv6模块的自动载入:


alias net-pf-10 off   # disable automatically load of IPv6 module on demand

编译有 IPv6 功能的核心

如果以上两个结果都证实了核心不具有IPv6功能, 您可以有如下选择:

如果您决定编译一个核心,您必须读过 Linux Kernel HOWTO. 以及这方面的经验.

注意:您必须使用核心2.4.x系列或更高. 因为IPv6对2.2.x系列缺少相应的支持. 并且需要ICMPv6 和 6to4 支持的补丁.(补丁可以在 kernel series 2.2.x IPv6 patches找到).

将核心同 USAGI 的扩展一起编译.

只推荐熟悉核心编译和IPv6的用户使用. 参照: USAGI project / FAQ.

IPv6-ready network devices

不是所有的设备都有能力传输IPv6数据包, 这里有一个现状表: IPv6+Linux-status-kernel.html#transport.

现阶段不会支持IPv6的连结

在将来都不会支持IPv6的设备

4.2 IPv6-ready 网路设定工具

别扯太远了, 如果您有一个正在运行IPv6的核心,怎么会没有设定的工具呢? 安装包里早就有几个这样的工具了.

net-tools package

net-tools package 包含一些工具如: ifconfig ,route. 这些可以令您在界面上设定IPv6. 在命令行(shell) 用ifocnig -? 或 route -? 查看诸如IPv6 或 inet6.如果有,则说明具备IPv6设定能力.

输入以下命令进行检查:


# /sbin/ifconfig -? 2>& 1|grep -qw 'inet6' && echo "utility 'ifconfig' is
?IPv6-ready"
 

也可以使用route:


# /sbin/route -? 2>& 1|grep -qw 'inet6' && echo "utility 'route' is IPv6-ready"

iproute package

Alexey N. Kuznetsov (Linux 网路代码现阶段的维护者) 写了一个tool-set可以通过netlink 设备来设定网路.它可以比net-tool提供更多的功能, 但没有多少文档并且它不是为胆小的人设计的.


# /sbin/ip 2>&1 |grep -qw 'inet6' && echo "utility 'ip' is IPv6-ready"

如果没有找到 /sbin/ip 那么我极力推荐您安装iproute package.

4.3 IPv6-ready 测试/调式 程序

在为IPv6准备好了系统后,您可以用IPv6进行网路通讯. 首先您必须学习如何用嗅探程序来检查IPv6数据包. 强烈推荐这样做,因为在debugging/troubleshooting 中有利于快速诊断.

IPv6 ping

这个程序一般在iputils包里, 用来测试简单传输发送 ICMPv6 回应请求并等待ICMPv6 回应包.

用法:


# ping6 < hostwithipv6address >
# ping6 < ipv6address >
# ping6 [-I < device >] < link-local-ipv6address > 

例子:


# ping6 -c 1 ::1 
PING ::1(::1) from ::1 : 56 data bytes 
64 bytes from ::1: icmp_seq=0 hops=64 time=292 usec
--- ::1 ping statistics --- 
1 packets transmitted, 1 packets received, 0% packet loss 
round-trip min/avg/max/mdev = 0.292/0.292/0.292/0.000 ms

提示 ping6必须有适当的root权限才能使用, 如果不是root组用户,使用时可能产生问题:

1.ping6 不在用户的路径当中 (probably, because ping6 is generally stored in /usr/sbin -> add path (not really recommended)

2.ping6 不能被正确执行, 通常没有适当的权限 chmod u+s /usr/sbin/ping6

为ping6指定界面

用local-addresses 作为ping6 目标必须指定一个界面. 否则核心将不知道数据包发往哪个设备. 在没有指定的情况下会有这样的输出:


# ping6 fe80::212:34ff:fe12:3456 
connect: Invalid argument

为ping6指定界面的结果:


# ping6 -I eth0 -c 1 fe80::2e0:18ff:fe90:9205 
PING fe80::212:23ff:fe12:3456(fe80::212:23ff:fe12:3456) from
?fe80::212:34ff:fe12:3478 eth0: 56 data bytes 
64 bytes from fe80::212:23ff:fe12:3456: icmp_seq=0 hops=64 time=445 usec
--- fe80::2e0:18ff:fe90:9205 ping statistics --- 
1 packets transmitted, 1 packets received, 0% packet loss round-trip
?min/avg/max/mdev = 0.445/0.445/0.445/0.000 ms

Ping6 to multicast addresses(多播地址)

一个发现IPv6-active hosts 的比较有趣的机制:


# ping6 -I eth0 ff02::1 PING ff02::1(ff02::1) from fe80:::2ab:cdff:feef:0123 eth0: 56 data bytes
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.104 ms
64 bytes from fe80::212:34ff:fe12:3450: icmp_seq=1 ttl=64 time=0.549 ms (DUP!) 

与IPv4不同的是, ping 的回应在广播地址中是可以屏蔽的,目前只有IPv6防火墙可以做到.

IPv6 traceroute6

这个程序一般在iputils包里, 和IPv4的traceroute程序相似, 但与当前版本不同的是IPv6不能正确地使用ICMP echo-request. 看下面这个例子:


# traceroute6 www.6bone.net 
traceroute to 6bone.net (3ffe:b00:c18:1::10) from 3ffe:ffff:0000:f101::2, 30
?hops max, 16 byte packets 
 1 localipv6gateway (3ffe:ffff:0000:f101::1) 1.354 ms 1.566 ms 0.407 ms 
 2 swi6T1-T0.ipv6.switch.ch (3ffe:2000:0:400::1) 90.431 ms 91.956 ms 92.377 ms 
 3 3ffe:2000:0:1::132 (3ffe:2000:0:1::132) 118.945 ms 107.982 ms 114.557 ms 
 4 3ffe:c00:8023:2b::2 (3ffe:c00:8023:2b::2) 968.468 ms 993.392 ms 973.441 ms 
 5 3ffe:2e00:e:c::3 (3ffe:2e00:e:c::3) 507.784 ms 505.549 ms 508.928 ms 
 6 www.6bone.net (3ffe:b00:c18:1::10) 1265.85 ms * 1304.74 ms

IPv6 tracepath6

这个程序一般在iputils包里, 它用来追踪MTU的路径.看下面的例子:


# tracepath6 www.6bone.net 
 1?: [LOCALHOST] pmtu 1480 
 1: 3ffe:401::2c0:33ff:fe02:14 150.705ms 
 2: 3ffe:b00:c18::5 267.864ms 
 3: 3ffe:b00:c18::5 asymm 2 266.145ms pmtu 1280 
 3: 3ffe:3900:5::2 asymm 4 346.632ms 
 4: 3ffe:28ff:ffff:4::3 asymm 5 365.965ms 
 5: 3ffe:1cff:0:ee::2 asymm 4 534.704ms 
 6: 3ffe:3800::1:1 asymm 4 578.126ms !N 
Resume: pmtu 1280

IPv6 tcpdump

在Linux作业系统中 tcpdump 是主要的数据包捕获工具.IPv6支持 3.6 的版本.

tcpdump用于降低数据包杂讯的参数:

使用命令行参数也可以从一个数据包中捕获/列印信息.

IPv6 ping to 3ffe:ffff:100:f101::1 native over a local link


 # tcpdump -t -n -i eth0 -s 512 -vv ip6 or proto ipv6 
tcpdump: listening on eth0 
3ffe:ffff:100:f101:2e0:18ff:fe90:9205 > 3ffe:ffff:100:f101::1: icmp6: echo
?request (len 64, hlim 64) 
3ffe:ffff:100:f101::1 > 3ffe:ffff:100:f101:2e0:18ff:fe90:9205: icmp6: echo
?reply (len 64, hlim 64)

IPv6 ping to 3ffe:ffff:100::1 routed through an IPv6-in-IPv4-tunnel

1.2.3.4和5.6.7.8是遂道的终点(这些都是例子).


# tcpdump -t -n -i ppp0 -s 512 -vv ip6 or proto ipv6 
tcpdump: listening on ppp0 
1.2.3.4 > 5.6.7.8: 2002:ffff:f5f8::1 > 3ffe:ffff:100::1: icmp6: echo request
?(len 64, hlim 64) (DF) (ttl 64, id 0, len 124) 
5.6.7.8 > 1.2.3.4: 3ffe:ffff:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len
?64, hlim 61) (ttl 23, id 29887, len 124) 
1.2.3.4 > 5.6.7.8: 2002:ffff:f5f8::1 > 3ffe:ffff:100::1: icmp6: echo request
?(len 64, hlim 64) (DF) (ttl 64, id 0, len 124) 
5.6.7.8 > 1.2.3.4: 3ffe:ffff:100::1 > 2002:ffff:f5f8::1: icmp6: echo reply (len
?64, hlim 61) (ttl 23, id 29919, len 124)

4.4 IPv6-ready programs(能和IPv6协同工作的程序)

在当前的发行版中已经包含了能和IPv6协同工作的程序(服务端/客户端)
参照: IPv6+Linux-Status-Distribution.
或者检查 http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-apps.html
一些可用程序的线索: IPv6 & Linux - HowTo - Part 3IPv6 & Linux - HowTo - Part 4.

4.5 IPv6-ready 客户端程序 (selection)

想要进行下面的测试, 您的作业系统必须拥有IPv6能力. 有些例子是真实地连结了6bone的情况下做的.

检查DNS对IPv6地址的解析能力

因为这几年Domain Name System (DNS)安全的不断升级, 它们中的大部份都具备了对IPv6 地址类型AAAA的解析能力. (新的类型A6 只有BIND9和更高的版本支持)检查DNS对IPv6地址的解析能力:


# host -t AAAA www.join.uni-muenster.de

将得到下面的结果:


www.join.uni-muenster.de. is an alias for ns.join.uni-muenster.de. 
ns.join.uni-muenster.de. has AAAA address 3ffe:400:10:100:201:2ff:feb5:3806

IPv6-ready telnet clients

IPv6-ready telnet 客户端. 对它进行一个简单的测试:


$ telnet 3ffe:400:100::1 80
Trying 3ffe:400:100::1... 
Connected to 3ffe:400:100::1. 
Escape character is '^]'. 
HEAD / HTTP/1.0
HTTP/1.1 200 OK 
Date: Sun, 16 Dec 2001 16:07:21 
GMT Server: Apache/2.0.28 (Unix) 
Last-Modified: Wed, 01 Aug 2001 21:34:42 GMT 
ETag: "3f02-a4d-b1b3e080" 
Accept-Ranges: bytes 
Content-Length: 2637 
Connection: close 
Content-Type: text/html; charset=ISO-8859-1
Connection closed by foreign host.

如果telnet只出现"cannot resolve hostname", 说明作业系统的IPv6还未激活.

openssh

openssh已经支持IPv6, 但必须对它用以下的参数进行编译后才能使用:


$ ssh -6 ::1 
user@::1's password: ****** 
[user@ipv6host user]$

如果您的ssh不能对 -6 进行反应, 可能作业系统的IPv6还未激活,或ssh的版本太低.

ssh.com

他们的客户/服务端程序是免费的.

IPv6-ready web 流览器

目前支持IPv6的web 流览器列表: IPv6+Linux-status-apps.html#HTTP.

这些流览器大部份都存在问题:

一些早期的版本不能对IPv6地址进行正确的操作, 如: http://[3ffe:400:100::1]/

一个小测试,显示在没有代理的情况下的 URL 和 流览器.

URLs for testing

测试IPv6最方便的方法是访问: http://www.kame.net/. 如果海龟是活动的, 说明连接是通过IPv6进行的, 它不动的话, 说明连接是通过IPv4进行的.

4.6 IPv6-ready server 程序

包括:sshd, httpd, telnetd,


Next Previous Contents