Skip to content

Changelog

Mikhail Deynekin edited this page Nov 1, 2026 · 2 revisions

Changelog

History of the scheme and the scripts. The repository CHANGELOG.md is the source of truth and follows Keep a Changelog 2.0.0; this page is the working summary — what changed for someone running the scheme, and why it mattered.

0.4.3 — 2026-11-02

Fixed

  • Failover was blocked in probeMode "resolve". Before switching, the monitor still probed the fallback over DNS-JSON. A self-hosted endpoint answers 400 to that request, so probeB never became ok and a dead primary stayed in place while a working reserve sat idle. In resolve mode the switch now happens directly and is verified by :resolve after it, with rollback if the new endpoint answers badly.
  • The fallback probe in JSON mode now reports substituted too, like the primary probe.

Changed

  • New troubleshooting section: running a reserve endpoint on a separate host, including the dnsdist 2.x pitfall — its plain-HTTP DoH listener is HTTP/2-only, so nginx cannot proxy to it and h2=false is not a valid option.

0.4.2 — 2026-11-02

Release: v0.4.2 · notes: release-notes-v0.4.2

Added

  • probeMode in the health monitor: "json" (default) or "resolve". A self-hosted DoH endpoint serves wire format and has no DNS-JSON API, so the JSON probe reported a healthy primary as bad-status and moved the router onto a public fallback — the very path where answers get substituted. "resolve" judges liveness by the quality of live answers, with no external request.
  • PyPI package mikrotik-doh-failover: the Zabbix tools from zabbix/ are installable and appear as doh-zabbix-setup and doh-zabbix-collector. The RouterOS side stays copy-by-hand — a router configuration is reviewed, not installed.
  • Troubleshooting section on network-level DoH substitution, with a one-minute way to tell it from an outage.

Changed

  • The probe no longer trusts "Status":0. A substituting network returns a syntactically perfect answer with a stub address, so the payload is checked against stubPrefixes and reported as substituted.
  • STUB is declared only after one cache flush and a re-check. A stub cached while the path was intercepted stayed until TTL and looked permanent; today the monitor logs STUB_CLEARED and returns to healthy.
  • The STUB message says what it means: the path is intercepted, changing the resolver alone will not help.

Fixed

  • Importing the Zabbix modules required ZBX_USER/ZBX_PASSWORD: the check ran at module level. Credentials are now resolved in main().
  • A missing zabbix_sender produced a traceback. Now it names the binary and suggests the package to install; the path can be overridden with ZBX_SENDER.
  • Example data in the Zabbix part used real addresses and site names of one deployment; replaced with neutral examples.

0.4.1 — 2026-10-28

  • Every /tool fetch in the probe carries duration=5s, so a hung endpoint cannot block a scheduler run past its slot.
  • The tertiary endpoint is verified the same way as the secondary before switching.
  • The attempt counter is consistent across the chain; recovery climbs from plain DNS back to DoH instead of stopping at the last resort.

0.4.0 — 2026-10-28

  • In-memory probes (as-value output=user): no temp files in /file, no cleanup races.
  • Ordered chain: primary → secondary → tertiary (optional) → plain DNS (optional, logged PRIVACY DEGRADED).
  • New plain state with a return path to the primary.

0.3.1 — 2026-10-28

  • Content-aware verdicts: an answer is judged by what it contains, not by the fact that an address came back.
  • CLOCK_INVALID state: a wrong clock cannot validate certificates, and saying so beats a misleading "DoH down".

v0.2.0 — 2026-10-26

  • Filtering resolvers (Cloudflare Family, 1.1.1.3) are no longer the default: they answer the stub pair for filtered names by design.
  • device-mode=home is detected up front — fetch and the scheduler are unavailable there, so the monitor reports MANUAL-ONLY instead of failing silently.

v0.1.0 — 2026-10-22

First working scheme: one verified DoH upstream, a second as failover, a health check that compares answers instead of trusting "an IP came back".

Clone this wiki locally