birdsong/hosts.nix

154 lines
5.4 KiB
Nix

{ config, lib, pkgs, ... }:
with lib;
{
options.birdsong.hosts = mkOption {
description = "List of hosts in the birdsong network";
type = types.attrsOf
(types.submodule {
options = {
hostKey = mkOption {
default = null;
description = "SSH public key of the host, for use in known_hosts files";
type = with types; nullOr str;
};
subnet = mkOption {
default = "internet";
example = "roaming";
description = ''
Identifier representing a LAN the host belongs to. Hosts in the
same LAN will peer with each other.
The special value `internet` (the default) will accept peering
from all other hosts. This is to be used for servers that are
accessible from the public internet.
The special value `roaming` will not peer with other `roaming`
hosts, but will still peer with `internet` hosts. This is to be
used for portable devices like laptops that regularly move between
networks. Also use this for non-NixOS devices that can't use the
NixOS module and therefore only peer with the subnet router.
'';
type = types.str;
};
endpoint = mkOption {
default = null;
example = "example.com";
description = ''
Address (e.g. IP or domain name) by which the host is reachable
within its LAN.
If {option}`birdsong.hosts.<name>.subnet` is set to `internet`,
the host must be reachable at this address from the public
internet.
If {option}`birdsong.hosts.<name>.subnet` is set to `roaming`,
this option is not used.
'';
type = with types; nullOr str;
};
ipv4 = mkOption {
example = "10.127.1.1";
description = ''
IPv4 address of this peer within the network.
We are currently using the range 10.127.0.0/16, divided into /24
subnets. Please try to keep this consistent.
'';
type = types.str;
};
ipv6 = mkOption {
example = "fd70:81ca:0f8f:1::1";
description = ''
IPv6 address of this peer within the network.
We are currently using the range fd70:81ca:0f8f::/48, divided
into /64 subnets. Please try to keep this consistent.
'';
type = types.str;
};
port = mkOption {
default = 51820;
example = 51821;
description = ''
Which port to expose WireGuard on. Change this for peers behind
NAT, to a port not used by another peer in the same LAN.
'';
type = types.port;
};
wireguardKey = mkOption {
example = "xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=";
description = "WireGuard public key for this peer, as generated by `wg pubkey`";
type = types.str;
};
isRouter = mkOption {
default = false;
description = ''
The host with this flag set is the subnet router. It forwards
packets between WireGuard peers that can't connect directly to
each other. WireGuard's scope doesn't (yet) include full mesh
networking with load-balancing between routers, so only one peer
can hold this status. It should be peered with all other hosts
(i.e., {option}`birdsong.hosts.<name>.subnet` set to `internet`).
'';
type = types.bool;
};
};
});
};
config.birdsong.hosts = {
yevaud = {
hostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICHUAgyQhl390yUObLUI+jEbuNrZ2U6+8px628DolD+T root@yevaud";
endpoint = "yevaud.birdsong.network";
ipv4 = "10.127.1.1";
ipv6 = "fd70:81ca:0f8f:1::1";
wireguardKey = "YPJsIs9x4wuWdFi/QRWSJbWvKE0GQAfVL4MNMqHygDw=";
isRouter = true;
};
orm = {
hostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGc9rkcdOVWozBFj3kLVnSyUQQbyyH+UG+bLawanQkRQ root@orm";
endpoint = "orm.birdsong.network";
ipv4 = "10.127.1.2";
ipv6 = "fd70:81ca:0f8f:1::2";
wireguardKey = "birdLVh8roeZpcVo308Ums4l/aibhAxbi7MBsglkJyA=";
};
# kalessin = {
# # hostKey = "";
# endpoint = "kalessin.birdsong.network";
# ipv4 = "10.127.1.3";
# ipv6 = "fd70:81ca:0f8f:1::3";
# # wireguardKey = "";
# };
tohru = {
hostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOk8wuGzF0Y7SaH9aimo3SmCz99MTQwL+rEVhx0jsueU root@tohru";
subnet = "roaming";
ipv4 = "10.127.2.1";
ipv6 = "fd70:81ca:0f8f:2::1";
port = 51821;
wireguardKey = "lk3PCQM1jmZoI8sM/rWSyKNuZOUnjox3n9L9geJD+18=";
};
# kilgharrah = {
# # hostKey = "";
# subnet = "weyrhold";
# endpoint = "192.168.2.1";
# ipv4 = "10.127.3.1";
# ipv6 = "fd70:81ca:0f8f:3::1";
# # wireguardKey = "";
# };
shaw = {
hostKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMC0AomCZZiUV/BCpImiV4p/vGvFaz5QNc+fJLXmS5p root@shaw";
subnet = "library";
# endpoint = "";
ipv4 = "10.127.4.1";
ipv6 = "fd70:81ca:0f8f:4::1";
wireguardKey = "eD79pROC2zjhKz4tGRS43O95gcFRqO+SFb2XDnTr0zc=";
};
};
}