Compare commits
5 Commits
4624480c8b
...
490413c24b
Author | SHA1 | Date | |
---|---|---|---|
490413c24b | |||
9cec5051bf | |||
70f49c8438 | |||
8b0db3ac7f | |||
cc07964fac |
@ -10,12 +10,14 @@ rec {
|
|||||||
gitea-runner = 401;
|
gitea-runner = 401;
|
||||||
jellyseerr = 402;
|
jellyseerr = 402;
|
||||||
atticd = 403;
|
atticd = 403;
|
||||||
|
kea = 404;
|
||||||
};
|
};
|
||||||
gids = {
|
gids = {
|
||||||
matrix-syncv3 = 400;
|
matrix-syncv3 = 400;
|
||||||
gitea-runner = 401;
|
gitea-runner = 401;
|
||||||
jellyseerr = 402;
|
jellyseerr = 402;
|
||||||
atticd = 403;
|
atticd = 403;
|
||||||
|
kea = 404;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -180,14 +182,17 @@ rec {
|
|||||||
hi = {
|
hi = {
|
||||||
v4 = subnet 4 1 all.v4;
|
v4 = subnet 4 1 all.v4;
|
||||||
v6 = subnet 4 1 all.v6;
|
v6 = subnet 4 1 all.v6;
|
||||||
|
mtu = hiMTU;
|
||||||
};
|
};
|
||||||
lo = {
|
lo = {
|
||||||
v4 = subnet 3 1 all.v4;
|
v4 = subnet 3 1 all.v4;
|
||||||
v6 = subnet 4 2 all.v6;
|
v6 = subnet 4 2 all.v6;
|
||||||
|
mtu = 1500;
|
||||||
};
|
};
|
||||||
untrusted = {
|
untrusted = {
|
||||||
v4 = subnet 6 16 all.v4;
|
v4 = subnet 6 16 all.v4;
|
||||||
v6 = subnet 4 3 all.v6;
|
v6 = subnet 4 3 all.v6;
|
||||||
|
mtu = 1500;
|
||||||
};
|
};
|
||||||
inherit (colony.prefixes) as211024;
|
inherit (colony.prefixes) as211024;
|
||||||
};
|
};
|
||||||
|
@ -4,7 +4,7 @@ let
|
|||||||
inherit (lib)
|
inherit (lib)
|
||||||
genAttrs mapAttrsToList filterAttrsRecursive nameValuePair types
|
genAttrs mapAttrsToList filterAttrsRecursive nameValuePair types
|
||||||
mkOption mkOverride mkForce mkIf mergeEqualOption optional
|
mkOption mkOverride mkForce mkIf mergeEqualOption optional
|
||||||
showWarnings concatStringsSep flatten unique;
|
showWarnings concatStringsSep flatten unique optionalAttrs;
|
||||||
inherit (lib.flake) defaultSystems;
|
inherit (lib.flake) defaultSystems;
|
||||||
in
|
in
|
||||||
rec {
|
rec {
|
||||||
@ -152,6 +152,9 @@ rec {
|
|||||||
LLDP = true;
|
LLDP = true;
|
||||||
EmitLLDP = "customer-bridge";
|
EmitLLDP = "customer-bridge";
|
||||||
};
|
};
|
||||||
|
linkConfig = optionalAttrs (a.mtu != null) {
|
||||||
|
MTUBytes = toString a.mtu;
|
||||||
|
};
|
||||||
ipv6AcceptRAConfig = {
|
ipv6AcceptRAConfig = {
|
||||||
Token = mkIf (a.ipv6.iid != null) "static:${a.ipv6.iid}";
|
Token = mkIf (a.ipv6.iid != null) "static:${a.ipv6.iid}";
|
||||||
UseDNS = true;
|
UseDNS = true;
|
||||||
|
@ -17,13 +17,9 @@ in
|
|||||||
mask = 22;
|
mask = 22;
|
||||||
gateway = null;
|
gateway = null;
|
||||||
};
|
};
|
||||||
};
|
ipv6 = {
|
||||||
lo = {
|
iid = "::3:1";
|
||||||
inherit domain;
|
address = net.cidr.host (65536*3+1) prefixes.hi.v6;
|
||||||
ipv4 = {
|
|
||||||
address = net.cidr.host 40 prefixes.lo.v4;
|
|
||||||
mask = 21;
|
|
||||||
gateway = null;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -108,7 +104,13 @@ in
|
|||||||
blueman.enable = true;
|
blueman.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
programs.virt-manager.enable = true;
|
programs = {
|
||||||
|
virt-manager.enable = true;
|
||||||
|
wireshark = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.wireshark-qt;
|
||||||
|
};
|
||||||
|
};
|
||||||
virtualisation.libvirtd.enable = true;
|
virtualisation.libvirtd.enable = true;
|
||||||
|
|
||||||
networking = {
|
networking = {
|
||||||
@ -147,7 +149,6 @@ in
|
|||||||
wait-online.enable = false;
|
wait-online.enable = false;
|
||||||
netdevs = mkMerge [
|
netdevs = mkMerge [
|
||||||
(mkVLAN "lan-hi" vlans.hi)
|
(mkVLAN "lan-hi" vlans.hi)
|
||||||
(mkVLAN "lan-lo" vlans.lo)
|
|
||||||
];
|
];
|
||||||
links = {
|
links = {
|
||||||
"10-et2.5g" = {
|
"10-et2.5g" = {
|
||||||
@ -169,28 +170,23 @@ in
|
|||||||
networks = {
|
networks = {
|
||||||
"50-lan" = {
|
"50-lan" = {
|
||||||
matchConfig.Name = "et2.5g";
|
matchConfig.Name = "et2.5g";
|
||||||
DHCP = "yes";
|
DHCP = "no";
|
||||||
|
address = [ "10.16.7.1/16" ];
|
||||||
};
|
};
|
||||||
|
|
||||||
"50-et100g" = {
|
"50-et100g" = {
|
||||||
matchConfig.Name = "et100g";
|
matchConfig.Name = "et100g";
|
||||||
vlan = [ "lan-hi" "lan-lo" ];
|
vlan = [ "lan-hi" ];
|
||||||
networkConfig.IPv6AcceptRA = false;
|
networkConfig.IPv6AcceptRA = false;
|
||||||
};
|
};
|
||||||
"60-lan-hi" = mkMerge [
|
"60-lan-hi" = mkMerge [
|
||||||
(networkdAssignment "lan-hi" assignments.hi)
|
(networkdAssignment "lan-hi" assignments.hi)
|
||||||
{
|
{
|
||||||
|
DHCP = "yes";
|
||||||
matchConfig.Name = "lan-hi";
|
matchConfig.Name = "lan-hi";
|
||||||
linkConfig.MTUBytes = "9000";
|
linkConfig.MTUBytes = "9000";
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
"60-lan-lo" = mkMerge [
|
|
||||||
(networkdAssignment "lan-lo" assignments.lo)
|
|
||||||
{
|
|
||||||
matchConfig.Name = "lan-lo";
|
|
||||||
linkConfig.MTUBytes = "1500";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -204,14 +204,15 @@ in
|
|||||||
neighbor 2001:7f8:10f::1b1b:154 as 6939;
|
neighbor 2001:7f8:10f::1b1b:154 as 6939;
|
||||||
}
|
}
|
||||||
|
|
||||||
protocol bgp upstream4_fogixp_efero from upstream_bgp4 {
|
# Not working so well lately...
|
||||||
description "efero transit (on FogIXP, IPv4)";
|
# protocol bgp upstream4_fogixp_efero from upstream_bgp4 {
|
||||||
neighbor 185.1.147.107 as 208431;
|
# description "efero transit (on FogIXP, IPv4)";
|
||||||
}
|
# neighbor 185.1.147.107 as 208431;
|
||||||
protocol bgp upstream6_fogixp_efero from upstream_bgp6 {
|
# }
|
||||||
description "efero transit (on FogIXP, IPv6)";
|
# protocol bgp upstream6_fogixp_efero from upstream_bgp6 {
|
||||||
neighbor 2001:7f8:ca:1::107 as 208431;
|
# description "efero transit (on FogIXP, IPv6)";
|
||||||
}
|
# neighbor 2001:7f8:ca:1::107 as 208431;
|
||||||
|
# }
|
||||||
|
|
||||||
protocol bgp peer4_cc_luje from peer_bgp4 {
|
protocol bgp peer4_cc_luje from peer_bgp4 {
|
||||||
description "LUJE.net (on ColoClue, IPv4)";
|
description "LUJE.net (on ColoClue, IPv4)";
|
||||||
|
@ -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;
|
inherit (lib.my.c.home) domain vlans prefixes vips hiMTU;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ ./vms ];
|
imports = [ ./vms ];
|
||||||
@ -15,15 +15,21 @@ in
|
|||||||
assignments = {
|
assignments = {
|
||||||
hi = {
|
hi = {
|
||||||
inherit domain;
|
inherit domain;
|
||||||
|
mtu = hiMTU;
|
||||||
ipv4 = {
|
ipv4 = {
|
||||||
address = net.cidr.host 22 prefixes.hi.v4;
|
address = net.cidr.host 22 prefixes.hi.v4;
|
||||||
mask = 22;
|
mask = 22;
|
||||||
gateway = vips.hi.v4;
|
gateway = vips.hi.v4;
|
||||||
};
|
};
|
||||||
|
ipv6 = {
|
||||||
|
iid = "::2:1";
|
||||||
|
address = net.cidr.host (65536*2+1) prefixes.hi.v6;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
core = {
|
core = {
|
||||||
inherit domain;
|
inherit domain;
|
||||||
name = "palace-core";
|
name = "palace-core";
|
||||||
|
mtu = 1500;
|
||||||
ipv4 = {
|
ipv4 = {
|
||||||
address = net.cidr.host 20 prefixes.core.v4;
|
address = net.cidr.host 20 prefixes.core.v4;
|
||||||
gateway = null;
|
gateway = null;
|
||||||
@ -131,7 +137,7 @@ in
|
|||||||
};
|
};
|
||||||
linkConfig = {
|
linkConfig = {
|
||||||
Name = "et100g";
|
Name = "et100g";
|
||||||
MTUBytes = "9000";
|
MTUBytes = toString hiMTU;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -169,17 +175,7 @@ in
|
|||||||
MACAddress=52:54:00:8a:8a:f2
|
MACAddress=52:54:00:8a:8a:f2
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
"60-lan-hi" = mkMerge [
|
"60-lan-hi" = networkdAssignment "lan-hi" assignments.hi;
|
||||||
(networkdAssignment "lan-hi" assignments.hi)
|
|
||||||
{
|
|
||||||
matchConfig.Name = "lan-hi";
|
|
||||||
linkConfig.MTUBytes = "9000";
|
|
||||||
networkConfig.DNS = [
|
|
||||||
(allAssignments.stream.hi.ipv4.address)
|
|
||||||
# (allAssignments.river.hi.ipv4.address)
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -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;
|
inherit (lib.my.c.home) domain prefixes vips hiMTU;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
nixos.systems.cellar = {
|
nixos.systems.cellar = {
|
||||||
@ -12,11 +12,16 @@ in
|
|||||||
assignments = {
|
assignments = {
|
||||||
hi = {
|
hi = {
|
||||||
inherit domain;
|
inherit domain;
|
||||||
|
mtu = hiMTU;
|
||||||
ipv4 = {
|
ipv4 = {
|
||||||
address = net.cidr.host 80 prefixes.hi.v4;
|
address = net.cidr.host 80 prefixes.hi.v4;
|
||||||
mask = 22;
|
mask = 22;
|
||||||
gateway = vips.hi.v4;
|
gateway = vips.hi.v4;
|
||||||
};
|
};
|
||||||
|
ipv6 = {
|
||||||
|
iid = "::4:1";
|
||||||
|
address = net.cidr.host (65536*4+1) prefixes.hi.v6;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -66,23 +71,12 @@ in
|
|||||||
links = {
|
links = {
|
||||||
"10-lan-hi" = {
|
"10-lan-hi" = {
|
||||||
matchConfig.PermanentMACAddress = "52:54:00:cc:3e:70";
|
matchConfig.PermanentMACAddress = "52:54:00:cc:3e:70";
|
||||||
linkConfig = {
|
linkConfig.Name = "lan-hi";
|
||||||
Name = "lan-hi";
|
|
||||||
MTUBytes = "9000";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
networks = {
|
networks = {
|
||||||
"80-vms" = mkMerge [
|
"80-lan-hi" = networkdAssignment "lan-hi" assignments.hi;
|
||||||
(networkdAssignment "lan-hi" assignments.hi)
|
|
||||||
{
|
|
||||||
networkConfig.DNS = [
|
|
||||||
(allAssignments.stream.hi.ipv4.address)
|
|
||||||
(allAssignments.river.hi.ipv4.address)
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -69,7 +69,8 @@
|
|||||||
in
|
in
|
||||||
{
|
{
|
||||||
requires = [ vtapUnit ];
|
requires = [ vtapUnit ];
|
||||||
after = [ vtapUnit ];
|
after = [ vtapUnit "vm@cellar.service" ];
|
||||||
|
bindsTo = [ "vm@cellar.service" ];
|
||||||
preStart = ''
|
preStart = ''
|
||||||
until ${pkgs.netcat}/bin/nc -w1 -z ${allAssignments.cellar.hi.ipv4.address} 22; do
|
until ${pkgs.netcat}/bin/nc -w1 -z ${allAssignments.cellar.hi.ipv4.address} 22; do
|
||||||
sleep 1
|
sleep 1
|
||||||
|
@ -3,9 +3,10 @@ let
|
|||||||
inherit (builtins) elemAt;
|
inherit (builtins) elemAt;
|
||||||
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 routers routersPubV4;
|
inherit (lib.my.c.home) domain vlans prefixes vips routers routersPubV4;
|
||||||
|
|
||||||
name = elemAt routers index;
|
name = elemAt routers index;
|
||||||
|
otherIndex = 1 - index;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
nixos.systems."${name}" = {
|
nixos.systems."${name}" = {
|
||||||
@ -19,14 +20,16 @@ in
|
|||||||
core = {
|
core = {
|
||||||
name = "${name}-core";
|
name = "${name}-core";
|
||||||
inherit domain;
|
inherit domain;
|
||||||
|
mtu = 1500;
|
||||||
ipv4 = {
|
ipv4 = {
|
||||||
address = net.cidr.host (index + 1) prefixes.core.v4;
|
address = net.cidr.host (index + 1) prefixes.core.v4;
|
||||||
gateway = null;
|
gateway = null;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
hi = {
|
hi = {
|
||||||
inherit domain;
|
|
||||||
name = "${name}-hi";
|
name = "${name}-hi";
|
||||||
|
inherit domain;
|
||||||
|
mtu = 9000;
|
||||||
ipv4 = {
|
ipv4 = {
|
||||||
address = net.cidr.host (index + 1) prefixes.hi.v4;
|
address = net.cidr.host (index + 1) prefixes.hi.v4;
|
||||||
mask = 22;
|
mask = 22;
|
||||||
@ -37,6 +40,7 @@ in
|
|||||||
lo = {
|
lo = {
|
||||||
name = "${name}-lo";
|
name = "${name}-lo";
|
||||||
inherit domain;
|
inherit domain;
|
||||||
|
mtu = 1500;
|
||||||
ipv4 = {
|
ipv4 = {
|
||||||
address = net.cidr.host (index + 1) prefixes.lo.v4;
|
address = net.cidr.host (index + 1) prefixes.lo.v4;
|
||||||
mask = 21;
|
mask = 21;
|
||||||
@ -47,6 +51,7 @@ in
|
|||||||
untrusted = {
|
untrusted = {
|
||||||
name = "${name}-ut";
|
name = "${name}-ut";
|
||||||
inherit domain;
|
inherit domain;
|
||||||
|
mtu = 1500;
|
||||||
ipv4 = {
|
ipv4 = {
|
||||||
address = net.cidr.host (index + 1) prefixes.untrusted.v4;
|
address = net.cidr.host (index + 1) prefixes.untrusted.v4;
|
||||||
mask = 24;
|
mask = 24;
|
||||||
@ -66,6 +71,33 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extraAssignments = {
|
||||||
|
router-hi.hi = {
|
||||||
|
name = "router-hi";
|
||||||
|
inherit domain;
|
||||||
|
ipv4 = {
|
||||||
|
address = vips.hi.v4;
|
||||||
|
mask = 22;
|
||||||
|
};
|
||||||
|
ipv6.address = vips.hi.v6;
|
||||||
|
};
|
||||||
|
router-lo.lo = {
|
||||||
|
name = "router-lo";
|
||||||
|
inherit domain;
|
||||||
|
ipv4 = {
|
||||||
|
address = vips.lo.v4;
|
||||||
|
mask = 21;
|
||||||
|
};
|
||||||
|
ipv6.address = vips.lo.v6;
|
||||||
|
};
|
||||||
|
router-ut.untrusted = {
|
||||||
|
name = "router-ut";
|
||||||
|
inherit domain;
|
||||||
|
ipv4.address = vips.untrusted.v4;
|
||||||
|
ipv6.address = vips.untrusted.v6;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
configuration = { lib, pkgs, config, assignments, allAssignments, ... }:
|
configuration = { lib, pkgs, config, assignments, allAssignments, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib) mkIf mkMerge mkForce;
|
inherit (lib) mkIf mkMerge mkForce;
|
||||||
@ -76,6 +108,8 @@ in
|
|||||||
imports = map (m: import m index) [
|
imports = map (m: import m index) [
|
||||||
./keepalived.nix
|
./keepalived.nix
|
||||||
./dns.nix
|
./dns.nix
|
||||||
|
./radvd.nix
|
||||||
|
./kea.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
config = {
|
config = {
|
||||||
@ -157,7 +191,7 @@ in
|
|||||||
|
|
||||||
networks =
|
networks =
|
||||||
let
|
let
|
||||||
mkVLANConfig = name: mtu:
|
mkVLANConfig = name:
|
||||||
let
|
let
|
||||||
iface = "lan-${name}";
|
iface = "lan-${name}";
|
||||||
in
|
in
|
||||||
@ -165,26 +199,9 @@ in
|
|||||||
"60-${iface}" = mkMerge [
|
"60-${iface}" = mkMerge [
|
||||||
(networkdAssignment iface assignments."${name}")
|
(networkdAssignment iface assignments."${name}")
|
||||||
{
|
{
|
||||||
linkConfig.MTUBytes = toString mtu;
|
dns = [ "127.0.0.1" "::1" ];
|
||||||
domains = [ config.networking.domain ];
|
domains = [ config.networking.domain ];
|
||||||
networkConfig = {
|
networkConfig.IPv6AcceptRA = mkForce false;
|
||||||
IPv6AcceptRA = mkForce false;
|
|
||||||
# IPv6SendRA = true;
|
|
||||||
};
|
|
||||||
ipv6SendRAConfig = {
|
|
||||||
DNS = [
|
|
||||||
(net.cidr.host 1 prefixes."${name}".v4)
|
|
||||||
(net.cidr.host 2 prefixes."${name}".v4)
|
|
||||||
(net.cidr.host 1 prefixes."${name}".v6)
|
|
||||||
(net.cidr.host 2 prefixes."${name}".v6)
|
|
||||||
];
|
|
||||||
Domains = [ config.networking.domain ];
|
|
||||||
};
|
|
||||||
ipv6Prefixes = [
|
|
||||||
{
|
|
||||||
ipv6PrefixConfig.Prefix = prefixes."${name}".v6;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
@ -255,9 +272,20 @@ in
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
(mkVLANConfig "hi" 9000)
|
(mkVLANConfig "hi")
|
||||||
(mkVLANConfig "lo" 1500)
|
(mkVLANConfig "lo")
|
||||||
(mkVLANConfig "untrusted" 1500)
|
(mkVLANConfig "untrusted")
|
||||||
|
|
||||||
|
{
|
||||||
|
"60-lan-hi" = {
|
||||||
|
routes = map (r: { routeConfig = r; }) [
|
||||||
|
{
|
||||||
|
Destination = elemAt routersPubV4 otherIndex;
|
||||||
|
Gateway = net.cidr.host (otherIndex + 1) prefixes.hi.v4;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -47,13 +47,8 @@ in
|
|||||||
|
|
||||||
settings = {
|
settings = {
|
||||||
query-local-address = [
|
query-local-address = [
|
||||||
# TODO: IPv6
|
|
||||||
"0.0.0.0"
|
"0.0.0.0"
|
||||||
"::"
|
"::"
|
||||||
# TODO: Dynamic IPv4 WAN address?
|
|
||||||
# assignments.internal.ipv4.address
|
|
||||||
# assignments.internal.ipv6.address
|
|
||||||
# assignments.hi.ipv6.address
|
|
||||||
];
|
];
|
||||||
forward-zones = map (z: "${z}=127.0.0.1:5353") authZones;
|
forward-zones = map (z: "${z}=127.0.0.1:5353") authZones;
|
||||||
|
|
||||||
@ -73,9 +68,10 @@ in
|
|||||||
pdns.serviceConfig.RestrictAddressFamilies = "AF_UNIX AF_INET AF_INET6 AF_NETLINK";
|
pdns.serviceConfig.RestrictAddressFamilies = "AF_UNIX AF_INET AF_INET6 AF_NETLINK";
|
||||||
};
|
};
|
||||||
|
|
||||||
# For rec_control
|
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
|
# For rec_control
|
||||||
pdns-recursor
|
pdns-recursor
|
||||||
|
sqlite
|
||||||
];
|
];
|
||||||
|
|
||||||
my.pdns.auth = {
|
my.pdns.auth = {
|
||||||
@ -98,11 +94,15 @@ in
|
|||||||
webserver = true;
|
webserver = true;
|
||||||
webserver-address = "::";
|
webserver-address = "::";
|
||||||
webserver-allow-from = [ "127.0.0.1" "::1" ];
|
webserver-allow-from = [ "127.0.0.1" "::1" ];
|
||||||
|
|
||||||
|
dnsupdate = true;
|
||||||
|
launch = [ "gsqlite3" ];
|
||||||
|
gsqlite3-database = "/var/lib/pdns/dynamic.sqlite3";
|
||||||
};
|
};
|
||||||
|
|
||||||
bind.zones =
|
bind.zones =
|
||||||
let
|
let
|
||||||
names = [ "core" "hi" "lo" ];
|
names = [ "core" "hi" "lo" "untrusted" ];
|
||||||
i = toString (index + 1);
|
i = toString (index + 1);
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
@ -136,13 +136,22 @@ in
|
|||||||
ns1 IN ALIAS ${elemAt routers 0}.${config.networking.domain}.
|
ns1 IN ALIAS ${elemAt routers 0}.${config.networking.domain}.
|
||||||
ns2 IN ALIAS ${elemAt routers 1}.${config.networking.domain}.
|
ns2 IN ALIAS ${elemAt routers 1}.${config.networking.domain}.
|
||||||
|
|
||||||
|
dyn IN NS ns1.dyn.h.nul.ie.
|
||||||
|
dyn IN NS ns2.dyn.h.nul.ie.
|
||||||
|
ns1.dyn.h.nul.ie. IN ALIAS ${elemAt routers 0}.${config.networking.domain}.
|
||||||
|
ns2.dyn.h.nul.ie. IN ALIAS ${elemAt routers 1}.${config.networking.domain}.
|
||||||
|
|
||||||
jim-core IN A ${net.cidr.host 10 prefixes.core.v4}
|
jim-core IN A ${net.cidr.host 10 prefixes.core.v4}
|
||||||
jim IN A ${net.cidr.host 10 prefixes.hi.v4}
|
jim IN A ${net.cidr.host 10 prefixes.hi.v4}
|
||||||
|
jim IN AAAA ${net.cidr.host (65536+1) prefixes.hi.v6}
|
||||||
jim-lo IN A ${net.cidr.host 10 prefixes.lo.v4}
|
jim-lo IN A ${net.cidr.host 10 prefixes.lo.v4}
|
||||||
|
jim-lo IN AAAA ${net.cidr.host (65536+1) prefixes.lo.v6}
|
||||||
|
|
||||||
dave-core IN A ${net.cidr.host 11 prefixes.core.v4}
|
dave-core IN A ${net.cidr.host 11 prefixes.core.v4}
|
||||||
dave IN A ${net.cidr.host 11 prefixes.hi.v4}
|
dave IN A ${net.cidr.host 11 prefixes.hi.v4}
|
||||||
|
dave IN AAAA ${net.cidr.host (65536+2) prefixes.hi.v6}
|
||||||
dave-lo IN A ${net.cidr.host 11 prefixes.lo.v4}
|
dave-lo IN A ${net.cidr.host 11 prefixes.lo.v4}
|
||||||
|
dave-lo IN AAAA ${net.cidr.host (65536+2) prefixes.lo.v6}
|
||||||
|
|
||||||
ups IN A ${net.cidr.host 20 prefixes.lo.v4}
|
ups IN A ${net.cidr.host 20 prefixes.lo.v4}
|
||||||
palace-kvm IN A ${net.cidr.host 21 prefixes.lo.v4}
|
palace-kvm IN A ${net.cidr.host 21 prefixes.lo.v4}
|
||||||
|
141
nixos/boxes/home/routing-common/kea.nix
Normal file
141
nixos/boxes/home/routing-common/kea.nix
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
index: { lib, pkgs, assignments, ... }:
|
||||||
|
let
|
||||||
|
inherit (lib) mkForce;
|
||||||
|
inherit (lib.my) net;
|
||||||
|
inherit (lib.my.c.home) domain prefixes vips;
|
||||||
|
|
||||||
|
dns-servers = [
|
||||||
|
{
|
||||||
|
ip-address = net.cidr.host 1 prefixes.core.v4;
|
||||||
|
port = 5353;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
ip-address = net.cidr.host 2 prefixes.core.v4;
|
||||||
|
port = 5353;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
in
|
||||||
|
{
|
||||||
|
users = with lib.my.c.ids; {
|
||||||
|
users.kea= {
|
||||||
|
isSystemUser = true;
|
||||||
|
uid = uids.kea;
|
||||||
|
group = "kea";
|
||||||
|
};
|
||||||
|
groups.kea.gid = gids.kea;
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services = {
|
||||||
|
kea-dhcp4-server.serviceConfig.DynamicUser = mkForce false;
|
||||||
|
kea-dhcp-ddns-server.serviceConfig.DynamicUser = mkForce false;
|
||||||
|
};
|
||||||
|
|
||||||
|
services = {
|
||||||
|
kea = {
|
||||||
|
dhcp4 = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
interfaces-config = {
|
||||||
|
interfaces = [
|
||||||
|
"lan-hi/${assignments.hi.ipv4.address}"
|
||||||
|
"lan-lo/${assignments.lo.ipv4.address}"
|
||||||
|
"lan-untrusted/${assignments.untrusted.ipv4.address}"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
lease-database = {
|
||||||
|
type = "memfile";
|
||||||
|
persist = true;
|
||||||
|
name = "/var/lib/kea/dhcp.leases";
|
||||||
|
};
|
||||||
|
|
||||||
|
option-data = [
|
||||||
|
{
|
||||||
|
name = "domain-name";
|
||||||
|
data = domain;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "domain-search";
|
||||||
|
data = "${domain}, dyn.${domain}";
|
||||||
|
always-send = true;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
subnet4 = [
|
||||||
|
{
|
||||||
|
id = 1;
|
||||||
|
subnet = prefixes.hi.v4;
|
||||||
|
interface = "lan-hi";
|
||||||
|
option-data = [
|
||||||
|
{
|
||||||
|
name = "routers";
|
||||||
|
data = vips.hi.v4;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "domain-name-servers";
|
||||||
|
data = "${net.cidr.host 1 prefixes.hi.v4}, ${net.cidr.host 2 prefixes.hi.v4}";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
pools = [
|
||||||
|
{
|
||||||
|
pool = "192.168.68.120 - 192.168.71.240";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
reservations = [
|
||||||
|
{
|
||||||
|
# castle
|
||||||
|
hw-address = "24:8a:07:a8:fe:3a";
|
||||||
|
ip-address = net.cidr.host 40 prefixes.hi.v4;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
id = 2;
|
||||||
|
subnet = prefixes.lo.v4;
|
||||||
|
interface = "lan-lo";
|
||||||
|
option-data = [
|
||||||
|
{
|
||||||
|
name = "routers";
|
||||||
|
data = vips.lo.v4;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "domain-name-servers";
|
||||||
|
data = "${net.cidr.host 1 prefixes.lo.v4}, ${net.cidr.host 2 prefixes.lo.v4}";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
pools = [
|
||||||
|
{
|
||||||
|
pool = "192.168.72.120 - 192.168.79.240";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
reservations = [
|
||||||
|
{
|
||||||
|
# castle
|
||||||
|
hw-address = "24:8a:07:a8:fe:3a";
|
||||||
|
ip-address = net.cidr.host 40 prefixes.lo.v4;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
ddns-send-updates = true;
|
||||||
|
ddns-replace-client-name = "when-not-present";
|
||||||
|
ddns-qualifying-suffix = "dyn.${domain}";
|
||||||
|
ddns-generated-prefix = "ip";
|
||||||
|
ddns-update-on-renew = true;
|
||||||
|
|
||||||
|
dhcp-ddns.enable-updates = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
dhcp-ddns = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
forward-ddns.ddns-domains = [
|
||||||
|
{
|
||||||
|
name = "dyn.${domain}.";
|
||||||
|
inherit dns-servers;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -1,20 +1,30 @@
|
|||||||
index: { lib, pkgs, ... }:
|
index: { lib, pkgs, config, ... }:
|
||||||
let
|
let
|
||||||
inherit (builtins) attrNames;
|
inherit (builtins) attrNames concatMap;
|
||||||
|
inherit (lib) optional;
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.c.home) prefixes vips;
|
inherit (lib.my.c.home) prefixes vips;
|
||||||
|
|
||||||
vlanIface = vlan: if vlan == "as211024" then vlan else "lan-${vlan}";
|
vlanIface = vlan: if vlan == "as211024" then vlan else "lan-${vlan}";
|
||||||
vrrpIPs = family: map (vlan: {
|
vrrpIPs = family: concatMap (vlan: [
|
||||||
addr = "${vips.${vlan}.${family}}/${toString (net.cidr.length prefixes.${vlan}.${family})}";
|
{
|
||||||
|
addr = "${vips.${vlan}.${family}}/${toString (net.cidr.length prefixes.${vlan}.${family})}";
|
||||||
|
dev = vlanIface vlan;
|
||||||
|
}
|
||||||
|
] ++ (optional (family == "v6") {
|
||||||
|
addr = "fe80::1/64";
|
||||||
dev = vlanIface vlan;
|
dev = vlanIface vlan;
|
||||||
}) (attrNames vips);
|
})) (attrNames vips);
|
||||||
mkVRRP = family: routerId: {
|
mkVRRP = family: routerId: {
|
||||||
state = if index == 0 then "MASTER" else "BACKUP";
|
state = if index == 0 then "MASTER" else "BACKUP";
|
||||||
interface = "lan-core";
|
interface = "lan-core";
|
||||||
priority = 255 - index;
|
priority = 255 - index;
|
||||||
virtualRouterId = routerId;
|
virtualRouterId = routerId;
|
||||||
virtualIps = vrrpIPs family;
|
virtualIps = vrrpIPs family;
|
||||||
|
extraConfig = ''
|
||||||
|
notify_master "${config.systemd.package}/bin/systemctl start radvd.service"
|
||||||
|
notify_backup "${config.systemd.package}/bin/systemctl stop radvd.service"
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
|
28
nixos/boxes/home/routing-common/radvd.nix
Normal file
28
nixos/boxes/home/routing-common/radvd.nix
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
index: { lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
inherit (lib) mkForce concatMapStringsSep;
|
||||||
|
inherit (lib.my) net;
|
||||||
|
inherit (lib.my.c.home) domain prefixes;
|
||||||
|
|
||||||
|
mkInterface = name: ''
|
||||||
|
interface lan-${name} {
|
||||||
|
AdvSendAdvert on;
|
||||||
|
AdvRASrcAddress { fe80::1; };
|
||||||
|
AdvLinkMTU ${toString prefixes."${name}".mtu};
|
||||||
|
prefix ${prefixes."${name}".v6} {};
|
||||||
|
RDNSS ${net.cidr.host 1 prefixes."${name}".v6} ${net.cidr.host 2 prefixes."${name}".v6} {};
|
||||||
|
DNSSL ${domain} {};
|
||||||
|
};
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
{
|
||||||
|
# To be started by keepalived
|
||||||
|
systemd.services.radvd.wantedBy = mkForce [ ];
|
||||||
|
|
||||||
|
services = {
|
||||||
|
radvd = {
|
||||||
|
enable = true;
|
||||||
|
config = concatMapStringsSep "\n" mkInterface [ "hi" "lo" "untrusted" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -100,6 +100,7 @@ let
|
|||||||
altNames = mkOpt' (listOf str) [ ] "Extra names to assign.";
|
altNames = mkOpt' (listOf str) [ ] "Extra names to assign.";
|
||||||
visible = mkBoolOpt' true "Whether or not this assignment should be visible.";
|
visible = mkBoolOpt' true "Whether or not this assignment should be visible.";
|
||||||
domain = mkOpt' (nullOr str) null "Domain for this assignment.";
|
domain = mkOpt' (nullOr str) null "Domain for this assignment.";
|
||||||
|
mtu = mkOpt' (nullOr ints.unsigned) null "Interface MTU.";
|
||||||
ipv4 = {
|
ipv4 = {
|
||||||
address = mkOpt' net.types.ipv4 null "IPv4 address.";
|
address = mkOpt' net.types.ipv4 null "IPv4 address.";
|
||||||
mask = mkOpt' ints.u8 24 "Network mask.";
|
mask = mkOpt' ints.u8 24 "Network mask.";
|
||||||
|
@ -125,7 +125,6 @@ in
|
|||||||
environment.systemPackages = with pkgs; mkMerge [
|
environment.systemPackages = with pkgs; mkMerge [
|
||||||
[
|
[
|
||||||
bash-completion
|
bash-completion
|
||||||
vim
|
|
||||||
git
|
git
|
||||||
unzip
|
unzip
|
||||||
]
|
]
|
||||||
@ -138,6 +137,7 @@ in
|
|||||||
fish.enable = mkDefault true;
|
fish.enable = mkDefault true;
|
||||||
# TODO: This is expecting to look up the channel for the database...
|
# TODO: This is expecting to look up the channel for the database...
|
||||||
command-not-found.enable = mkDefault false;
|
command-not-found.enable = mkDefault false;
|
||||||
|
vim.defaultEditor = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
services = {
|
services = {
|
||||||
|
@ -268,6 +268,9 @@ in
|
|||||||
# For pdns_control etc
|
# For pdns_control etc
|
||||||
systemPackages = with pkgs; [
|
systemPackages = with pkgs; [
|
||||||
pdns
|
pdns
|
||||||
|
(pkgs.writeShellScriptBin "pu" ''
|
||||||
|
${pdns}/bin/pdnsutil --config-dir /run/pdns "$@"
|
||||||
|
'')
|
||||||
pdns-file-record
|
pdns-file-record
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{ lib, pkgs, config, ... }:
|
{ lib, pkgs, config, ... }:
|
||||||
let
|
let
|
||||||
inherit (builtins) toJSON;
|
inherit (builtins) toJSON;
|
||||||
inherit (lib) optional mapAttrsToList mkIf withFeature;
|
inherit (lib) optional optionalAttrs mapAttrsToList mkIf withFeature;
|
||||||
inherit (lib.my) mkOpt' mkBoolOpt';
|
inherit (lib.my) mkOpt' mkBoolOpt';
|
||||||
|
|
||||||
rpcOpts = with lib.types; {
|
rpcOpts = with lib.types; {
|
||||||
@ -17,7 +17,7 @@ let
|
|||||||
inherit subsystem;
|
inherit subsystem;
|
||||||
config = map (rpc: {
|
config = map (rpc: {
|
||||||
inherit (rpc) method;
|
inherit (rpc) method;
|
||||||
} // (if rpc.params != { } then { inherit (rpc) params; } else { })) c;
|
} // (optionalAttrs (rpc.params != { }) { inherit (rpc) params; })) c;
|
||||||
}) cfg.config.subsystems;
|
}) cfg.config.subsystems;
|
||||||
};
|
};
|
||||||
configJSON = pkgs.writeText "spdk-config.json" (toJSON config');
|
configJSON = pkgs.writeText "spdk-config.json" (toJSON config');
|
||||||
|
@ -466,6 +466,16 @@ in
|
|||||||
(mkIf config.virtualisation.libvirtd.enable {
|
(mkIf config.virtualisation.libvirtd.enable {
|
||||||
my.tmproot.persistence.config.directories = [ "/var/lib/libvirt" ];
|
my.tmproot.persistence.config.directories = [ "/var/lib/libvirt" ];
|
||||||
})
|
})
|
||||||
|
(mkIf (with config.services.kea; (dhcp4.enable || dhcp6.enable || dhcp-ddns.enable)) {
|
||||||
|
my.tmproot.persistence.config.directories = [
|
||||||
|
{
|
||||||
|
directory = "/var/lib/kea";
|
||||||
|
mode = "0750";
|
||||||
|
user = "kea";
|
||||||
|
group = "kea";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
})
|
||||||
]))
|
]))
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
@ -37,7 +37,8 @@ in
|
|||||||
extraGroups =
|
extraGroups =
|
||||||
[ "wheel" "kvm" "dialout" ] ++
|
[ "wheel" "kvm" "dialout" ] ++
|
||||||
(optional config.networking.networkmanager.enable "networkmanager") ++
|
(optional config.networking.networkmanager.enable "networkmanager") ++
|
||||||
(optional config.virtualisation.libvirtd.enable "libvirtd");
|
(optional config.virtualisation.libvirtd.enable "libvirtd") ++
|
||||||
|
(optional config.programs.wireshark.enable "wireshark");
|
||||||
password = mkIf (cfg.passwordSecret == null) (mkDefault "hunter2");
|
password = mkIf (cfg.passwordSecret == null) (mkDefault "hunter2");
|
||||||
shell =
|
shell =
|
||||||
let shell = cfg.homeConfig.my.shell;
|
let shell = cfg.homeConfig.my.shell;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user