如何使用 Linux 正确地将 DHCPv6-PD 实现到下游路由器?

如何使用 Linux 正确地将 DHCPv6-PD 实现到下游路由器?

我正在尝试配置基于 DIY Linux 的 IPv6 路由器/防火墙来执行以下操作:

  • 从接口“wan0”上的 ISP 获取 /56 前缀
  • 为“lan1”上的主机提供 /64 地址
  • 为“lan2”上的下游路由器提供 /60 子网

我最初选择的执行此操作的软件是 systemd-networkd,使用它可以轻松完成前两项,但第三项不受支持(显然,如果我错了,请纠正我)。

我改用了DHCP服务器动态主机配置协议電視(通过 Arch Linux 提供的软件包,但我认为与上游软件应该没有任何有意义的区别)。

dhcpcd 已配置为获取该 /56 并分配地址:

duid
persistent
vendorclassid
option domain_name_servers, domain_name, domain_search
option classless_static_routes
option interface_mtu
option host_name
option rapid_commit
require dhcp_server_identifier
slaac private
noipv4ll
waitip 6
waitip 4
interface wan0
    ipv6rs
    ia_na 1
    ia_pd 1/::/56 lan1/0/64 lan2/2/60
interface lan1
    noipv6rs
    static ip_address=172.21.0.1
interface lan2
    static ip_address=172.22.0.1

这会导致接口根据 ISP 的配置获取地址,这似乎是正确的。

DHCP 已配置为进一步通告下游地址和子网:

default-lease-time 2592000;
preferred-lifetime 604800;
option dhcp-renewal-time 3600;
option dhcp-rebinding-time 7200;
allow leasequery;
dhcpv6-lease-file-name "/var/lib/dhcp/dhcpd6.leases";

subnet6 2XXX:YYYY:ZZZZ:dd00::/64 {
  range6 2XXX:YYYY:ZZZZ:dd00::2 2XXX:YYYY:ZZZZ:dd00:ffff:ffff:ffff:ffff;
}
subnet6 2XXX:YYYY:ZZZZ:dd20::/60 {
  prefix6 2XXX:YYYY:ZZZZ:dd20:: 2XXX:YYYY:ZZZZ:dd20:: /60;
  range6 2XXX:YYYY:ZZZZ:dd20::2 2XXX:YYYY:ZZZZ:dd20::ffff;
}

这似乎也是正确的,因为这些范围和子网最终被“lan1”上的下游主机和“lan2”上的下游路由器使用。

最初,上述信息是通过以下 radvd 配置公布的:

interface lan1 {
    AdvManagedFlag off;
    AdvOtherConfigFlag off;
    AdvSendAdvert on;
    AdvDefaultPreference high;
    prefix ::/64 {
        AdvOnLink on;
        AdvAutonomous on;
    };
};

interface lan2 {
    AdvManagedFlag off;
    AdvOtherConfigFlag off;
    AdvSendAdvert on;
    AdvDefaultPreference high;
    route ::/60 {
    };
};

然后,我用更简单的代码替换了后面的界面节:interface lan2 { };我认为这样效果更好(或者可能相同,但无论如何要短得多)。

从主机和路由器实际配置其接口的意义上来说,这似乎也是正确的。

然而,所有这些配置都未能完成一件至关重要的事情:路由设置不正确。在这个 DIY 路由器上,路由如下所示:

$ ip -6 r
::1 dev lo proto kernel metric 256 pref medium
2XXX:YYYY:ZZZZ:dd00::/64 dev lan1 proto dhcp metric 1003 pref medium
2XXX:YYYY:ZZZZ:dd20::/60 dev lan2 proto dhcp metric 1004 pref medium
unreachable 2XXX:YYYY:ZZZZ:dd00::/56 dev lo proto dhcp metric 1001 pref medium
fe80::/64 dev lan2 proto kernel metric 256 pref medium
fe80::/64 dev wan0 proto kernel metric 256 pref medium
fe80::/64 dev lan1 proto kernel metric 256 pref medium
default via fe80::AAAA:BBBB:CCCC:DDDD dev wan0 proto ra metric 1002 mtu 1500 pref medium

如果我手动添加(使用较小的度量)或替换与 /60 子网相关的路由,如下所示:ip -6 r replace 2XXX:YYYY:ZZZZ:dd20::/60 via fe80::DOWN:STRE:AMRO:UTER dev lan2在下游路由器上反之亦然,使用 DIY 路由器的链路本地地址,一切就开始正常工作。

我的问题:

  1. 我如何配置我的 DIY 路由器来自动执行这最后一步?(我试图在accept_raaccept_ra_defrtr以及router_solicitationssysctl 的net.ipv6.conf下方all和各个接口部分中输入不同的值,但没有看到行为上的差异。)
  2. 我可以使用 Linux 上的其他(开源)软件以更简化的方式实现我想要的目标吗?我的意思是,当我的 ISP 为我分配不同的 /56 前缀时,我需要更改 DHCP 配置文件以使用该前缀。如果没有软件支持我的用例,我可以(并且会)编写一个脚本来解决这个问题,但这样做似乎很脆弱。

相关内容