main
1{
2 den,
3 lib,
4 ...
5}: let
6 inherit (import ../direct-dns/_lib.nix {inherit lib;}) mkDirectEntries;
7
8 templateName = domain: "mihomo-hosts-${lib.replaceStrings ["." ":"] ["-" "-"] domain}";
9in {
10 den.aspects.services.mihomo.dns = {
11 nixos = {
12 host,
13 reverseProxy,
14 config,
15 ...
16 }: let
17 cfg = host.settings.services.mihomo;
18
19 directEntries = mkDirectEntries reverseProxy;
20
21 directV4Clear = lib.listToAttrs (lib.concatMap (e:
22 lib.optional (e.v4 != null && e.v4.kind == "clear") {
23 name = e.domain;
24 value = [e.v4.value];
25 })
26 directEntries);
27
28 directV4Secret = lib.listToAttrs (lib.concatMap (e:
29 lib.optional (e.v4 != null && e.v4.kind == "secret") {
30 name = e.domain;
31 value = {
32 _secret = config.vaultix.templates.${templateName e.domain}.path;
33 quote = false;
34 };
35 })
36 directEntries);
37
38 secretEntries = lib.filter (e: e.v4 != null && e.v4.kind == "secret") directEntries;
39 in {
40 vaultix.secrets = lib.listToAttrs (map (e: {
41 name = e.v4.name;
42 value.file = e.v4.file;
43 })
44 secretEntries);
45 vaultix.templates = lib.listToAttrs (map (e: {
46 name = templateName e.domain;
47 value = {
48 content = builtins.toJSON [config.vaultix.placeholder.${e.v4.name}];
49 owner = "mihomo";
50 group = "mihomo";
51 mode = "0400";
52 };
53 })
54 secretEntries);
55
56 services.mihomo = {
57 config = {
58 hosts =
59 {
60 "dns.alidns.com" = ["223.5.5.5" "223.6.6.6" "2400:3200::1" "2400:3200:baba::1"];
61 "doh.pub" = ["1.12.12.12" "1.12.12.21" "120.53.53.53"];
62 "dns.google" = ["8.8.8.8" "8.8.4.4" "2001:4860:4860::8888" "2001:4860:4860::8844"];
63 "cloudflare-dns.com" = ["1.1.1.1" "1.0.0.1" "2606:4700:4700::1111" "2606:4700:4700::1001"];
64 }
65 // directV4Clear // directV4Secret;
66 dns = {
67 enable = true;
68 listen = ":${toString cfg.ports.dns}";
69 prefer-h3 = false;
70 ipv6 = false;
71 enhanced-mode = "redir-host";
72 respect-rules = true;
73 nameserver = [
74 "https://dns.google/dns-query#disable-qtype-64=true&disable-qtype-65=true"
75 "https://cloudflare-dns.com/dns-query#disable-qtype-64=true&disable-qtype-65=true"
76 ];
77 proxy-server-nameserver = [
78 "https://dns.alidns.com/dns-query#disable-qtype-64=true&disable-qtype-65=true"
79 "https://doh.pub/dns-query#disable-qtype-64=true&disable-qtype-65=true"
80 ];
81 direct-nameserver = [
82 "https://dns.alidns.com/dns-query#disable-qtype-64=true&disable-qtype-65=true"
83 "https://doh.pub/dns-query#disable-qtype-64=true&disable-qtype-65=true"
84 ];
85 nameserver-policy = {
86 # Tailscale
87 "+.net.trin.one" = "100.100.100.100";
88 ".ts.net" = "100.100.100.100";
89
90 "geosite:cn,private" = [
91 "https://dns.alidns.com/dns-query#disable-qtype-64=true&disable-qtype-65=true"
92 "https://doh.pub/dns-query#disable-qtype-64=true&disable-qtype-65=true"
93 ];
94 "geosite:geolocation-!cn" = [
95 "https://dns.google/dns-query#disable-qtype-64=true&disable-qtype-65=true"
96 "https://cloudflare-dns.com/dns-query#disable-qtype-64=true&disable-qtype-65=true"
97 ];
98 };
99 fake-ip-range = "198.18.0.1/16";
100 fake-ip-filter-mode = "blacklist";
101 fake-ip-filter = [
102 "+.+m2m"
103 "+.$injections.adguard.org"
104 "+.$local.adguard.org"
105 "+.+bogon"
106 "+.+lan"
107 "+.+local"
108 "+.+localdomain"
109 "+.home.arpa"
110 "dns.msftncsi.com"
111 "*.srv.nintendo.net"
112 "*.stun.playstation.net"
113 "xbox.*.microsoft.com"
114 "*.xboxlive.com"
115 "*.turn.twilio.com"
116 "*.stun.twilio.com"
117 "stun.syncthing.net"
118 "stun.*"
119 "*.sslip.io"
120 "*.nip.io"
121 "gate.trin.one"
122 ];
123 };
124 };
125 };
126 };
127 };
128}