我可以设置哪种 Linux DHCPv6 客户端,以便它在一个接口上请求前缀,然后在所有其他接口上给出地址(或者如果请求,则提供较小的前缀委派)?它还需要设置路由和路由器通告。
如果没有办法做到这一点,那么对 IPv4 路由器进行 NAT 编程的 IPv6 版本是什么,无论它放在哪里?基本上,我试图了解制造商如何设置支持 IPv6 的路由器,以便客户可以将它们插入并工作。我不是在谈论 IPv6 中的实际 NAT,而是一种让路由器拥有 DHCPv6 前缀委派客户端的方法,该客户端将获取收到的前缀并将其分解为更小的前缀和地址,并为每个单独的下游链路运行 DHCPv6 服务器。
我添加了一个图表:
是否有我可以在 Linux 上运行的软件,可以配置一次,然后将其放置在 3、5 或 8 号位置,并且它会根据委托的前缀自动进行设置?
答案1
这不是一个完整的答案,因为我仍在解决一些问题,但这是迄今为止我所得到的,尝试部署几乎相同的设置(尽管出于一些不同的原因)。
好消息是:这是可以在规格范围内完成的。事实上,这些规范的明确设计目的是鼓励这种前缀的子委托,主要是为了避免痛苦的多个 NAT 层的需要,同时仍然允许网络结构的灵活性。
坏消息是:没有“开箱即用”的单个软件可以从上游请求前缀,在本地配置地址和路由,并向下游网络分发子前缀。天哪,甚至似乎不可能连接 Linux 中预先存在的软件(无需打补丁)来完成需要做的事情。最糟糕的是,看起来没有人真正关心这个。
到目前为止我所进行的设置和工作如下所示:
我正在使用 WIDE DHCPv6 客户端 (
dhcp6c
) 从“上游”网络请求前缀;我选择这个客户端而不是 ISC 的 DHCP 客户端,因为在我设置它时,它是唯一一个能够自动将接收到的前缀中的地址分配给其他接口的 DHCPv6 客户端。我想其他 DHCP 客户端自那时以来已经有所改进,但此时我懒得去检查。不幸的是,它不将委托的前缀详细信息公开给其外部挂钩脚本,这意味着您无法(轻松)重写“下游”dhcpd 配置。
ISC DHCP 服务器(v6 模式)为“下游”网络分配前缀。我选择这个是因为据我所知,WIDE 的 DHCP 服务器只能静态委派前缀,而不能动态委派前缀。令人惊讶的是,配置 ISC DHCP 服务器来执行动态前缀委派相对容易;像这样简单的事情就可以解决问题:
subnet6 2001:db8:1234:ffff::/64 { prefix6 2001:db8:1234:a000:: 2001:db8:c0f:aff0:: /60; }
这将监听任何有地址的接口,
2001:db8:1234:ffff::/64
并从指定的范围内分发 /60s。只要您可以强制dhcp6c
更新上述配置(下一步!),您就可以在委托的超级前缀更改时自动更新 dhcpd 配置。dhcp6c
如前所述,它将script
在其配置文件中采用一个参数,以便在收到 DHCPv6 响应时运行。不幸的是,它只公开 SIP 服务器和 DNS 解析器等参数,而不公开有用信息,例如已委托的前缀。因此,我有以下脚本可以帮我做到这一点:#!/bin/sh (sleep 3; base_prefix="$(ip -6 ad sh eth0 | grep 'scope global' | cut -d ' ' -f 6 | cut -d : -f 1-4 | sed 's/00$//')" if [ "$base_prefix" = "" ]; then exit 0 fi cat <<-EOF >/etc/dhcp/dhcpd6.conf default-lease-time 1800; max-lease-time 7200; subnet6 ${base_prefix}00::/64 { prefix6 ${base_prefix}a0:: ${base_prefix}f0:: /60; } EOF svc -t /etc/service/dhcp6d) & exit 0
在子 shell 中完成所有工作意味着我可以等待
sleep 3
DHCP 客户端一段时间(the )实际上配置接口(似乎在配置接口之前运行脚本)。它工作起来足够可靠。请注意,我的 ISP 委托给我 a/56
,因此我只从收到的前缀中删除后两个零。如果您足够幸运获得一个 full/48
,则分配的管道base_prefix
会简单得多。
什么不已经存在,并且我很确定需要修补源代码,即在委托前缀时设置路由。据我所知,没有任何 DHCP 服务器具有自动添加路由的内置功能(我仔细检查了 WIDE dhcp6s
,它肯定做不到,而且我在“管”上找不到任何建议ISC DHCP 执行此操作)。甚至无法运行获取委托前缀和客户端链路本地地址的外部命令(ISC DHCP 有on commit { execute(...) }
,但无法传递客户端的链路本地地址)。
问题是,如果没有这一关键的功能,进行委派的路由器就无法知道随后将前缀的流量路由到哪里。这是一个相当基本的限制,令我感到相当惊讶的是,之前似乎没有人处理过这个问题——或者即使他们处理过,他们也一直在这样做真的对此保持沉默。
我刚刚开发了一个 ISC DHCP 补丁,为评估功能提供额外的“数据表达式”;这允许我使用外部程序,然后该程序可以在前缀分配和释放/到期时添加/删除路由;该补丁可在https://github.com/mpalmer/isc-dhcp/commit/4c8ae763bcf83c9068d57a5d9f570690a581b6d6(针对 ISC DHCP 4.3.1);我还没有添加路线的脚本,但contrib
一旦我写完它,我可能会将其添加到该分支下。
附录:事实证明,需要进一步修改才能允许再次删除路由;现在已添加到client-address-data-expression
分支中,以及一个小型 Ruby 脚本,该脚本展示了如何将它们组合在一起。
答案2
进行前缀委托的程序是radvd
(路由器通告守护程序)。链路上的其他 IPv6 主机应根据已公布的前缀自动配置全局可路由地址。
IPv6 不需要 NAT,因为需要 Internet 访问的主机应具有全局可路由地址。您需要小心防火墙规则以防止来自互联网的渗透。
ISP 预计会向其客户提供 /48 或 /56 网络块。这需要 ISP 方面发挥一些聪明才智,以确保每个路由器获得唯一的块。一个 /64 块可能会用作 IPS 网络的上行链路。然后,路由器可以根据需要从块的其余部分自由地宣布任意数量的 /64。在这种情况下可能只使用一个。
还有 IPv6 DHCP 实施。
已完成的一项快速设置是将路由器配置为使用 6to4 隧道。 radvd 将自动配置此设置,但它需要一个可公开路由的 IPv4 地址。
编辑:虽然radvd
无法子委托前缀,但它可以根据可用的可路由地址自动宣布 /64 前缀。它还具有 Base6to4 来自动宣布路由器的 6to4 前缀。分委派需要一些规划,并且超出了即插即用配置的预期范围。
EDIT2:与 IPv4 一样,IPv6 没有方法根据分配给 eth0 接口的地址来确定连接到 eth1 或 eth2 的网络属于哪个网络。一旦您拥有多个网段,您需要开始管理分配给每个网段的地址。好消息是这通常可以完成一次。
IPv6 使其变得更容易,因为 5 和 8 可以轻松地将 /48 的 /49 或 /50 子网分配给 3。另一种方法是将 3、5 和 8 配置为同一 /64 子网上的网桥。在这种配置中,它们将充当交换机。自动子网生成风险路由器 5 和 8 均选择委托同一子网。
家用即插即用路由器只需使用默认的私有地址块。当按照图表所示进行配置时,它们很快就会崩溃。混合具有不同默认地址块的路由器可能会起作用。否则,您需要确保每个路由器都有不同的地址块。
答案3
看起来您需要一个路由协议,例如 RIPng。您可以在这些机器上安装 quagga,配置需要路由协议的接口(一次),然后就可以了。