语境
我目前正忙于用我放置在周围的一台旧的无风扇、无头 Intel Atom/ITX 计算机构建一个互联网网关。这些是我的要求:
- 将我的 ISP 的 DCHP 提供的 ipv4 和 ipv6 ip 分配给面向互联网的接口
- 接收我的 ISP 的 DHCP 提供的 ipv6 前缀。
- 有一个面向局域网的静态私有 IPv4 ip。
- 在面向局域网的接口上有 IPv4 DHCP 服务器。
<prefix>::1/64
在面向局域网的接口上设置 IPv6 ip- 有一个 DHCPv6 服务器在我的 ISP 向 LAN 客户端提供的前缀内提供地址的状态分配。
- 必须能够在面向局域网和面向广域网的接口上断开连接和重新连接。
- 必须充当网络设备:除安全更新外无需维护。
我想使用有状态 DHCPv6 而不是无状态 DHCP 或 SLAAC,因为我将设置由我的新网关管理的 DDNS 以及半径和其他一些可能性...其中一些将用于确定 ip 客户端结束跟上。
我目前的一切都在 ipv4 方面工作。有规律的。网关本身具有与 Internet 的功能齐全的双栈连接,并且可以通过 ipv4 和 ipv6 访问资源。我还为 ipv4 和 ipv6 实现了基于 netfilter 的防火墙。我什至为局域网分配了一个静态私有 ipv4 地址和一个<prefix>::1/64
地址。我可以通过 DHCP 为我的局域网上的客户端提供 ipv4 地址、dns、域、网关和所有其他内容。ifplugd 提供了对断开连接和重新连接的恢复能力。
问题
我不能做的是通过 DHCP 向客户端提供范围内的有状态IPv6 地址。<prefix>::0/64
我坚持 dhcpd 需要我在其配置文件中设置静态名称服务器、静态网关和静态前缀的现实……但所有这些都是根据我的 ISP 给出的前缀动态分配的。我现在已经多次浏览 dhcpd.conf 手册页,但我没有看到任何提供动态分配这些的方法。dhcpcd 以二进制格式存储它的租约数据并没有帮助。我找到了一种可行的方法来查询 dhcpcd 的租约数据,所以这不再是问题了。
我的下一步是编写我已经编写了一些脚本/systemd 单元来管理从 dhcpcd 查询我需要的数据并(重新)使用适当的标志启动 dhcpd(将很快添加为答案)。但这很笨拙,我担心它可能会以即插即用单元的所有方式出现问题。如果稍后我必须通过 ssh 进入我的网关来修复某些问题……这意味着我失败了。
我的问题:
我只是在这里错过了显而易见的事情吗?如果是这样,我错过了什么?如果我再花 48 小时浏览手册页和 RFC 文档……那么它就会被遗漏。- WIDE 或其他一体化 DCHP 客户端/服务器能否实现我的远大目标(半径、服务器管理的 DDNS 等)?
我可以为不同子网中的网关 ip 使用链接本地或私有 ip 吗?就像...可以是的......但它并没有完全解决我的问题。fd41:2a0d:e8e4:0::1
是作为子网的路由器选项发送的条目,26AA:A4A4:300:22AF::/64
如果所有客户端都具有该子网和fd41:2a0d:e8e4:0::/64
子网的 ips?我已经读过,由于我的问题,使用服务器的本地链接 IP 优于全局可路由 IP……但是在子网之外设置网关 IP 的想法似乎是错误的。
PS在有人问之前,我开始尝试在 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
所以,我说下一步是编写脚本。好吧,他们来了。
解释一下,我提出的解决方案有两个主要部分。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 似乎压制了钩子脚本中的所有标准错误和标准输出。我不喜欢这个解决方案。我不会将其标记为可接受的解决方案。我付出了很多努力使它尽可能坚固,但它仍然感觉有太多潜在的故障点。目前,它正在完成工作。我仍然觉得必须有更好的方法。
更新 - 8 个月后:
嗯,看来我错了。我创建的脚本已被证明非常可靠。八个月,没有一次打嗝。脚本也变得更加健壮,删除了一些潜在的极端情况,更新许多不同的配置文件的能力,以及用于跟踪当前状态的简单 json 状态文件。鉴于此时此解决方案的可靠性和稳健性,我将继续接受这个答案。我可能会
envsubst
在未来研究使用类似工具的改进。