适用于 Linux 的 DHCPv6 前缀委派服务器?

适用于 Linux 的 DHCPv6 前缀委派服务器?

我可以设置哪种 Linux DHCPv6 客户端,以便它在一个接口上请求前缀,然后在所有其他接口上给出地址(或者如果请求,则提供较小的前缀委派)?它还需要设置路由和路由器通告。

如果没有办法做到这一点,那么对 IPv4 路由器进行 NAT 编程的 IPv6 版本是什么,无论它放在哪里?基本上,我试图了解制造商如何设置支持 IPv6 的路由器,以便客户可以将它们插入并工作。我不是在谈论 IPv6 中的实际 NAT,而是一种让路由器拥有 DHCPv6 前缀委派客户端的方法,该客户端将获取收到的前缀并将其分解为更小的前缀和地址,并为每个单独的下游链路运行 DHCPv6 服务器。

我添加了一个图表:

包含 9 台计算机的图表。 #2、#4、#6、#7 和 #9 是 DHCPv6 客户端。 #1 被分配 2001:db8:1200::/40 并给出 /48 前缀委托。 #3、#5 和 #8 在请求前缀时同时是 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 3DHCP 客户端一段时间(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分支中,以及一个小型 Rub​​y 脚本,该脚本展示了如何将它们组合在一起。

答案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,配置需要路由协议的接口(一次),然后就可以了。

相关内容