Skip to content

Commit 4b333df

Browse files
authored
feat(dns): blocky を tailnet アドレスでも待ち受ける (#599)
tailnet の DNS 設定からこの解決器を指すため。今は loopback と LAN にしか 出ていないので、外出先の端末は家の blocky を引けず、広告遮断も内向きの gapul.net も効かない。 homeserver は tailscale0 が blocky より後に上がるので、非ローカルアドレスへの bind を許して起動順に依存しないようにする。macmini に同等の sysctl は無いため、 launchd の再試行で吸収する。
1 parent 2a1621c commit 4b333df

2 files changed

Lines changed: 21 additions & 5 deletions

File tree

nix/homelab/blocky.nix

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,23 @@
1515
# リゾルバだった。
1616
services.blocky = {
1717
enable = true;
18-
# ループバックとこの機械自身のアドレスだけ。podman のブリッジが aardvark-dns の
19-
# ために :53 を要る。AdGuard が踏んだのと同じ衝突。
18+
# ループバックとこの機械自身のアドレスだけ。0.0.0.0 にはできない: podman の
19+
# ブリッジが aardvark-dns のために :53 を要る。AdGuard が踏んだのと同じ衝突。
20+
#
21+
# tailnet アドレスも足してある。tailnet の DNS 設定からこの解決器を指すため
22+
# で、これが無いと外出先の端末は家の blocky を引けない (広告遮断も
23+
# gapul.net の内向き解決も効かない)。
2024
settings = import ../lib/blocky-settings.nix {
21-
listen = "127.0.0.1:53,192.168.116.98:53";
25+
listen = "127.0.0.1:53,192.168.116.98:53,100.127.129.31:53";
2226
};
2327
};
2428

29+
# tailscale0 は blocky より後に上がる。tailnet アドレスを名指しで待ち受ける以上、
30+
# 起動順で「まだ存在しないアドレスに bind できない」で落ちうるので、非ローカル
31+
# アドレスへの bind を許す。After= で順序を付ける手もあるが、tailscaled が
32+
# 再接続でアドレスを付け直す局面まではカバーできない。
33+
boot.kernel.sysctl."net.ipv4.ip_nonlocal_bind" = 1;
34+
2535
# 53 番は Blocky のもの。このホストでは他の何にも渡さない。
2636
services.resolved.enable = false;
2737

nix/hosts/macmini-dns.nix

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@
2020
let
2121
# このホストの LAN アドレス。ルーターの DHCP 予約で固定してある。
2222
lanAddress = "192.168.116.100";
23+
# tailnet アドレス。tailnet の DNS 設定はこちらを指す (外出先の端末は LAN の
24+
# アドレスに届かない)。Tailscale のアドレスは機械ごとに固定。
25+
tailnetAddress = "100.105.135.49";
2326

2427
settings = import ../lib/blocky-settings.nix {
25-
listen = "127.0.0.1:53,${lanAddress}:53";
28+
listen = "127.0.0.1:53,${lanAddress}:53,${tailnetAddress}:53";
2629
};
2730

2831
# blocky は YAML を読む。JSON は YAML の部分集合なので、そのまま渡せる。
@@ -51,8 +54,11 @@ in
5154
serviceConfig = {
5255
ProgramArguments = [ "${launch}" ];
5356
RunAtLoad = true;
57+
# 起動時に tailnet のアドレスがまだ付いていないと bind に失敗して終了する。
58+
# launchd が 30 秒おきに起こし直し、Tailscale が上がった時点で成功する。
59+
# Linux 側の ip_nonlocal_bind に当たるものが macOS には無いので、順序ではなく
60+
# 再試行で吸収する。
5461
KeepAlive = true;
55-
# 上流が落ちている間に再起動を繰り返しても意味がないので少し置く。
5662
ThrottleInterval = 30;
5763
StandardOutPath = "/var/log/blocky.log";
5864
StandardErrorPath = "/var/log/blocky.log";

0 commit comments

Comments
 (0)