我的 ISP 刚刚启动了 IPv4/IPv6 双栈服务。为了连接 IPv4/IPv6 互联网,几乎所有用户通常都使用 ISP 租用的 CPE。但我想使用我的 Linux 路由器代替这种 CPE,因为我的路由器有很多角色(许多 iptables 规则和 3 个以太网接口、http 反向代理、http 缓存、memcached、smtp/pop 服务器和 DNS 代理)。我想让它成为 IPv4/IPv6 双栈路由器。
我的路由器
- CentOS6.0 i686
- eth0 为 WAN
- eth1,2 为 LAN
- ISC dhcp(版本 4.1.1)通过“# yum install dhcp”从 CentOS-updates repo 安装
- radvd(版本 1.6)通过“# yum install radvd”从 CentOS-base repo 安装
- [编辑] 我使用 ISC dhclient 的原因是我的路由器必须在其请求和请求消息中发送 DHCPv6 选项 16(供应商类别),以便获取包含一些 ISP 特定信息(SIP 电话号码、固件服务器地址)的供应商特定信息选项。我知道如何在 ISC dhclient 中设置选项 16,但不知道如何在 WIDE-dhcpv6 中设置。而且我在 ISC dhclient 中找不到“id-assoc”之类的设置。
我的目标
- /48 前缀被委托给 eth0 上的 DHCPv6-PD(DHCPv6 前缀委托)客户端(dhclient)。
- 设置了指向 ISP 的 IPv6 默认路由。我必须将 ISP 的 DHCPv6 服务器的链路本地地址视为默认路由。
- 每个 LAN I/F(eth1/eth2)分配一个 /64 子网和一个全局地址(位于委派前缀中)。
- eth1 和 eth2 上的 radvd 根据分配的 /64 子网宣布 RA。
- eth1 和 eth2 上的 dhcpd6 宣布从 ISP 的 DHCPv6 服务器接收的附加网络信息(名称服务器、域搜索列表和 sip 服务器地址)。
我当前的配置
/etc/sysconfig/网络
NETWORKING=yes
HOSTNAME=xxx.yyy.zzz
# Enable IPv6 routing and stop accept_ra/autoconf.
IPV6FORWARDING=yes
/etc/sysconfig/网络脚本/ifcfg-eth0
DEVICE="eth0"
ONBOOT=yes
TYPE=Ethernet
BOOTPROTO=none
# Enable DHCPv6-PD client.
DHCPV6C=yes
DHCPV6C_OPTIONS="-P -cf /etc/dhcp/dhclient6.conf"
# Disable make_resolv_conf function in /sbin/dhclient-script.
PEERDNS=no
/etc/dhcp/dhclient6.conf
script "/sbin/dhclient-script";
interface "eth0" {
send dhcp6.reconf-accept;
also request dhcp6.vendor-opts, dhcp6.sip-servers-names, dhcp6.sip-servers-addresses, dhcp6.sntp-servers;
}
结果
在“# service network restart”之后,DHCPv6-PD 客户端似乎成功完成。
lease6 {
interface "eth0";
ia-pd xx:xx:xx:xx {
starts 1312464004;
renew 7200;
rebind 10800;
iaprefix 24xx:xxxx:xxxx::/48 {
starts 1312464004;
preferred-life 12600;
max-life 14400;
}
}
option dhcp6.client-id xx:xx:xx:xx:xx:xx:xx:xx:xx:xx;
option dhcp6.server-id xx:xx:xx:xx:xx:xx:xx:xx:xx:xx;
option dhcp6.reconf-accept ;
option dhcp6.sip-servers-addresses 24xx:xxxx:xxxx:xxxx::1;
option dhcp6.name-servers 24xx:xxxx:xxxx:xxxx::3,24xx:xxxx:xxxx:b::3;
option dhcp6.domain-search "xxx.jp.", "yyy.jp.";
option dhcp6.sntp-servers 24xx:xxxx:xxxx:xxxx::a,24xx:xxxx:xxxx:b::b;
}
问题
DHCPv6-PD 客户端已成功委派 /48 前缀。但此后,
- 如何在路由器的路由表中设置 IPv6 默认路由?
- 如何根据委派的前缀为每个 LAN I/F(eth1 和 eth2)分配全局 IPv6 地址和 /64 子网?
- 如何触发 radvd 在每个 LAN I/F(eth1 和 eth2)上宣布 RA?
- 如何触发每个 LAN I/F 上的 DHCPv6 服务器(dhcpd6)来宣布从 ISP 的 DHCPv6 服务器接收的附加网络信息(名称服务器、域搜索列表和 sip 服务器地址)?
我猜
根据“$ man dhclient”和“$ man dhclient-script”,dhclient 脚本似乎可用于配置此类设置,并且它提供一些钩子。但现在,它对 DHCPv6-PD 客户端不起作用。
是的,虽然我不熟悉 IPv6 网络配置,但我可能必须编写一些适合我的 DHCPv6-PD 环境的脚本。有人能告诉我 dhclient-script 中的上述设置吗?[编辑]我想知道实用的 dhclient-script。
我担心,应该考虑一些特殊因素。例如,由于每个 IPv6 地址都有首选/有效生存期,当我根据委托前缀将全局 IPv6 地址分配给 LAN 接口时,我不仅要分配 IPv6 地址,还要分配其生存期,而生存期必须从委托前缀的首选/有效生存期中得出?
此外,当 DHCPv6 重新配置发生时,可能必须重新配置 LAN 接口上的 radvd 和 DHCPv6 服务器?应该使用哪个钩子?
[编辑] 当 DHCPv6 重新配置发生时,如何宣布新信息和过时信息?radvd 是否自动宣布以前的前缀已过时?DHCPv6 服务器是否自动宣布以前的名称服务器已过时?
答案1
我不知道你的问题的答案,但我只是想提醒你不要使用 DHCP 服务器地址作为你的默认路由器。如果这有效,那只是偶然的......在 IPv6 中,默认路由由 RA 而不是 DHCP 传达。
您需要启用转发、接受 RA 和发送 RS。这里的一个问题是 Centos6 中包含的内核不允许您这样做。启用转发后,接受 RA 和发送 RS 将被禁用。不过应该有一个带有相关补丁的 CentosPlus 内核。请参阅邮件列表主题/消息http://lists.centos.org/pipermail/centos/2011-April/thread.html#109756
相关的 sysctl.conf 设置是:
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.eth0.accept_ra=2
net.ipv6.conf.eth0.accept_ra_defrtr=1
net.ipv6.conf.eth0.router_solicitations=1
答案2
- 在使用 DHCPv6 PD 获取附加子网之前,应由获得默认(上游)Internet 连接的任何人设置 IPv6 默认路由。您尚未提到您实际上是如何连接上游的,因此我无法帮助您。
我使用 WIDE DHCPv6 客户端,而不是 ISC,所以我不知道具体该怎么做,但我希望 ISC 有与这个 WIDE 配置选项等效的东西:
id-assoc pd { prefix-interface eth0 { sla-id 1; sla-len 4; }; };
基本上,您告诉 DHCP 客户端如何将子网分配给内部接口;上述配置表示“我将获得委托给我的 4 位前缀 (
sla-len 4
),获取第一个可用子网 (sla-id 1
) 并将其分配给eth0
(prefix-interface eth0
)。- 使用适当的
interface
节设置 radvd(手册页中有很好的例子radvd.conf
可以参考),它就可以工作了。 - 我帮不了你;除了测试之外,我不使用 DHCPv6 服务(我从我的 DHCP 服务器获取所有 DHCP 信息)。
答案3
Wombie 给出的答案与我设置 radv 和路由时给出的答案相同。Inet6 旨在进行自我配置,无需 DHCP 服务器。
我不使用 DHCPv6,因为它可以由 radvd 和 zeroconf 处理。radvd 可以配置为提供名称服务器,并且可以从 /etc/resolv.conf 中发布服务器广告。radvd 的新版本还实现了分发搜索列表。
我配置了 avahi-daemon 来将名称服务和服务器分发给客户端。您将需要能够进行服务发现的客户端。由于我全面运行双栈网络,因此我没有对服务发现进行太多测试。