mirror of https://gitlab.crans.org/nounous/nixos
203 lines
5.5 KiB
Nix
203 lines
5.5 KiB
Nix
{ lib, config, ... }:
|
|
|
|
let
|
|
cfg = config.crans.networking;
|
|
|
|
inherit (lib)
|
|
mkEnableOption
|
|
mkIf
|
|
mkOption
|
|
types
|
|
;
|
|
in
|
|
|
|
{
|
|
options.crans.networking = {
|
|
enable = mkEnableOption "Configuration réseaux commune à toutes les machines du Crans.";
|
|
|
|
id = mkOption {
|
|
type = types.str;
|
|
example = "35";
|
|
description = "Le numéro de la VM dans Proxmox (sans le `1` devant).";
|
|
};
|
|
|
|
adm = {
|
|
enable = mkEnableOption "Configuration du VLAN adm.";
|
|
|
|
interface = mkOption {
|
|
type = types.str;
|
|
default = "ens18";
|
|
example = "ens20";
|
|
description = "Nom de l'interface réseau sur laquelle est située le VLAN adm.";
|
|
};
|
|
};
|
|
|
|
srv = {
|
|
enable = mkEnableOption "Configuration du VLAN srv.";
|
|
|
|
interface = mkOption {
|
|
type = types.str;
|
|
default = "ens19";
|
|
example = "ens20";
|
|
description = "Nom de l'interface réseau sur laquelle est située le VLAN srv.";
|
|
};
|
|
|
|
ipv4 = mkOption {
|
|
type = types.str;
|
|
example = "185.230.79.1";
|
|
description = "Adresse IPv4 de la machine.";
|
|
};
|
|
};
|
|
|
|
srvNat = {
|
|
enable = mkEnableOption "Configuration du VLAN srv-nat.";
|
|
|
|
interface = mkOption {
|
|
type = types.str;
|
|
default = "ens19";
|
|
example = "ens20";
|
|
description = "Nom de l'interface réseau sur laquelle est située le VLAN srv-nat.";
|
|
};
|
|
};
|
|
|
|
san = {
|
|
enable = mkEnableOption "Configuration du VLAN san.";
|
|
|
|
interface = mkOption {
|
|
type = types.str;
|
|
example = "ens19";
|
|
description = "Nom de l'interface réseau sur laquelle est située le VLAN san.";
|
|
};
|
|
};
|
|
};
|
|
|
|
config = mkIf cfg.enable {
|
|
networking = {
|
|
useDHCP = false;
|
|
firewall.enable = lib.mkDefault false;
|
|
nameservers = [ "172.16.10.128" ];
|
|
|
|
# La configuration des interfaces se fait de la manière suivante :
|
|
# elle est écrite de manière générique pour toutes les machines, puis
|
|
# on filtre pour ne garder que les interfaces activées. nix fait de
|
|
# l'évaluation paresseuse donc ça fonctionne bien !
|
|
interfaces =
|
|
# On change le nom des interfaces de "adm", "srv", ... pour leur vrai
|
|
# nom (on ne le met pas directement pour faire fonctionner le filter
|
|
# plus bas).
|
|
lib.attrsets.mapAttrs'
|
|
(interface: conf: {
|
|
name = cfg."${interface}".interface;
|
|
value = conf;
|
|
})
|
|
(
|
|
# On filtre sur les interfaces activées
|
|
lib.attrsets.filterAttrs (interface: _: cfg."${interface}".enable) {
|
|
# Configuration du VLAN adm
|
|
adm = {
|
|
ipv4.addresses = [
|
|
{
|
|
address = "172.16.10.1${cfg.id}";
|
|
prefixLength = 24;
|
|
}
|
|
];
|
|
|
|
ipv6.addresses = [
|
|
{
|
|
address = "fd00::10:0:ff:fe01:${cfg.id}10";
|
|
prefixLength = 64;
|
|
}
|
|
];
|
|
};
|
|
|
|
# Configuration du VLAN srv
|
|
srv = {
|
|
ipv4 = {
|
|
addresses = [
|
|
{
|
|
address = cfg.srv.ipv4;
|
|
prefixLength = 26;
|
|
}
|
|
];
|
|
routes = [
|
|
{
|
|
address = "0.0.0.0";
|
|
via = "185.230.79.62";
|
|
prefixLength = 0;
|
|
}
|
|
];
|
|
};
|
|
ipv6 = {
|
|
addresses = [
|
|
{
|
|
address = "2a0c:700:2::ff::fe01:${cfg.id}02";
|
|
prefixLength = 64;
|
|
}
|
|
];
|
|
routes = [
|
|
{
|
|
address = "::";
|
|
via = "2a0c:700:2::ff:fe00:9902";
|
|
prefixLength = 0;
|
|
}
|
|
];
|
|
};
|
|
};
|
|
|
|
# Configuration du VLAN srv-nat
|
|
srvNat = {
|
|
ipv4 = {
|
|
addresses = [
|
|
{
|
|
address = "172.16.3.1${cfg.id}";
|
|
prefixLength = 24;
|
|
}
|
|
];
|
|
routes = [
|
|
{
|
|
address = "0.0.0.0";
|
|
via = "172.16.3.99";
|
|
prefixLength = 0;
|
|
}
|
|
];
|
|
};
|
|
|
|
ipv6 = {
|
|
addresses = [
|
|
{
|
|
address = "2a0c:700:3::ff:fe01:${cfg.id}03";
|
|
prefixLength = 64;
|
|
}
|
|
];
|
|
routes = [
|
|
{
|
|
address = "::";
|
|
via = "2a0c:700:3::ff:fe00:9903";
|
|
prefixLength = 0;
|
|
}
|
|
];
|
|
};
|
|
};
|
|
|
|
# Configuration du VLAN san
|
|
san = {
|
|
ipv4.addresses = [
|
|
{
|
|
address = "172.16.4.1${cfg.id}";
|
|
prefixLength = 24;
|
|
}
|
|
];
|
|
|
|
ipv6.addresses = [
|
|
{
|
|
address = "fd00::4:0:ff:fe01:${cfg.id}04";
|
|
prefixLength = 64;
|
|
}
|
|
];
|
|
};
|
|
}
|
|
);
|
|
};
|
|
};
|
|
}
|