Gentoo IPv6路由指南
1.
准备工作
基本的内核配置
Gentoo里任何一个2.6系列的内核版本都可以很容易地支持IPv6连接。自从2.6.0版本以来,新版USAGI IPv6协议栈已经被集成到了内核里面。
代码 1.1: 安装内核 |
# emerge gentoo-sources
|
现在我们准备进入内核源代码的目录,并且开始我们实际的内核配置
代码 1.2: 配置Linux内核 |
# cd /usr/src/linux
# make menuconfig
|
注意:
这里假设 /usr/src/linux 已经指向你将要使用的内核。
|
代码 1.3: 'make menuconfig' 选项 |
Device Drivers --->
Networking support --->
Networking options --->
<*> The IPv6 protocol (EXPERIMENTAL)
[*] Network device support
<*> Universal TUN/TAP device driver support
|
测试IPv6支持
在开启了推荐的选项之后,重新编译您的内核并且重新启动,进入到您已经开启了IPv6支持的内核中。
如果您还没有安装iproute2,我们建议您现在就安装。
iproute2是一款的网络套件,其中包含了著名的ip,它可以替代ifconfig, route, iptunnel ...
代码 1.4: 安装iproute2 |
# emerge sys-apps/iproute2
|
警告:
如果您拥有多个隧道设备,那么使用ifconfig会引发严重的问题。您必须按倒序移除隧道,也就是说最新的隧道首先被移除。您已经被警告。
|
如果IPv6正在工作,回环设备将会显示一个IPv6的地址:
代码 1.5: 检查回环设备 |
# ip -6 addr show lo
1: lo: <LOOPBACK,UP> mtu 16436
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
|
在进行下一步的操作之前,请确保您已经将ipv6添加到您make.conf的USE变量列表中,这样在将来安装的软件包才会包含IPv6支持。
2.
隧道配置
基本的配置
很多ISP(互联网服务供应商)仍旧不提供任何原生IPv6的连接。为了避开这一限制,全球有几家“隧道代理”提供免费的IPv6隧道。这将允许您在IPv4连接中使用隧道来完成你您所有的IPv6连接。
下面是两个利用Hurricane Electric(也可以从sixxs.net获取隧道)和Freenet6这两个北美的隧道进行设置的例子。
Hurricane Electric
Hurricane Electric(简称HE)提供免费的IPv6隧道,同时为您提供一个/64的地址块。它还允许您设置反向DNS。从HE获取一个隧道是很容易的,只需要到http://www.tunnelbroker.net/填写一页的表格。
注意:
注册包含一系列的信息,比如您的地址和电话号码。
|
当您的隧道得到批准并且被分配了一个/64的地址块之后,您就能够设置您的Gentoo了。HE提供了基于ifconfig和iproute工具的示例。在接下来的两个例子中,假设您拥有下面的设置:
| Local IPv4 Address (eth0) |
68.36.91.195 |
| HE IPv4 Address |
64.71.128.82 |
| Local IPv6 tunnel Address |
2001:470:1F00:FFFF::189 |
| IPv6 Block |
2001:470:1F00:296::/64 |
使用iproute2包和ip命令,您可以按下面那样做:
代码 2.1: 配置一个IPv6隧道 |
# ip tunnel add sixbone mode sit remote 64.71.128.82 local 68.36.91.195 ttl 64 dev eth0
# ip link set sixbone mtu 1280
# ip link set sixbone up
# ip addr add 2001:470:1F00:FFFF::189 dev sixbone
# ip route add 2000::/3 dev sixbone
|
Freenet6
Freenet6是另一个免费的隧道代理。可选注册只需要一个用户名和一个合法的电子邮件地址。他们已经选择将隧道的管理变成了客户/服务器模式,并且已经开发出了一款叫做gateway6的客户端软件。这个客户端在Portage中是可用的。安装它需要做:
代码 2.2: 安装Freenet6客户端 |
# emerge gateway6
|
现在如果您选择带认证的连接,你需要配置gateway6 通过编辑/etc/gateway6/gw6c.conf。您只需修改userid和passwd部分成为Freenet6分配给您的那些,并且改变网关服务器。下面是一个配置文件的例子。
代码 2.3: gw6c.conf例子 |
auth_method=any
userid=anonymous
passwd=foobar
template=linux
server=broker.freenet6.net
|
测试您的连接
既然您的隧道已经配置好了,那么您就可以测试您的连接了。最简单的方法就是使用
ping6软件包并试着ping
一个IPv6主机。
代码 2.4: 测试连接 |
# emerge iputils
# ping6 www.kame.net
PING www.kame.net(orange.kame.net) 56 data bytes
64 bytes from orange.kame.net: icmp_seq=1 ttl=52 time=290 ms
64 bytes from orange.kame.net: icmp_seq=2 ttl=52 time=277 ms
64 bytes from orange.kame.net: icmp_seq=3 ttl=52 time=280 ms
64 bytes from orange.kame.net: icmp_seq=4 ttl=52 time=279 ms
64 bytes from orange.kame.net: icmp_seq=5 ttl=52 time=277 ms
--- www.kame.net ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4038ms
rtt min/avg/max/mdev = 277.040/281.041/290.046/4.699 ms
|
正在进行的下一步工作是将更好的IPv6支持添加到网络初始化脚本中。如果您像了解这项工作的进展,并且(或者)想要帮忙,那么发邮件到latexer@gentoo.org.
3.
应用程序里的IPv6支持
Re-emerging软件包
除非您以前已经将USE="ipv6"添加到您的/etc/make.conf
中去了,否则您可能需要re-emerge(重新安装)一堆软家包并把IPv6支持编译进去。要像知道所有已经安装的软家包中有哪些因为USE标记的改变而受到影响,可以使用Portage的--newuse (-N)选项
代码 3.1: 需要re-emerging的候选软件包 |
# emerge -uDNav world
|
如果您已经改变了很多的USE标记,那么列表将会很长。我们建议将您的系统保持最新,如果您重新编译所有受影响的软件包的话,系统将不会受到损坏。
注意:
一些软件包会自动检测IPv6支持,因此没有IPv6的USE标记。因此,并不是所有应该支持IPv6的软件包都会支持IPv6,如果您编译它的时候并没有一个支持IPv6的内核。
|
IPv6具体软件包
有几个软件包解决具体的IPv6问题,它们中的大部分都在/usr/portage/net-misc中。
| 软件包 |
描述 |
| net-misc/ipv6calc |
将一个IPv6地址转换成压缩格式 |
| net-misc/netcat6 |
支持IPv6和IPv4的netcat版本 |
| dev-perl/Socket6 |
C socket.h的定义和机构操作中与IPv6相关的部分 |
4.
DNS设置
IPv6和DNS
正如IPv4的DNS使用A记录那样,IPv6的DNS使用AAAA记录。(这是因为IPv4是一个2^32的地址空间,而IPv6是一个2^128的地址空间)对于反向DNS,INT已经过时,但是仍旧被广泛支持。ARPA 是最新的标准。这里将描述支持ARPA的格式。
BIND配置
最新的BIND版本包含优秀的IPv6支持。这一部分将假设您至少已经有了配置和使用BIND的最基本知识。我们将假设您并不是在chroot中运行bind。如果您使用了chroot,那么只需简单地追加chroot前缀到接下来那一部分的大多数路径中。
首先您需要向/etc/bind/named.conf区域文件中的添加转发和反向的DNS条目。
代码 4.1: named.conf条目 |
options {
[...]
listen-on-v6 { any; }
[...]
};
zone "ipv6-rules.com" IN {
type master;
file "pri/ipv6-rules.com";
};
zone "6.9.2.0.0.0.f.1.0.7.4.0.1.0.0.2.ip6.arpa" {
type master;
file "pri/rev-ipv6-rules.com.arpa";
};
|
现在我们必须创建区域文件并为我们所有的主机添加相应的条目:
代码 4.2: pri/ipv6-rules.com |
$TTL 2h
@ IN SOA ipv6-rules.com. webmaster.ipv6-rules.com. (
2003052501 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
NS ns1.ipv6-rules.com
IN AAAA 2001:470:1f00:296::1 ; address for ipv6-rules.com
host1 IN AAAA 2001:470:1f00:296::2 ; address for host1.ipv6-rules.com
host2 IN AAAA 2001:470:1f00:296::3:3 ; address for host2.ipv6-rules.com
|
代码 4.3: pri/rev-ipv6-rules.com.arpa |
$TTL 3d ; Default TTL (bind 8 needs this, bind 9 ignores it)
@ IN SOA ipv6-rules.com. webmaster.ipv6-rules.com. (
2003052501 ; Serial number (YYYYMMdd)
24h ; Refresh time
30m ; Retry time
2d ; Expire time
3d ) ; Default TTL
IN NS ns1.ipv6-rules.com.
; IPv6 PTR entries
$ORIGIN 6.9.2.0.0.0.f.1.0.7.4.0.1.0.0.2.ip6.arpa.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR ipv6-rules.com.
2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR host1.ipv6-rules.com.
3.0.0.0.3.0.0.0.0.0.0.0.0.0.0.0 IN PTR host2.ipv6-rules.com.
|
DJBDNS配置
目前,存在一些可用于DJBDNS的第三方补丁,可以在http://www.fefe.de/dns/上面找到,这些补丁可以让DJBDNS进行IPv6名字服务。设置ipv6的USE标记来安装(emerge)DJBDNS会自动安装这些补丁。
警告:
这些补丁并不支持所有的记录类型。特别是NS和MX记录不被支持。
|
代码 4.4: 安装djbdns |
# emerge djbdns
|
在安装djbdns之后,可以通过运行tinydns-setup并回答一些问题来进行设置,这些问题是关于哪些IP地址将被绑定,在哪里安装tinydns,等等。
代码 4.5: 设置tinydns |
# tinydns-setup
|
假设我们已经将tinydns安装到了/var/tinydns里,
现在我们可以编辑/var/tinydns/root/data。这个文件将包含让tinydns为您的IPv6委托处理DNS所需要的所有数据。
代码 4.6: 数据文件例子 |
.ipv6-rules.com:192.168.0.1:a:259200
.6.9.2.0.0.0.f.1.0.7.4.0.1.0.0.2.ip6.arpa:192.168.0.1:a
6host1.ipv6-rules.com:200104701f0002960000000000000001:86400
6host2.ipv6-rules.com:200104701f0002960000000000000002:86400
3www.ipv6-rules.com:200104701f0002960000000000000002:86400
|
前缀有一个6的那些行将同时创建一个AAAA和一个PTR记录。那些前缀有一个3的行将只创建一个AAAA记录。除了手动编辑data文件之外,您可以使用add-host6脚本和add-alias6脚本来添加新的条目。
在修改data文件之后,您需要简单地从/var/tinydns/root运行make。这将会创建/var/tinydns/root/data.cfb,tinydns将会使用这个文件作为它的信息源来处理DNS请求。
5.
IPv6路由
设置路由
如果我们想要让我们的系统成为一个路由以便其他客户端能够通过IPv6连接外部的世界的话,那么需要进一步的设置。我们需要开启IPv6的包转发功能。我们可以通过下面两种方式中的一种做到这一点。
代码 5.1: 开启转发功能 |
# echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
or
# sysctl -w net.ipv6.conf.all.forwarding=1
|
警告:
在下一章中将会解释的radvd初始化脚本能够开启(和关闭)转发功能, 这将使下一步骤成为不必要的步骤。
|
为了在开机的时候开启转发,您将需要编辑/etc/sysctl.conf并且添加下面这一行。
代码 5.2: sysctl.conf附加部分 |
net.ipv6.conf.default.forwarding=1
|
数据流量现在将会从这台机子被转发出去,转发的道路就是利用我们的代理所建立的隧道。
要给客户端分配IPv6地址,IPv6规范允许无状态和有状态两种IP分配方式。无状态分配使用一个叫做路由广告的进程,并且可以让客户端做到,只要简单地把设备接口(interface)启动就可以获得一个IP和一个默认路由。这种方式被称为“无状态”,这是因为没有记录分配的IP和主机。有状态分配是通过DHCPv6进行处理的。这种方式之所以被称为”有状态“,是由于服务器保存了请求和获取IP的客户端的状态。
无状态设置
通过路由广告守护进程或者radvd,无状态设置将会很容易完成。
代码 5.3: 配置radvd |
# emerge radvd
|
在安装了radvd之后,我们需要创建/etc/radvd/radvd.conf,这个文件包含了我们应该从哪个地址块分配IP这样的信息。这是一个radvd.conf文件的例子,这里面使用了我们的隧道代理分配给我们的前缀。
代码 5.4: radvd.conf例子 |
interface eth1
{
AdvSendAdvert on;
AdvLinkMTU 1280;
MaxRtrAdvInterval 300;
prefix 2001:470:1F00:296::/64
{
AdvOnLink on;
AdvAutonomous on;
};
};
|
警告:
请确保第一行中的设备接口是正确的,这样您就可以将路由广告广播到您的内部网而不是您的ISP那里!
|
通过man radvd.conf可以得到更多的信息。我们现在能够启动radvd并将它设置为开机时启动。
代码 5.5: 开启radvd |
# /etc/init.d/radvd start
# rc-update add radvd default
|
有状态设置
如果您想要使用有状态设置,您将需要安装并且配置dhcpv6。
代码 5.6: 安装dhcpv6 |
# emerge dhcpv6
|
接下来我们必须编辑/etc/dhcp6s.conf来配置DHCPv6服务器。
代码 5.7: dhcp6s.conf例子 |
prefer-life-time 10000;
valid-life-time 20000;
renew-time 5000;
rebind-time 8000;
interface eth1 {
link AAA {
allow unicast;
send unicast;
allow rapid-commit;
send server-preference 5;
renew-time 1000;
rebind-time 2400;
prefer-life-time 2000;
valid-life-time 3000;
pool{
range 2001:470:1f00:296::10 to 2001:470:1f00:296::110/64;
prefix 2001:470:1f00:296::/64;
};
};
};
|
我们现在可以开启dhcp6s,并且将它设置为在开机时启动。
代码 5.8: 开启dhcp6s |
# /etc/init.d/dhcp6s start
# rc-update add dhcp6s default
|
6.
IPv6客户端
使用radvd
在这个路由之后的客户端现在应该能够通过IPv6连接其余的网络了。如果使用radvd,设置主机应该就像将设备启动一样简单。(您的net.ethX初始化脚本可能已经帮您做好了这项工作)。
代码 6.1: 通过IPv6连接 |
# ip link set eth0 up
# ip addr show eth0
1: eth0: <BROADCAST,MULTICAST,UP> mtu 1400 qdisc pfifo_fast qlen 1000
link/ether 00:01:03:2f:27:89 brd ff:ff:ff:ff:ff:ff
inet6 2001:470:1f00:296:209:6bff:fe06:b7b4/128 scope global
valid_lft forever preferred_lft forever
inet6 fe80::209:6bff:fe06:b7b4/64 scope link
valid_lft forever preferred_lft forever
inet6 ff02::1/128 scope global
valid_lft forever preferred_lft forever
|
使用DHCPv6
如果您的路由被设置成使用DHCPv6,那么您的客户端将同样需要安装net-misc/dhcpv6 软件包。在做完这些之后,您需要编辑/etc/dhcp6c.conf来配置您的客户端。
代码 6.2: dhcp6c.conf例子 |
interface eth0 {
send rapid-commit;
request domain-name-servers;
iaid 11111;
renew-time 11000;
};
|
7.
其他资源
这里有很多关于IPv6的在线资源。
在IRC上,您可以试试Freenode上的 #ipv6。您可以使用一个支持IPv6的客户端来连接irc.ipv6.freenode.net以便连接到Freenode服务器。
本文档的内容遵循知识共享-署名-相同方式共享许可协议
|