使用dhcp为ipv6发送networking掩码和网关/路由

我已经build立了一个DHCP服务器来分配ipv6给我的客户端。 但是,“路由器”和“子网”选项都被忽略。

我读过,ipv6不能从DHCP获取这些,而是​​从路由器broatcast。

不过,我觉得这很奇怪。 为什么从DHCP获得一个静态IP,但从路由器的networking掩码? 奇怪的build筑。

无论如何,我想知道是否有一种方法可以轻松地将这些“缺失”function添加到DHCPv6或任何其他工作。 最终的结果应该是我可以根据客户端的MAC地址从一个中心位置设置“ip6”,“netmask”和“网关”,就像我可以用ipv4做的一样。

我不想搞乱ipv6自动configuration和无状态的东西。

网关问题,我可以通过在networkingconfiguration中的“up”事件上设置一些“坏”的方法来解决,但我找不到一个方法来改变接口的networking掩码。

通常情况下,IPv6是通过“路由器通告”使用“邻居发现协议”从路由器本身获取IP,networking掩码和路由/网关信息。

这与IPv4的工作方式完全不同。 有一种叫做DHCPv6的东西,假设它可以作为ipv6的DHCP工作,但缺乏很多function。 很有可能是因为IPv6的原因。

但是,我们中的许多人都希望能够像使用IPv4和DHCP一样将IPv6分配给我们的客户端。 这是可能的,但需要一点修补。

你必须做的第一件事是添加3个自定义OPTION参数到你的DHCP服务器。

如果您在Linux中使用ISC DHCP服务器,则您的configuration文件应该如下所示:

authoritative; default-lease-time 86400; max-lease-time 86400; log-facility local7; use-host-decl-names on; option ipv6-address code 214 = ip6-address; option ipv6-netmask code 215 = unsigned integer 8; option ipv6-gateway code 216 = ip6-address; subnet 88.xxx.xxx.128 netmask 255.255.255.224 { option domain-name "example.com"; option domain-name-servers 8.8.8.8, 8.8.4.4; option routers 88.xxx.xxx.128; option subnet-mask 255.255.255.255; option ipv6-netmask 112; } host ip-88-xxx-xxx-129.example.com { hardware ethernet 16:xx:xx:xx:b3:8d; fixed-address 88.xxx.xxx.129; option host-name "ip-88-xxx-xxx-129.example.com"; option ipv6-address 2a01:xxx:xxx:2464::1:1; option ipv6-gateway 2a01:xxx:xxx:2464::1:0; } host ip-88-xxx-xxx-130.example.com { hardware ethernet 16:xx:xx:xx:af:aa; fixed-address 88.xxx.xxx.130; option host-name "ip-88-xxx-xxx-130.example.com"; option ipv6-address 2a01:xxx:xxx:2464::2:1; option ipv6-gateway 2a01:xxx:xx:2464::2:0; } host ip-88-xxx-xxx-131.example.com { hardware ethernet 16:xx:xx:xx:7a:73; fixed-address 88.xxx.xxx.131; option host-name "ip-88-xxx-xxx-131.example.com"; option ipv6-address 2a01:xxx:xxx:2464::3:1; option ipv6-gateway 2a01:xxx:xxx:2464::3:0; } 

正如你所看到的,我添加了3个新的选项,称为“ipv6-address”,“ipv6-netmask”和“ipv6-gateway”。 您将它们设置为与通常使用IPv4相同的方式。

进行更改后,请不要忘记重新启动DHCP服务器。

现在,客户端需要被告知包含这3个自定义选项时,他们正在做一个DHCP请求。

这取决于您正在使用的DHCP客户端。 Debian / Ubuntu使用“dhclient”,它的configuration需要如下所示:

 option rfc3442-classless-static-routes code 121 = array of unsigned integer 8; option ipv6-address code 214 = ip6-address; option ipv6-netmask code 215 = unsigned integer 8; option ipv6-gateway code 216 = ip6-address; request subnet-mask, broadcast-address, time-offset, routers, domain-name, domain-name-servers, domain-search, host-name, netbios-name-servers, netbios-scope, interface-mtu, rfc3442-classless-static-routes, ntp-servers, dhcp6.domain-search, dhcp6.fqdn, dhcp6.name-servers, dhcp6.sntp-servers, ipv6-address, ipv6-netmask, ipv6-gateway; 

正如你所看到的,我在顶部添加了3个自定义的OPTION定义,然后告诉DHCP将它们包含在请求中。

现在尝试重新启动客户端,看看它是否仍然像以前一样正确地获取IPv4(因为它应该)。

重新启动后,您可以查看DHCP创build的租约文件。 它包含从DHCP服务器收集的信息。 在Debian / Ubuntu系统上,可以在“/var/lib/dh​​cp/dhclient.eth0.leases”find。 如果你看文件,你应该看到这样的东西:

 lease { interface "eth0"; fixed-address 88.xxx.xxx.136; option subnet-mask 255.255.255.255; option routers 88.xxx.xxx.128; option dhcp-lease-time 86400; option dhcp-message-type 5; option domain-name-servers 8.8.8.8,8.8.4.4; option dhcp-server-identifier 88.xxx.xxx.128; option ipv6-address 2a01:xxx:xxx:2464::8:1; option ipv6-netmask 112; option host-name "ip-88-xxx-xxx-136.example.com"; option ipv6-gateway 2a01:xxx:xxx:2464::8:0; option domain-name "example.com"; renew 6 2013/08/03 23:32:53; rebind 0 2013/08/04 09:04:30; expire 0 2013/08/04 12:04:30; } 

正如你所看到的,3个自定义选项已经find了正确的方式到客户端。

现在,您需要做的最后一件事是添加一个使用这些值的脚本来设置您的ipv6接口。

dhclient正在使用一个特殊的钩子系统,它在某些阶段运行脚本。 当收到来自DHCP服务器的响应时,我们需要运行它。

使用以下内容在“/etc/dhcp/dhclient-exit-hooks.d/ipv6”中创build一个文件:

 #************************************** # This script sets ipv6 based on custom options #************************************** # To enable this script set the following variable to "yes" RUN="yes" if [ "$RUN" != "yes" ]; then exit 0 fi if [ "$reason" != "BOUND" ]; then exit 0 fi if [ ! -n "$new_ipv6_address" ] || [ ! -n "$new_ipv6_netmask" ] || [ ! -n "$new_ipv6_gateway" ]; then exit 0 fi ip addr add $new_ipv6_address/$new_ipv6_netmask dev $interface ip -6 route add default via $new_ipv6_gateway dev $interface 

现在重新启动你的客户端,观看魔术的发生!

更新1:从“ifup.d”移动ipv6运行在DHCP绑定,而不是使其更清洁。