main
1{den, ...}: {
2 den.hosts.tribios = {
3 address = {
4 ipv4.tailscale = "100.127.6.231";
5 ipv6.tailscale = "fd7a:115c:a1e0:675d:6820:4fa0:fddc:a59";
6 };
7 settings.services.mihomo = {
8 autoStart = true;
9 tailscaleWebControl = true;
10 interfaces = {
11 wan = "enP3p49s0";
12 lan = ["br-lan"];
13 };
14 };
15 };
16
17 den.aspects.tribios = {
18 includes = [
19 den.aspects.services.mihomo
20 den.aspects.services.mihomo.tproxy
21 ];
22
23 nixos = {
24 boot.kernel.sysctl = {
25 "net.ipv4.ip_forward" = 1;
26 "net.ipv4.conf.all.send_redirects" = 0;
27 "net.ipv4.conf.default.send_redirects" = 0;
28 "net.ipv4.conf.br-lan.send_redirects" = 0;
29 "net.ipv6.conf.all.forwarding" = 1;
30 "net.ipv6.conf.br-lan.forwarding" = 1;
31 };
32
33 # Tribios' network interfaces:
34 # wan: enP3p49s0 (2.5Gbps)
35 # lan: enP4p65s0 (2.5Gbps), end0 (1.0Gbps)
36 # Automatically configurated by nixos-factor.
37 networking = {
38 useNetworkd = true;
39 bridges = {
40 br-lan = {
41 interfaces = ["enP4p65s0" "end0"];
42 };
43 };
44 interfaces = {
45 br-lan = {
46 useDHCP = false;
47 ipv4.addresses = [
48 {
49 address = "192.168.52.1";
50 prefixLength = 24;
51 }
52 ];
53 };
54 };
55
56 firewall = {
57 enable = true;
58 trustedInterfaces = ["br-lan"];
59 };
60
61 nat = {
62 enable = true;
63 internalInterfaces = ["br-lan"];
64 externalInterface = "enP3p49s0";
65 };
66 };
67
68 # NAT-PMP for Tailscale NAT traversal.
69 # Tailscale clients behind this router will auto-request
70 # endpoint-independent port mappings, enabling direct
71 # connections from the company network (192.168.100.x).
72 services.miniupnpd = {
73 enable = true;
74 externalInterface = "enP3p49s0";
75 internalIPs = ["br-lan"];
76 upnp = false;
77 natpmp = true;
78 };
79
80 systemd.services.miniupnpd.after = ["systemd-networkd.service"];
81
82 services.kea.dhcp4 = {
83 enable = true;
84 settings = {
85 interfaces-config.interfaces = ["br-lan"];
86 lease-database = {
87 name = "/var/lib/kea/dhcp4.leases";
88 persist = true;
89 type = "memfile";
90 };
91 valid-lifetime = 4000;
92 subnet4 = [
93 {
94 id = 1;
95 subnet = "192.168.52.0/24";
96 pools = [{pool = "192.168.52.2 - 192.168.52.200";}];
97 option-data = [
98 {
99 name = "routers";
100 data = "192.168.52.1";
101 }
102 {
103 name = "domain-name-servers";
104 data = "223.5.5.5, 119.29.29.29";
105 }
106 ];
107 }
108 ];
109 };
110 };
111 };
112 };
113}