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

Aze*_*ale 11 dhcp ipv6

我可以设置什么 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 服务器和客户端,同时它们请求前缀。

是否有(a)个我可以在 Linux 上运行的软件,这些软件可以配置一次,然后放置在 3、5 或 8 号位置,并且它会根据它被委派的前缀自动设置?

wom*_*ble 7

这不是一个完整的答案,因为我仍在解决一些问题,但这是我到目前为止所得到的,尝试部署几乎相同的设置(尽管出于某些不同的原因)。

好消息是:它可以在规范内完成。事实上,规范明确设计为鼓励这种前缀的子委托,主要是为了避免需要痛苦的多个 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;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这将侦听具有地址的任何接口,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
    
    Run Code Online (Sandbox Code Playgroud)

    在子 shell 中完成所有工作意味着我可以等待一会儿(sleep 3)让 DHCP 客户端实际配置接口(它似乎在配置接口之前运行脚本)。它足够可靠地工作。请注意,我的 ISP 将 a 委托给我/56,因此为什么我只从接收到的前缀中去除两个 lasy 零。如果你有幸得到一个整体/48,分配的管道base_prefix会简单得多。

什么还不存在,我很确定需要修补源代码,是在前缀被委派时设置路由。就我所见,没有 DHCP 服务器具有自动添加路由的内置功能(我仔细检查了 WIDE dhcp6s,它当然不能这样做,而且我在“管”上找不到任何建议ISC DHCP 做到了)。甚至无法运行一个外部命令,该命令采用被委派的前缀和客户端的本地链接地址(ISC DHCP 有on commit { execute(...) },但无法让客户端的链接本地地址传递出去)。

问题是,如果没有这个关键的功能,进行委托的路由器就无法知道之后将前缀的流量路由到哪里。这是一个相当基本的限制,我宁愿目瞪口呆,没有人出现之前,已经处理了这个问题-或者,如果他们有,他们饲养真的沉默。

我刚刚为 ISC DHCP 开发了一个补丁,为 eval 功能提供额外的“数据表达式”;这使我可以使用外部程序,然后可以在前缀分配和释放/到期时添加/删除路由;该补丁可在https://github.com/mpalmer/isc-dhcp/commit/4c8ae763bcf83c9068d57a5d9f570690a581b6d6(针对 ISC DHCP 4.3.1)获得;我还没有添加路线的脚本(还没有),但是contrib一旦我写好它,我可能会将它添加到该分支下。

附录:事实证明,需要进一步修改以允许再次删除路由;现在已添加到client-address-data-expression分支中,以及一个小的 Ruby 脚本,展示了如何将它们组合在一起。


Bil*_*hor 1

进行前缀委托的程序是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 均选择委托同一子网。

家用即插即用路由器只需使用默认的私有地址块。当按照图表所示进行配置时,它们很快就会崩溃。混合具有不同默认地址块的路由器可能会起作用。否则,您需要确保每个路由器都有不同的地址块。