WAN 侧的 DHCP-PD,LAN 侧有状态 DHCPv6 分配的全局可路由 ip。需要在lan侧动态配置DHCPv6

WAN 侧的 DHCP-PD,LAN 侧有状态 DHCPv6 分配的全局可路由 ip。需要在lan侧动态配置DHCPv6

语境

我目前正忙于用我闲置的一台旧的无风扇、无头 Intel Atom/ITX 计算机构建一个互联网网关。这些是我的要求:

  • 将 ISP 的 DCHP 提供的 ipv4 和 ipv6 IP 分配给面向互联网的接口
  • 接收我的 ISP 的 DHCP 提供的 ipv6 前缀。
  • 有一个面向 LAN 的静态私有 IPv4 IP。
  • 在面向 LAN 的接口上有 IPv4 DHCP 服务器。
  • <prefix>::1/64在面向 LAN 的接口上设置 IPv6 IP
  • 有一个 DHCPv6 服务器提供有状态的将 ISP 提供的前缀内的地址分配给 LAN 客户端。
  • 必须能够适应 LAN 和 WAN 接口上的断开和重新连接。
  • 必须充当网络设备:除了安全更新之外无需维护。

我想使用有状态 DHCPv6 而不是无状态 DHCP 或 SLAAC,因为我将设置由我的新网关以及 radius 和其他一些可能性管理的 DDNS...其中一些将用于确定 ip 客户端结束跟上。

我目前在 ipv4 方面一切正常。有规律的。网关本身具有功能齐全的双栈互联网连接,可以通过 ipv4 和 ipv6 访问资源。我还为 ipv4 和 ipv6 实现了基于 netfilter 的防火墙。我什至已经为 LAN 端分配了一个静态私有 ipv4 地址和一个<prefix>::1/64地址。我可以通过 DHCP 为局域网上的客户端提供 ipv4 地址、dns、域、网关以及所有其他信息。 ifplugd 提供了对断开连接和重新连接的恢复能力。

问题

我不能做的是提供有状态的<prefix>::0/64通过 DHCP 发送给客户端的IPv6 地址范围。我被现实困住了,dhcpd 需要我在它的配置文件中设置静态名称服务器、静态网关和静态前缀……然而所有这些都是根据我的 ISP 给出的前缀动态分配的。我已经多次浏览 dhcpd.conf 联机帮助页,但没有看到任何内容提供动态分配这些内容的方法。dhcpcd 以二进制格式存储其租约数据并没有帮助。我找到了一种可行的方法来查询 dhcpcd 的租赁数据,所以这不再是问题了。

我的下一步是写我已经编写了一些脚本/systemd 单元来管理从 dhcpcd 查询我需要的数据,并使用适当的标志(重新)启动 dhcpd (很快将添加为答案)。但这很笨重,我担心它可能会在即插即用装置上出现各种奇怪的情况。如果我稍后必须通过 ssh 进入我的网关来修复某些问题......这意味着我失败了。

我的问题:

  • 我只是错过了这里显而易见的事情吗?如果是这样,我错过了什么?如果我又花了 48 小时翻阅手册页和 RFC 文档……那么它就会被错过。
  • WIDE 或其他一体式 DCHP 客户端/服务器能否实现我的崇高目标(半径、服务器管理的 DDNS 等)?
  • 我可以在不同子网中使用链接本地或私有 IP 作为网关 IP 吗?就像...如果所有客户端都具有该子网和该子网的 ip ,则该条目是否可以fd41:2a0d:e8e4:0::1作为子网的路由器选项发送?我读过,由于我的问题,使用服务器的本地链接 ip 优于全局可路由的 ip...但是在其所在子网之外设置网关 ip 的想法似乎是错误的。26AA:A4A4:300:22AF::/64fd41:2a0d:e8e4:0::/64是的...但这并不能完全解决我的问题。

聚苯乙烯在有人问之前,我开始尝试在 wan 端使用 dhclient(坚持使用用于 dns/dhcp 的 ISC 工具),但它不想在同一接口上解析 ipv6 和 ipv4,并且不允许我查询 v6 ip 和 v6 前缀同时存在。可能是我的错...但结果我放弃并改用 dhcpcd。

配置文件

radvd.conf:

interface lan {
    AdvManagedFlag on;
    AdvSendAdvert on;
    #AdvAutonomous off;
    AdvOtherConfigFlag on;
    IgnoreIfMissing on;
    AdvDefaultPreference high;
    MaxRtrAdvInterval 60;
};

dhcpcd.conf:

hostname
duid
persistent
option rapid_commit
option classless_static_routes
option interface_mtu
require dhcp_server_identifier
noipv6rs
waitip 6
waitip 4
denyinterfaces lan

interface wan
ipv4
ipv6
dhcp
dhcp6
ipv6rs
ia_na 1
#ia_pd 2 lan
ia_pd 2/::/64 lan/0/64

答案1

所以,我说下一步就是写脚本。出色地,他们来了

解释一下,我提出的解决方案有两个主要部分。 dhcpd.conf 文件的模板。还有一个脚本,用于从 dhcpcd 查询所需数据,解析它,将其应用到模板,将结果另存为/var/local/dhcpd6-lan.conf,然后重新启动 dhcpd 以使用新设置。

该脚本利用 dhcpcd 的 run-hooks 功能。基本上,当 dhcpcd 执行任何操作(包括接收来自上游的响应)时,它会/etc/dhcpcd.exit-hook使用设置为相关 dhcp 配置选项值的各种环境变量来运行。我只是DELEGATED6为 dhcpcd 从 ipv6 前缀响应分配 ip 时触发的操作编写了一个钩子。我必须实现自己的日志记录,因为 dhcpcd-run-hooks 似乎会抑制钩子脚本中的所有 stderr 和 stdout。

我不喜欢这个解决方案。我不会将其标记为已接受的解决方案。我已经付出了很多努力让它尽可能坚固,但仍然感觉有太多潜在的故障点。目前,它正在完成工作。我仍然觉得必须有更好的方法。

更新 - 8 个月后:

嗯,看来我错了。事实证明,我创建的脚本非常可靠。八个月了,一点儿毛病都没有。这些脚本也变得更加健壮,删除了一些潜在的极端情况,能够更新许多不同的配置文件,以及用于跟踪当前状态的简单 json 状态文件。鉴于此时此解决方案的可靠性和稳健性,我将继续并接受这个答案。我可能会研究类似envsubst未来的工具的改进。

相关内容