7.9 KiB
CLI reference
nxdns <command> [options]
nxdns has six commands: run, check, export, import, version and help.
Flags take their value either way, --data-dir /srv/nxdns or --data-dir=/srv/nxdns. A command rejects a flag it has no use for.
run
Serves DNS and the web interface until it receives SIGINT or SIGTERM.
| Flag | Meaning |
|---|---|
--data-dir DIR |
The data directory, /var/lib/nxdns by default. Created at mode 0700 if missing. |
--config FILE |
Run in file mode, with FILE as the configuration. |
--admin-dev DIR |
Serve the web interface from DIR instead of the copy built into the binary. For developing the interface. |
Without --config, nxdns runs in database mode: the configuration is what config.db holds, and you change it in the web interface. With --config FILE, the file is the configuration: every start makes the database match it, and the web interface shows the configuration read-only. A file at /etc/nxdns/config.zon that no --config names is not read. The configuration model compares the two.
The log names the mode at every start:
info(nxdns): authority: database
info(nxdns): authority: file (/etc/nxdns/config.zon)
In file mode it first says what the file changed: entries added (+), changed (~) and removed (-) per list, and the settings that changed.
reconciled '/etc/nxdns/config.zon': upstreams +1 ~0 -0; settings +46 ~0 -0;
settings keys changed: dns.bind_ipv4 dns.port web.bind web.port …
web authentication is now enabled
A start whose file changed nothing says so:
reconciled '/etc/nxdns/config.zon': no changes
A blocklist whose URL the file still names keeps its download across restarts. Changing a list's URL makes it a new list, downloaded afresh.
In file mode, a file that is missing, unreadable or invalid stops the start with exit 2. nxdns never falls back to the database, which would leave you running a configuration you did not deploy:
FAIL /etc/nxdns/config.zon: no such file
nxdns run failed: ManagedConfigUnreadable
run `nxdns check` to see the configuration in full
check
Checks a configuration and tests the upstreams, then exits 0 if nothing failed and 2 if something did. It reports every problem, not just the first.
| Flag | Meaning |
|---|---|
--data-dir DIR |
The data directory whose config.db to check. |
--config FILE |
Check FILE instead of the database. |
Like run, it checks the file when you name one and the database when you do not, so nxdns check --config FILE checks exactly what nxdns run --config FILE would serve. Run it before you restart nxdns on a changed file.
It checks, in order:
- That the file or database can be read, and the file's syntax.
- Every rule in the configuration reference.
- For each DoH or DoT listener that is on, that the certificate and key load and belong together. A key that others can read is a warning.
- One real query for
example.comthrough each enabled upstream, within the configured timeouts. This needs network access.
checking configuration file /etc/nxdns/config.zon
OK upstreams[0] https://cloudflare-dns.com
OK: no problems found
Each problem is a FAIL or a WARN line. A WARN marks something allowed but probably unintended, such as a blocklist no group uses, and does not change the exit code. The last line sums up:
| Found | Last line | Exit |
|---|---|---|
| Nothing | OK: no problems found |
0 |
| Warnings only | OK: no failures found, 2 warnings |
0 |
| A failure | the FAIL lines, with no summary |
2 |
With no --config and no database yet, check says how to get one:
no config database at /var/lib/nxdns/config.db
load one with `nxdns import <file>`, or make a file the source of truth with `nxdns run --config <file>`
check never changes the database. Two of its findings are therefore not damage:
FAIL <db>: schema version <n>, this nxdns expects <m>; …: the database is from an older release. Starting nxdns upgrades it.FAIL <db>: uncheckpointed changes are waiting in <db>-wal, …: recent changes from a running nxdns are not in the main file yet. Check an export with--configinstead, or stop nxdns first.
export
Writes the configuration to standard output as ZON, or to a file with --out.
| Flag | Meaning |
|---|---|
--data-dir DIR |
The data directory holding config.db. |
--out FILE |
Write to FILE, created at mode 0600, instead of standard output. |
The output lists every setting, defaults included, in a fixed order with no timestamps, so exporting the same configuration twice gives the same bytes. It works while nxdns is running.
The password is written as .password = null with its hash in .password_hash, so the export restores the same password without revealing it. See Back up and restore.
import FILE
Makes the database match FILE, all at once or not at all. If FILE has any problem, import reports every one and changes nothing. It creates the data directory at mode 0700 if it is missing.
| Flag | Meaning |
|---|---|
--data-dir DIR |
The data directory holding config.db. |
--allow-delete |
Apply a file that removes entries the database holds. |
Stop nxdns before you import: a running server would pick up only part of the change.
Removing entries
Entries the database holds and FILE does not name are removed. That is how a restore undoes later changes, and also how importing the wrong file would empty a configured server, so import refuses until you add --allow-delete:
FAIL import: this file would delete rows the database holds (upstreams 1); re-run with --allow-delete to apply it
import failed: DestructiveImport
The message says how many entries of each kind would go. Nothing is changed, and the exit code is 2.
Adding entries or changing them needs no flag. An entry is recognised by these fields, and changing one of them removes the old entry and adds a new one:
| List | Recognised by |
|---|---|
upstreams, blocklist_sources |
url |
groups |
name |
clients |
ip |
client_prefixes |
prefix |
forward_zones |
zone |
local_records |
name, rtype and value |
rules |
group, pattern, kind and action |
Renaming a group or correcting an upstream's URL therefore needs --allow-delete; changing a client's group or a list's name does not.
What an import keeps
A blocklist whose URL is unchanged keeps its download. Devices nxdns discovered keep their history, and a device the file names keeps its first-seen and last-seen times. A discovered device whose group the file removes moves to default.
version
Prints the nxdns version, then the Zig version it was built with.
nxdns <version>
zig 0.16.0
help
Prints the usage text and exits 0. nxdns --help and nxdns -h do the same.
Exit codes
| Code | Meaning |
|---|---|
| 0 | Success. |
| 1 | A failure a retry might clear: a disk, network or database error, or running out of memory. |
| 2 | Something only you can fix: a configuration problem, a check that found one, a --config file that is missing or unreadable, an import that would remove entries, or a database nxdns refuses to open. |
| 64 | A wrong command line: an unknown command or flag, or a missing or extra argument. |
The packaged systemd unit restarts nxdns after exit 1 and not after exit 2 or 64, since restarting would only repeat the error. When run exits 2 it says what to do next:
run `nxdns check` to see the configuration in full
run also exits 2 when it refuses the query history database, querylog.db, rather than risk it. The message names the file and what to do. A database from a newer release, after you went back to an older one, is the usual case; see Going back to an older release.