oxidecomputer / oxidecomputer/omicron

External DNS server violates rfc8020 by returning NXDOMAIN for the `sys` label

Open
#11,095 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Rust
Stars
572
Forks
97
Avg merge
2d 12h
Merged PRs (30d)
96

Description

Creating this issue as requested by @hermanol

When a domain (e.g. cloud.example.com) is delegated to a rack, the rack is (ostensibly) authoritative for all labels under that zone. However, queries for the sys label itself (e.g. IN A sys.cloud.example.com) return NXDOMAIN. This violates RFC 8020 -- NXDOMAIN means the name and all names below it authoritatively do not exist. However, there are plenty of names below that label, such as all the silo names. Because recovery.sys.cloud.example.com exists, sys.cloud.example.com must also exist (and is an "empty non-terminal"). Queries for sys. should always return NOERROR with an empty answer section.

Here's an example of the incorrect behavior on Omicron running on my Helios VM at rel/v21/rc1. I can test with a newer version, but I believe this behavior doesn't change.

jreed@jreed-helios:~/omicron$ dig recovery.sys.oxide.test @192.168.1.20

; <<>> DiG 9.18.35 <<>> recovery.sys.oxide.test @192.168.1.20
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34606
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;recovery.sys.oxide.test.       IN      A

;; ANSWER SECTION:
recovery.sys.oxide.test. 0      IN      A       192.168.1.24
recovery.sys.oxide.test. 0      IN      A       192.168.1.22
recovery.sys.oxide.test. 0      IN      A       192.168.1.23

;; Query time: 0 msec
;; SERVER: 192.168.1.20#53(192.168.1.20) (UDP)
;; WHEN: Mon Aug 17 16:28:44 UTC 2026
;; MSG SIZE  rcvd: 112

jreed@jreed-helios:~/omicron$ dig sys.oxide.test @192.168.1.20

; <<>> DiG 9.18.35 <<>> sys.oxide.test @192.168.1.20
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 40736
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;sys.oxide.test.                        IN      A

;; Query time: 0 msec
;; SERVER: 192.168.1.20#53(192.168.1.20) (UDP)
;; WHEN: Mon Aug 17 16:28:46 UTC 2026
;; MSG SIZE  rcvd: 32

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the two dig queries from the issue and locate the external DNS handling for delegated rack zones. Trace why the sys label returns NXDOMAIN despite recovery.sys resolving. Done means sys. returns NOERROR with an empty answer section while descendant names continue to resolve, with coverage for this behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
networking
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.