语境
我目前正忙于用我闲置的一台旧的无风扇、无头 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::/64
fd41: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
未来的工具的改进。