我正在尝试配置基于 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 路由器的链路本地地址,一切就开始正常工作。
我的问题:
- 我如何配置我的 DIY 路由器来自动执行这最后一步?(我试图在
accept_ra
,accept_ra_defrtr
以及router_solicitations
sysctl 的net.ipv6.conf
下方all
和各个接口部分中输入不同的值,但没有看到行为上的差异。) - 我可以使用 Linux 上的其他(开源)软件以更简化的方式实现我想要的目标吗?我的意思是,当我的 ISP 为我分配不同的 /56 前缀时,我需要更改 DHCP 配置文件以使用该前缀。如果没有软件支持我的用例,我可以(并且会)编写一个脚本来解决这个问题,但这样做似乎很脆弱。