Add support for ipv6-reverse

This commit is contained in:
2026-01-18 21:32:50 +01:00
parent bd6052104c
commit 8377f369f1
3 changed files with 94 additions and 4 deletions
+7 -3
View File
@@ -5,9 +5,10 @@ in
{
# Note: See ./README.md for usage
# Hosts specified here will be included in the default/general DNS setup, with records in
# - pvv.org
# - pvv.ntnu.no
# - pvv.org.
# - pvv.ntnu.no.
# - 210.241.129.in-addr.arpa. (reverse-ipv4, where applicable)
# - 9.1.0.0.3.0.0.0.7.0.1.0.0.2.ip6.arpa. (reverse-ipv6, where applicable)
# Terminaler
demiurgen = {
@@ -27,7 +28,10 @@ in
# PVV-DNS code stress-testing:
utenipv4 = {
ipv6 = pvvv6 1337;
ipv6 = [
(pvvv6 1337)
(pvvv6 "cafe:babe")
];
};
utenipv6 = {
+1 -1
View File
@@ -15,7 +15,7 @@ let
"pvv.org" = ./zones/pvv.org.nix;
"210.241.129.in-addr.arpa" = ./zones/reverse-ipv4-parent.nix;
"128-255.210.241.129.in-addr.arpa" = ./zones/reverse-ipv4.nix;
#"reverse-ipv6" = ./zones/reverse-ipv6.nix;
"9.1.0.0.3.0.0.0.7.0.1.0.0.2.ip6.arpa" = ./zones/reverse-ipv6.nix;
};
in
stdenvNoCC.mkDerivation {
+86
View File
@@ -0,0 +1,86 @@
{ dns, lib, ... }:
with dns.lib.combinators;
let
pvvv6Prefix = builtins.substring 0 14 (normalizev6 "2001:700:300:1900::");
domainSuffix = ".pvv.ntnu.no.";
# Pad a number or string with zeroes to length 4 (32 -> "0032")
padTo4 =
n:
let
padded = "0000${toString n}";
in
builtins.substring (builtins.stringLength padded - 4) 4 padded;
# Takes an IPv6 address on the format nnnnXXXXnnnn (literal XXXX) and replaces XXXX with enough zeroes to make a full 128 bit address
padDoubleColon =
addr:
let
parts = lib.splitString "XXXX" addr;
nibbleCount = builtins.foldl' builtins.add 0 (map builtins.stringLength parts);
zeros = lib.concatStrings (builtins.genList (i: "0") (32 - nibbleCount));
in
lib.replaceStrings [ "XXXX" ] [ zeros ] addr;
# Translate an IPv6 address (e.g. 2001:700:300:1900::1) into the fully expanded 20010700030019000000000000000001
normalizev6 =
addr:
(lib.pipe addr [
(lib.replaceStrings [ "::" ] [ ":XXXX:" ])
(lib.splitString ":")
(map padTo4)
(map (lib.splitString ""))
(lib.flatten)
(lib.concatStrings)
(padDoubleColon)
]);
# Translate an address from the form 20010700030019000000000000000001 to the prefix-stripped, reversed and dotted form
# 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 as used in a PTR record
ptrFormatv6 =
addr:
(lib.pipe addr [
(lib.removePrefix pvvv6Prefix)
(lib.splitString "")
(lib.flatten)
(lib.filter (n: n != ""))
(lib.reverseList)
(lib.concatStringsSep ".")
]);
pvvHostRecords = import ../pvv-subdomains.nix { inherit dns lib; };
# Find all the AAAA-records pointing into the PVV-network, and generate the opposing PTR records
# TODO: Handle duplicates?
pvvHostReverseRecords = builtins.listToAttrs (
lib.concatLists (
lib.mapAttrsToList (
target: host:
lib.map (aaaaRecordKey: {
name = ptrFormatv6 aaaaRecordKey;
value.PTR = [ (target + domainSuffix) ];
}) (lib.filter (e: lib.hasPrefix pvvv6Prefix e) (map normalizev6 (host.AAAA or [ ])))
) pvvHostRecords
)
);
additionalReverseRecords = {
"1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0".PTR = [ "hb-gw4.ntnu.no." ]; # Gateway router/switch
};
in
{
useOrigin = true; # Don't output fully qualified names
SOA = {
nameServer = "dvask.pvv.ntnu.no";
adminEmail = "drift@pvv.ntnu.no";
serial = 2025021701; # TODO: Automate
};
NS = [
"dvask.pvv.ntnu.no"
"nn.unintett.no"
];
subdomains = pvvHostReverseRecords // additionalReverseRecords;
}