nixos/home: Anchor static hi clients' DNS on VIPs
Statically-addressed home servers on hi run no DHCP, so they learned a resolver only from the v6 RA RDNSS and lost DNS whenever v6 (and thus the RA) was absent. Factor the fix castle/palace applied inline into a shared lib.my.c.home.vlanDns helper that points resolved at the VLAN's VRRP VIPs (always-present static v4, plus v6 when up) and sets the advertised search domains, then apply it to every statically-addressed hi client: castle, palace, cellar, sfh and the sfh hass/unifi containers. Document it under the router client DNS section. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -321,6 +321,12 @@ family move together.
|
|||||||
serving disjoint pool halves. `radvd` advertises the v6 VIP as RDNSS (`untrusted` gets Cloudflare)
|
serving disjoint pool halves. `radvd` advertises the v6 VIP as RDNSS (`untrusted` gets Cloudflare)
|
||||||
and keepalived's `notify_master`/`notify_backup` hooks ensure that only the master sends RAs.
|
and keepalived's `notify_master`/`notify_backup` hooks ensure that only the master sends RAs.
|
||||||
|
|
||||||
|
Statically-addressed boxes (the servers on `hi`) don't run DHCP, so they'd otherwise learn a
|
||||||
|
resolver only from the v6 RA RDNSS — which vanishes when v6 is disabled, taking DNS with it. They
|
||||||
|
instead anchor DNS on the VIPs via the shared `lib.my.c.home.vlanDns "<vlan>"` fragment, which sets
|
||||||
|
`DNS` to `vips.<vlan>.{v4,v6}` and `Domains` to the advertised search list; the always-present
|
||||||
|
static v4 VIP keeps resolution working even with v6 down.
|
||||||
|
|
||||||
#### DNS binding
|
#### DNS binding
|
||||||
|
|
||||||
`pdns-recursor` binds the VIPs directly; see
|
`pdns-recursor` binds the VIPs directly; see
|
||||||
|
|||||||
@@ -385,6 +385,16 @@ rec {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# networkConfig fragment anchoring a VLAN client's DNS on the router pair's
|
||||||
|
# VRRP VIPs rather than the RA RDNSS. v6 addresses here are RA/token-derived,
|
||||||
|
# so when RA is absent (e.g. v6 disabled) there is no v6 and no RDNSS at all;
|
||||||
|
# the always-present static v4 VIP keeps name resolution working, with the v6
|
||||||
|
# VIP as a bonus when v6 is up. Merge into the VLAN network's networkConfig.
|
||||||
|
vlanDns = vlan: {
|
||||||
|
DNS = [ vips.${vlan}.v4 vips.${vlan}.v6 ];
|
||||||
|
Domains = searchDomains;
|
||||||
|
};
|
||||||
|
|
||||||
roceBootModules = [ "ib_core" "ib_uverbs" "mlx5_core" "mlx5_ib" ];
|
roceBootModules = [ "ib_core" "ib_uverbs" "mlx5_core" "mlx5_ib" ];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
let
|
let
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.c) networkd;
|
inherit (lib.my.c) networkd;
|
||||||
inherit (lib.my.c.home) domain searchDomains vlans prefixes vips roceBootModules;
|
inherit (lib.my.c.home) domain vlans prefixes vips vlanDns roceBootModules;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
nixos.systems.castle = {
|
nixos.systems.castle = {
|
||||||
@@ -190,11 +190,7 @@ in
|
|||||||
"40-lan-hi" = mkMerge [
|
"40-lan-hi" = mkMerge [
|
||||||
(networkdAssignment "lan-hi" assignments.hi)
|
(networkdAssignment "lan-hi" assignments.hi)
|
||||||
{
|
{
|
||||||
networkConfig = {
|
networkConfig = vlanDns "hi" // {
|
||||||
# v6 is RA/SLAAC-derived, so when RA is absent we have no v6 at all;
|
|
||||||
# anchor DNS on the always-present static v4 (the VRRP VIP follows the master)
|
|
||||||
DNS = [ vips.hi.v4 vips.hi.v6 ];
|
|
||||||
Domains = searchDomains;
|
|
||||||
# So we don't drop the IP we use to connect to NVMe-oF!
|
# So we don't drop the IP we use to connect to NVMe-oF!
|
||||||
KeepConfiguration = "static";
|
KeepConfiguration = "static";
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
let
|
let
|
||||||
inherit (lib.my) net mkVLAN;
|
inherit (lib.my) net mkVLAN;
|
||||||
inherit (lib.my.c) pubDomain;
|
inherit (lib.my.c) pubDomain;
|
||||||
inherit (lib.my.c.home) domain vlans prefixes vips hiMTU;
|
inherit (lib.my.c.home) domain vlans prefixes vips vlanDns hiMTU;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ ./vms ];
|
imports = [ ./vms ];
|
||||||
@@ -203,7 +203,10 @@ in
|
|||||||
MACAddress=52:54:00:90:34:95
|
MACAddress=52:54:00:90:34:95
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
"60-lan-hi" = networkdAssignment "lan-hi" assignments.hi;
|
"60-lan-hi" = mkMerge [
|
||||||
|
(networkdAssignment "lan-hi" assignments.hi)
|
||||||
|
{ networkConfig = vlanDns "hi"; }
|
||||||
|
];
|
||||||
|
|
||||||
"50-lan-core-phy" = {
|
"50-lan-core-phy" = {
|
||||||
matchConfig.Name = "lan-core-phy";
|
matchConfig.Name = "lan-core-phy";
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
let
|
let
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.c) pubDomain;
|
inherit (lib.my.c) pubDomain;
|
||||||
inherit (lib.my.c.home) domain prefixes vips hiMTU;
|
inherit (lib.my.c.home) domain prefixes vips vlanDns hiMTU;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
nixos.systems.cellar = {
|
nixos.systems.cellar = {
|
||||||
@@ -79,7 +79,10 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
networks = {
|
networks = {
|
||||||
"80-lan-hi" = networkdAssignment "lan-hi" assignments.hi;
|
"80-lan-hi" = mkMerge [
|
||||||
|
(networkdAssignment "lan-hi" assignments.hi)
|
||||||
|
{ networkConfig = vlanDns "hi"; }
|
||||||
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
let
|
let
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.c) pubDomain;
|
inherit (lib.my.c) pubDomain;
|
||||||
inherit (lib.my.c.home) domain prefixes vips hiMTU;
|
inherit (lib.my.c.home) domain prefixes vips vlanDns hiMTU;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
nixos.systems.hass = { config, ... }: {
|
nixos.systems.hass = { config, ... }: {
|
||||||
@@ -82,7 +82,10 @@ in
|
|||||||
|
|
||||||
systemd = {
|
systemd = {
|
||||||
network.networks = {
|
network.networks = {
|
||||||
"80-container-host0" = networkdAssignment "host0" assignments.hi;
|
"80-container-host0" = mkMerge [
|
||||||
|
(networkdAssignment "host0" assignments.hi)
|
||||||
|
{ networkConfig = vlanDns "hi"; }
|
||||||
|
];
|
||||||
"80-container-lan-lo" = networkdAssignment "lan-lo" assignments.lo;
|
"80-container-lan-lo" = networkdAssignment "lan-lo" assignments.lo;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.c.home) domain prefixes vips hiMTU;
|
inherit (lib.my.c.home) domain prefixes vips vlanDns hiMTU;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
nixos.systems.unifi = { config, ... }: {
|
nixos.systems.unifi = { config, ... }: {
|
||||||
@@ -58,7 +58,10 @@ in
|
|||||||
|
|
||||||
systemd = {
|
systemd = {
|
||||||
network.networks = {
|
network.networks = {
|
||||||
"80-container-host0" = networkdAssignment "host0" assignments.hi;
|
"80-container-host0" = mkMerge [
|
||||||
|
(networkdAssignment "host0" assignments.hi)
|
||||||
|
{ networkConfig = vlanDns "hi"; }
|
||||||
|
];
|
||||||
"80-lan-core" = networkdAssignment "lan-core" assignments.core;
|
"80-lan-core" = networkdAssignment "lan-core" assignments.core;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.c.home) domain prefixes vips hiMTU roceBootModules;
|
inherit (lib.my.c.home) domain prefixes vips vlanDns hiMTU roceBootModules;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ ./containers ];
|
imports = [ ./containers ];
|
||||||
@@ -134,8 +134,10 @@ in
|
|||||||
networks = {
|
networks = {
|
||||||
"30-lan-hi" = mkMerge [
|
"30-lan-hi" = mkMerge [
|
||||||
(networkdAssignment "lan-hi" assignments.hi)
|
(networkdAssignment "lan-hi" assignments.hi)
|
||||||
|
{
|
||||||
# So we don't drop the IP we use to connect to NVMe-oF!
|
# So we don't drop the IP we use to connect to NVMe-oF!
|
||||||
{ networkConfig.KeepConfiguration = "static"; }
|
networkConfig = vlanDns "hi" // { KeepConfiguration = "static"; };
|
||||||
|
}
|
||||||
];
|
];
|
||||||
"30-lan-hi-ctrs" = {
|
"30-lan-hi-ctrs" = {
|
||||||
matchConfig.Name = "lan-hi-ctrs";
|
matchConfig.Name = "lan-hi-ctrs";
|
||||||
|
|||||||
Reference in New Issue
Block a user