2023-05-09 20:20:29 +01:00
|
|
|
|
{ config, pkgs, lib, ... }:
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
imports = [
|
|
|
|
|
../../modules/common/default.nix
|
|
|
|
|
./hardware-configuration.nix
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
config = {
|
|
|
|
|
system.stateVersion = "22.11";
|
|
|
|
|
|
|
|
|
|
networking.hostName = "router";
|
|
|
|
|
networking.domain = "home.ts.hillion.co.uk";
|
|
|
|
|
|
|
|
|
|
boot.loader.systemd-boot.enable = true;
|
|
|
|
|
boot.loader.efi.canTouchEfiVariables = true;
|
|
|
|
|
|
2023-05-10 20:09:58 +01:00
|
|
|
|
boot.kernel.sysctl = {
|
|
|
|
|
"net.ipv4.conf.all.forwarding" = true;
|
|
|
|
|
};
|
|
|
|
|
|
2024-02-07 21:54:26 +00:00
|
|
|
|
## Interactive password
|
|
|
|
|
custom.users.jake.password = true;
|
|
|
|
|
|
2023-07-23 17:28:58 +01:00
|
|
|
|
## Impermanence
|
|
|
|
|
custom.impermanence.enable = true;
|
|
|
|
|
|
2023-05-10 20:09:58 +01:00
|
|
|
|
## Networking
|
|
|
|
|
networking = {
|
|
|
|
|
firewall.enable = lib.mkForce false;
|
|
|
|
|
nat.enable = lib.mkForce false;
|
|
|
|
|
|
|
|
|
|
useDHCP = false;
|
|
|
|
|
interfaces = {
|
|
|
|
|
enp1s0 = {
|
|
|
|
|
name = "eth0";
|
|
|
|
|
macAddress = "b4:fb:e4:b0:90:3c";
|
|
|
|
|
useDHCP = true;
|
|
|
|
|
};
|
|
|
|
|
enp2s0 = {
|
|
|
|
|
name = "eth1";
|
|
|
|
|
ipv4.addresses = [
|
|
|
|
|
{
|
|
|
|
|
address = "10.64.50.1";
|
|
|
|
|
prefixLength = 24;
|
|
|
|
|
}
|
|
|
|
|
];
|
|
|
|
|
};
|
|
|
|
|
enp3s0 = {
|
|
|
|
|
name = "eth2";
|
|
|
|
|
ipv4.addresses = [
|
|
|
|
|
{
|
|
|
|
|
address = "10.239.19.1";
|
|
|
|
|
prefixLength = 24;
|
|
|
|
|
}
|
|
|
|
|
];
|
|
|
|
|
};
|
|
|
|
|
enp4s0 = { name = "eth3"; };
|
|
|
|
|
enp5s0 = { name = "eth4"; };
|
|
|
|
|
enp6s0 = { name = "eth5"; };
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
nftables = {
|
|
|
|
|
enable = true;
|
|
|
|
|
ruleset = ''
|
|
|
|
|
table inet filter {
|
|
|
|
|
chain output {
|
|
|
|
|
type filter hook output priority 100; policy accept;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
chain input {
|
|
|
|
|
type filter hook input priority filter; policy drop;
|
|
|
|
|
|
|
|
|
|
# Allow trusted networks to access the router
|
|
|
|
|
iifname {
|
2023-07-23 18:27:54 +01:00
|
|
|
|
"lo",
|
2023-05-10 20:09:58 +01:00
|
|
|
|
"eth1",
|
|
|
|
|
"eth2",
|
|
|
|
|
"tailscale0",
|
|
|
|
|
} counter accept
|
|
|
|
|
|
|
|
|
|
ip protocol icmp counter accept comment "accept all ICMP types"
|
|
|
|
|
|
|
|
|
|
iifname "eth0" ct state { established, related } counter accept
|
|
|
|
|
iifname "eth0" drop
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
chain forward {
|
|
|
|
|
type filter hook forward priority filter; policy drop;
|
|
|
|
|
|
|
|
|
|
iifname {
|
|
|
|
|
"eth1",
|
|
|
|
|
"eth2",
|
|
|
|
|
} oifname {
|
|
|
|
|
"eth0",
|
|
|
|
|
} counter accept comment "Allow trusted LAN to WAN"
|
|
|
|
|
|
|
|
|
|
iifname {
|
|
|
|
|
"eth0",
|
|
|
|
|
} oifname {
|
|
|
|
|
"eth1",
|
|
|
|
|
"eth2",
|
|
|
|
|
} ct state established,related counter accept comment "Allow established back to LANs"
|
2023-06-04 21:36:07 +01:00
|
|
|
|
|
2023-07-22 19:57:48 +01:00
|
|
|
|
ip daddr 10.64.50.20 tcp dport 32400 counter accept comment "Plex"
|
|
|
|
|
|
2023-06-04 21:36:07 +01:00
|
|
|
|
ip daddr 10.64.50.20 tcp dport 8444 counter accept comment "Chia"
|
2024-04-22 20:49:43 +01:00
|
|
|
|
|
|
|
|
|
ip daddr 10.64.50.21 tcp dport 7654 counter accept comment "Tang"
|
2023-05-10 20:09:58 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
table ip nat {
|
|
|
|
|
chain prerouting {
|
2023-06-04 21:36:07 +01:00
|
|
|
|
type nat hook prerouting priority filter; policy accept;
|
2023-07-22 19:57:48 +01:00
|
|
|
|
|
|
|
|
|
iifname eth0 tcp dport 32400 counter dnat to 10.64.50.20
|
|
|
|
|
|
2023-06-04 21:36:07 +01:00
|
|
|
|
iifname eth0 tcp dport 8444 counter dnat to 10.64.50.20
|
2024-04-22 20:49:43 +01:00
|
|
|
|
|
|
|
|
|
iifname eth0 tcp dport 7654 counter dnat to 10.64.50.21
|
2023-05-10 20:09:58 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
chain postrouting {
|
|
|
|
|
type nat hook postrouting priority filter; policy accept;
|
|
|
|
|
oifname "eth0" masquerade
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
services = {
|
2024-02-07 23:09:06 +00:00
|
|
|
|
kea = {
|
|
|
|
|
dhcp4 = {
|
|
|
|
|
enable = true;
|
|
|
|
|
|
|
|
|
|
settings = {
|
|
|
|
|
interfaces-config = {
|
|
|
|
|
interfaces = [ "eth1" "eth2" ];
|
|
|
|
|
};
|
|
|
|
|
lease-database = {
|
|
|
|
|
type = "memfile";
|
|
|
|
|
persist = false;
|
|
|
|
|
};
|
|
|
|
|
subnet4 = [
|
|
|
|
|
{
|
|
|
|
|
subnet = "10.64.50.0/24";
|
|
|
|
|
interface = "eth1";
|
|
|
|
|
pools = [{
|
|
|
|
|
pool = "10.64.50.64 - 10.64.50.254";
|
|
|
|
|
}];
|
|
|
|
|
option-data = [
|
|
|
|
|
{
|
|
|
|
|
name = "routers";
|
|
|
|
|
data = "10.64.50.1";
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
name = "broadcast-address";
|
|
|
|
|
data = "10.64.50.255";
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
name = "domain-name-servers";
|
|
|
|
|
data = "1.1.1.1, 8.8.8.8";
|
|
|
|
|
}
|
|
|
|
|
];
|
|
|
|
|
reservations = [
|
|
|
|
|
{
|
|
|
|
|
# tywin.storage.ts.hillion.co.uk
|
|
|
|
|
hw-address = "c8:7f:54:6d:e1:03";
|
|
|
|
|
ip-address = "10.64.50.20";
|
|
|
|
|
hostname = "tywin";
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
# syncbox
|
|
|
|
|
hw-address = "00:1e:06:49:06:1e";
|
|
|
|
|
ip-address = "10.64.50.22";
|
|
|
|
|
hostname = "syncbox";
|
|
|
|
|
}
|
2024-04-22 20:49:43 +01:00
|
|
|
|
{
|
|
|
|
|
# microserver.home.ts.hillion.co.uk
|
|
|
|
|
hw-address = "e4:5f:01:b4:58:95";
|
|
|
|
|
ip-address = "10.64.50.21";
|
|
|
|
|
hostname = "microserver";
|
|
|
|
|
}
|
2024-02-07 23:09:06 +00:00
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
subnet = "10.239.19.0/24";
|
|
|
|
|
interface = "eth2";
|
|
|
|
|
pools = [{
|
|
|
|
|
pool = "10.239.19.64 - 10.239.19.254";
|
|
|
|
|
}];
|
|
|
|
|
option-data = [
|
|
|
|
|
{
|
|
|
|
|
name = "routers";
|
|
|
|
|
data = "10.239.19.1";
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
name = "broadcast-address";
|
|
|
|
|
data = "10.239.19.255";
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
name = "domain-name-servers";
|
|
|
|
|
data = "1.1.1.1, 8.8.8.8";
|
|
|
|
|
}
|
|
|
|
|
];
|
|
|
|
|
reservations = [
|
|
|
|
|
{
|
|
|
|
|
# bedroom-everything-presence-one
|
|
|
|
|
hw-address = "40:22:d8:e0:1d:50";
|
|
|
|
|
ip-address = "10.239.19.2";
|
|
|
|
|
hostname = "bedroom-everything-presence-one";
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
# living-room-everything-presence-one
|
|
|
|
|
hw-address = "40:22:d8:e0:0f:78";
|
|
|
|
|
ip-address = "10.239.19.3";
|
|
|
|
|
hostname = "living-room-everything-presence-one";
|
|
|
|
|
}
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
];
|
|
|
|
|
};
|
|
|
|
|
};
|
2023-05-10 20:09:58 +01:00
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
2023-05-09 20:20:29 +01:00
|
|
|
|
## Tailscale
|
|
|
|
|
age.secrets."tailscale/router.home.ts.hillion.co.uk".file = ../../secrets/tailscale/router.home.ts.hillion.co.uk.age;
|
|
|
|
|
custom.tailscale = {
|
|
|
|
|
enable = true;
|
|
|
|
|
preAuthKeyFile = config.age.secrets."tailscale/router.home.ts.hillion.co.uk".path;
|
2023-07-23 18:27:54 +01:00
|
|
|
|
ipv4Addr = "100.105.71.48";
|
|
|
|
|
ipv6Addr = "fd7a:115c:a1e0:ab12:4843:cd96:6269:4730";
|
2023-05-09 20:20:29 +01:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
## Enable btrfs compression
|
|
|
|
|
fileSystems."/data".options = [ "compress=zstd" ];
|
|
|
|
|
fileSystems."/nix".options = [ "compress=zstd" ];
|
2023-05-10 20:09:58 +01:00
|
|
|
|
|
|
|
|
|
## Run a persistent iperf3 server
|
|
|
|
|
services.iperf3.enable = true;
|
2023-07-23 18:27:54 +01:00
|
|
|
|
|
|
|
|
|
## Zigbee2Mqtt
|
|
|
|
|
custom.services.zigbee2mqtt.enable = true;
|
2023-08-03 21:20:55 +01:00
|
|
|
|
|
|
|
|
|
## Netdata
|
|
|
|
|
services.netdata = {
|
|
|
|
|
enable = true;
|
|
|
|
|
config = {
|
|
|
|
|
web = {
|
|
|
|
|
"bind to" = "unix:/run/netdata/netdata.sock";
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
services.caddy = {
|
|
|
|
|
enable = true;
|
|
|
|
|
virtualHosts."http://graphs.router.home.ts.hillion.co.uk" = {
|
|
|
|
|
listenAddresses = [ config.custom.tailscale.ipv4Addr config.custom.tailscale.ipv6Addr ];
|
|
|
|
|
extraConfig = "reverse_proxy unix///run/netdata/netdata.sock";
|
|
|
|
|
};
|
|
|
|
|
};
|
2024-02-04 10:29:07 +00:00
|
|
|
|
users.users.caddy.extraGroups = [ "netdata" ];
|
|
|
|
|
### HACK: Allow Caddy to restart if it fails. This happens because Tailscale
|
|
|
|
|
### is too late at starting. Upstream nixos caddy does restart on failure
|
|
|
|
|
### but it's prevented on exit code 1. Set the exit code to 0 (non-failure)
|
|
|
|
|
### to override this.
|
|
|
|
|
systemd.services.caddy = {
|
|
|
|
|
requires = [ "tailscaled.service" ];
|
|
|
|
|
after = [ "tailscaled.service" ];
|
|
|
|
|
serviceConfig = {
|
|
|
|
|
RestartPreventExitStatus = lib.mkForce 0;
|
|
|
|
|
};
|
2023-08-03 21:47:21 +01:00
|
|
|
|
};
|
2023-05-09 20:20:29 +01:00
|
|
|
|
};
|
|
|
|
|
}
|