106 lines
2.6 KiB
Nix
106 lines
2.6 KiB
Nix
{ pkgs, lib, config, hypervisorConfig, ... }: {
|
|
options.lab.vm = {
|
|
baseMACAddress = lib.mkOption {
|
|
default = "BA:DB:EE:F0:00:00";
|
|
type = lib.types.str;
|
|
description = ''
|
|
Base MAC address for VMs in the DMZ.
|
|
'';
|
|
};
|
|
|
|
id = lib.mkOption {
|
|
type = lib.types.int;
|
|
description = ''
|
|
Unique identifier of this VM from wich the MAC address is derived.
|
|
'';
|
|
};
|
|
|
|
staticNetworking = lib.mkOption {
|
|
default = false;
|
|
type = lib.types.bool;
|
|
description = ''
|
|
Whether this VM has static networking configuration applied.
|
|
Routing is prepopulated, but IP addresses have to be set.
|
|
'';
|
|
};
|
|
|
|
staticIPv4 = lib.mkOption {
|
|
type = lib.types.str;
|
|
description = ''
|
|
Static IPv4 address for the VM.
|
|
'';
|
|
};
|
|
|
|
staticIPv6 = lib.mkOption {
|
|
type = lib.types.str;
|
|
description = ''
|
|
Static IPv6 address for the VM.
|
|
'';
|
|
};
|
|
};
|
|
|
|
config = {
|
|
system.stateVersion = hypervisorConfig.system.stateVersion;
|
|
|
|
microvm = {
|
|
shares = [{
|
|
source = "/nix/store";
|
|
mountPoint = "/nix/.ro-store";
|
|
tag = "ro-store";
|
|
proto = "virtiofs";
|
|
}];
|
|
|
|
interfaces = [{
|
|
type = "tap";
|
|
id = "vm-${config.networking.hostName}";
|
|
mac = pkgs.lib.net.mac.add config.lab.vm.id config.lab.vm.baseMACAddress;
|
|
}];
|
|
};
|
|
|
|
networking.useDHCP = false;
|
|
|
|
systemd.network =
|
|
let
|
|
cfg = config.lab.networking;
|
|
in
|
|
{
|
|
enable = true;
|
|
|
|
networks = {
|
|
"30-main-nic" = {
|
|
matchConfig.Name = "en*";
|
|
|
|
networkConfig = {
|
|
IPv6AcceptRA = ! config.lab.vm.staticNetworking;
|
|
DHCP = lib.mkIf (! config.lab.vm.staticNetworking) "yes";
|
|
|
|
Address = lib.mkIf config.lab.vm.staticNetworking [
|
|
"${ config.lab.vm.staticIPv4}/${cfg.dmz.ipv4.prefixLength}"
|
|
"${config.lab.vm.staticIPv6}/${cfg.dmz.ipv6.prefixLength}"
|
|
];
|
|
|
|
DNS = lib.mkIf config.lab.vm.staticNetworking [
|
|
cfg.dmz.ipv4.router
|
|
cfg.dmz.ipv6.router
|
|
];
|
|
};
|
|
|
|
routes = lib.mkIf config.lab.vm.staticNetworking [
|
|
{
|
|
routeConfig = {
|
|
Gateway = cfg.dmz.ipv4.router;
|
|
Destination = "0.0.0.0/0";
|
|
};
|
|
}
|
|
{
|
|
routeConfig = {
|
|
Gateway = cfg.dmz.ipv6.router;
|
|
Destination = "::/0";
|
|
};
|
|
}
|
|
];
|
|
};
|
|
};
|
|
};
|
|
};
|
|
}
|