In lieu of "normal" dynamic #dns, I now have the following monstrosity:
1. #CoreDNS running in @flydotio (static IP and anycast UDP, naturally) with the JSON plugin, targeting a VPS
2. VPS running Caddy proxies the HTTP request from the JSON plugin to a VM running in my #homelab over a @tailscale subnet router
3. VM makes an HTTP request back to an app running on the VPS to get external IP
4. VM returns JSON formatted how the JSON plugin expects
5. VPS returns the proxied request back to CoreDNS running at Fly
6. CoreDNS caches the response and returns it to the requestor
Definitely won't regret this any time soon.

![[22:32] $ dig A @10.69.96.1 phtn.gwai
; <<>> DiG 9.20.9 <<>> A @10.69.96.1 phtn.gwai
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8234
;; flags: qr aa rd; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: f72682fcd7f25a18 (echoed)
;; QUESTION SECTION:
;phtn.gwai. IN A
;; ANSWER SECTION:
phtn.gwai. 0 IN CNAME k8s.gwai.
k8s.gwai. 0 IN A 10.69.96.101
k8s.gwai. 0 IN A 10.69.96.102
k8s.gwai. 0 IN A 10.69.96.103
;; Query time: 38 msec
;; SERVER: 10.69.96.1#53(10.69.96.1) (UDP)
;; WHEN: Sat Jun 14 22:32:27 CEST 2025
;; MSG SIZE rcvd: 153](https://files.mastodon.social/cache/media_attachments/files/114/683/639/444/525/336/small/dd0a3d5aa03a2f05.png)