10 domain = "sourcephile.fr";
11 port = toString config.services.nebula.networks.${domain}.listen.port;
12 iface = config.services.nebula.networks.${domain}.tun.device;
13 IPv4Prefix = "10.0.0";
16 environment.systemPackages = with pkgs; [ nebula ];
17 systemd.services."nebula@${domain}" = {
18 reloadIfChanged = false;
19 stopIfChanged = false;
20 after = [ "chronyd.service" ];
21 serviceConfig.LoadCredentialEncrypted = [
23 builtins.path { path = inputs.self + "/hosts/${hostName}/nebula/${domain}/${hostName}.key.cred"; }
27 install.target = lib.mkDefault "root@${config.networking.hostName}.sp";
29 "${IPv4Prefix}.1" = [ "mermet.sp" ];
30 "${IPv4Prefix}.2" = [ "losurdo.sp" ];
31 "${IPv4Prefix}.3" = [ "oignon.sp" ];
32 "${IPv4Prefix}.4" = [ "patate.sp" ];
33 "${IPv4Prefix}.5" = [ "carotte.sp" ];
34 "${IPv4Prefix}.6" = [ "aubergine.sp" ];
35 "${IPv4Prefix}.7" = [ "courge.sp" ];
36 "${IPv4Prefix}.8" = [ "blackberry.sp" ];
37 "${IPv4Prefix}.9" = [ "pumpkin.sp" ];
38 "${IPv4Prefix}.10" = [ "nan2gua1.sp" ];
40 services.nebula.networks.${domain} = {
42 ca = lib.mkDefault (builtins.path { path = inputs.self + "/domains/${domain}/nebula/ca.crt"; });
43 cert = lib.mkDefault (
44 builtins.path { path = inputs.self + "/hosts/${hostName}/nebula/${domain}/${hostName}.crt"; }
46 key = "/run/credentials/nebula@${domain}.service/${hostName}.key";
47 listen.host = lib.mkDefault "0.0.0.0";
48 tun.device = lib.mkDefault "neb-sourcephile";
51 "mermet.${domain}:10001"
56 "losurdo.${domain}:10002"
94 default_timeout = "10m";
98 level = lib.mkDefault "info";
100 pki.disconnect_invalid = true;
104 #cipher = "chachapoly";
108 listen = "127.0.0.1:8080";
110 namespace = "prometheusns";
111 subsystem = "nebula";
113 message_metrics = false;
114 lighthouse_metrics = false;
119 networking.nftables.ruleset = ''
122 udp dport ${port} counter accept comment "Nebula ${domain}"
125 udp sport ${port} counter accept comment "Nebula ${domain}"
128 udp dport ${port} counter accept comment "Nebula ${domain}"
131 udp sport ${port} counter accept comment "Nebula ${domain}"
133 chain input-${iface} {
134 tcp dport ssh counter accept comment "SSH"
135 udp dport 60000-60100 counter accept comment "Mosh"
137 chain output-${iface} {
138 tcp dport ssh counter accept comment "SSH"
139 tcp dport {http,https} counter accept comment "HTTP"
140 udp dport 60000-60100 counter accept comment "Mosh"
143 iifname ${iface} jump input-${iface} comment "MUST be before the address-based jumps to input-lan"
144 iifname ${iface} log level warn prefix "input-${iface}: " counter drop
147 oifname ${iface} jump output-${iface}
148 oifname ${iface} log level warn prefix "output-${iface}: " counter drop
152 + lib.optionalString config.services.printing.enable ''
154 chain output-${iface} {
155 tcp dport { ipp, ipps } counter accept comment "printing: IPP"
159 + lib.optionalString config.hardware.sane.enable ''
161 chain output-${iface} {
162 tcp dport sane-port counter accept comment "sane-net: SANE"
166 networking.networkmanager.unmanaged = [ iface ];
167 services.fail2ban.ignoreIP = [
168 "${IPv4Prefix}.1" # mermet.sp
169 "${IPv4Prefix}.2" # losurdo.sp
170 "${IPv4Prefix}.3" # oignon.sp
171 "${IPv4Prefix}.9" # pumpkin.sp
172 "${IPv4Prefix}.10" # nan2gua1.sp