Skip to content

docs: Update DNS forwarding page to VyOS 1.5 standards - #2163

Open
LiudmylaNad wants to merge 3 commits into
vyos:rollingfrom
LiudmylaNad:revise-DNS-forwarding
Open

docs: Update DNS forwarding page to VyOS 1.5 standards#2163
LiudmylaNad wants to merge 3 commits into
vyos:rollingfrom
LiudmylaNad:revise-DNS-forwarding

Conversation

@LiudmylaNad

Copy link
Copy Markdown
Contributor

Change Summary

This PR refactors the DNS Forwarding page to comply with the current VyOS documentation style guide.

Changes:

AI & SEO Context: Added :description: and :keywords: metadata tags.
Content: Proofread and improved.
Technical accuracy: Verified commands against VyOS 1.5.
Added examples for all commands.
Added notes covering the commit requirement
The style guide checklist was applied.

Moved Dynamic DNS to a separate file.

Added new conf-mode commands:
set service dns forwarding port <1-65535>
set service dns forwarding exclude-throttle-address
set service dns forwarding minimum-ttl-override <0-2147483647>
set service dns forwarding ttl-percent <0-100>
set service dns forwarding serve-stale-extension <0-65535>
set service dns forwarding nothing-below-nxdomain <no | dnssec | yes>
set service dns forwarding dns64-prefix
set service dns forwarding options ecs-add-for
set service dns forwarding options ecs-ipv4-bits <0-32>
set service dns forwarding options edns-subnet-allow-list
set service dns forwarding domain name-server port <1-65535>
set service dns forwarding authoritative-domain records mx server
set service dns forwarding authoritative-domain records mx server priority <1-999>
set service dns forwarding zone-cache source axfr
set service dns forwarding zone-cache source url
set service dns forwarding zone-cache options timeout <1-3600>
set service dns forwarding zone-cache options refresh interval <0-31536000>
set service dns forwarding zone-cache options refresh on-reload
set service dns forwarding zone-cache options retry-interval <1-86400>
set service dns forwarding zone-cache options max-zone-size <0-1024>
set service dns forwarding zone-cache options zonemd <ignore | validate | require>
set service dns forwarding zone-cache options dnssec <ignore | validate | require>

Related Task(s)

VD3765

Related PR(s)

Backport

Checklist:

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 1ae9b9fe-6b3a-4be5-8758-50f0d4e1f060

📥 Commits

Reviewing files that changed from the base of the PR and between a75d39f and 457aa79.

📒 Files selected for processing (1)
  • docs/configuration/service/dns.md
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • ansible/ansible (manual)
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/configuration/service/dns.md
📜 Recent review details
⏰ Context from checks skipped due to timeout. (2)
  • GitHub Check: Mergify Merge Protections
  • GitHub Check: Summary
⚠️ CI failures not shown inline (5)

GitHub Actions: AI Validation / validate: docs: Update DNS forwarding page to VyOS 1.5 standards

Conclusion: failure

View job details

##[group]Removing auth
 Removing SSH command configuration
 [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
 [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
 Removing HTTP extra header
 [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
 [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :"
 Removing includeIf entries pointing to credentials config files
 [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
 includeif.gitdir:/home/runner/work/vyos-documentation/vyos-documentation/.vyos-1x/.git.path
 includeif.gitdir:/home/runner/work/vyos-documentation/vyos-documentation/.vyos-1x/.git/worktrees/*.path
 includeif.gitdir:/github/workspace/.vyos-1x/.git.path
 includeif.gitdir:/github/workspace/.vyos-1x/.git/worktrees/*.path
 [command]/usr/bin/git config --local --get-all includeif.gitdir:/home/runner/work/vyos-documentation/vyos-documentation/.vyos-1x/.git.path
 /home/runner/work/_temp/git-credentials-640c6a2c-6334-4630-8502-b9f266990efb.config
 [command]/usr/bin/git config --local --unset includeif.gitdir:/home/runner/work/vyos-documentation/vyos-documentation/.vyos-1x/.git.path /home/runner/work/_temp/git-credentials-640c6a2c-6334-4630-8502-b9f266990efb.config
 [command]/usr/bin/git config --local --get-all includeif.gitdir:/home/runner/work/vyos-documentation/vyos-documentation/.vyos-1x/.git/worktrees/*.path
 /home/runner/work/_temp/git-credentials-640c6a2c-6334-4630-8502-b9f266990efb.config
 [command]/usr/bin/git config --local --unset includeif.gitdir:/home/runner/work/vyos-documentation/vyos-documentation/.vyos-1x/.git/worktrees/*.path /home/runne...

GitHub Actions: AI Validation / validate: docs: Update DNS forwarding page to VyOS 1.5 standards

Conclusion: failure

View job details

##[group]Run set -euo pipefail
 �[36;1mset -euo pipefail�[0m
 �[36;1mTARGET="rolling"�[0m
 �[36;1mMAPPED=$(jq -r --arg b "$TARGET" '.[$b] // empty' reviewer/branches.json)�[0m
 �[36;1mif [ -z "$MAPPED" ]; then�[0m
 �[36;1m  echo "::error::Docs branch '$TARGET' is not configured for AI validation. Add it to branches.json in vyos-docs-opus-reviewer (known: $(jq -c 'keys' reviewer/branches.json))."�[0m

GitHub Actions: AI Validation / prepare: docs: Update DNS forwarding page to VyOS 1.5 standards

Conclusion: failure

View job details

##[group]Run set -euo pipefail
 �[36;1mset -euo pipefail�[0m
 �[36;1m# Fetch the base branch explicitly by refname to avoid ambiguity with�[0m
 �[36;1m# same-named tags (e.g., a `rolling` tag), then diff against FETCH_HEAD.�[0m
 �[36;1mgit fetch --no-tags --depth=1 origin "refs/heads/rolling"�[0m
 �[36;1mBASE="FETCH_HEAD"�[0m
 �[36;1m# --diff-filter=ACMRT excludes Deleted entries so the bundling�[0m
 �[36;1m# loop below (`git show HEAD:<path>`) doesn't try to extract�[0m
 �[36;1m# blobs for files that no longer exist in the merge ref.�[0m
 �[36;1m# Deletions still appear in diff-md.patch (full diff) but not�[0m
 �[36;1m# in changed-md.txt (which drives the bundling step).�[0m
 �[36;1mgit diff "$BASE...HEAD" --name-only --diff-filter=ACMRT -z -- ':(glob)docs/**/*.md'  > changed-md.z�[0m
 �[36;1mgit diff "$BASE...HEAD" --name-only --diff-filter=ACMRT -z -- ':(glob)docs/**/*.rst' > changed-rst.z�[0m
 �[36;1m# Reject paths containing line-disrupting control bytes (LF, CR,�[0m
 �[36;1m# other 0x01-0x1F + 0x7F) before generating the newline-delimited�[0m
 �[36;1m# *.txt manifests. NUL itself can't appear in a git pathname�[0m
 �[36;1m# (it's the on-disk tree-entry terminator), so it stays out of�[0m
 �[36;1m# the rejection class and remains the legitimate record delimiter�[0m
 �[36;1m# for `git diff -z` — `grep -z` honors that contract.�[0m
 �[36;1m#�[0m
 �[36;1m# POSIX filesystems generally allow LF/CR in filenames and git�[0m
 �[36;1m# stores them fine; the hazard is purely in our line-delimited�[0m
 �[36;1m# downstream tooling. Without this guard, `tr '\0' '\n'` on a�[0m
 �[36;1m# path like `docs/foo\nbar.md` would split it into two logical�[0m
 �[36;1m# lines — downstream consumers reading line-by-line would miss�[0m
 �[36;1m# validation coverage on the real file (or worse, act on a�[0m
 �[36;1m# synthetic path). Fail fast at this seam.�[0m
 �[36;1m#�[0m
 �[36;1m# An earlier `tr -d '\0\n\r' | grep [\x00-\x1F\x7F]` form�[0m
 �[36;1m# stripped the very bytes it was m...

GitHub Actions: AI Validation / 0_validate.txt: docs: Update DNS forwarding page to VyOS 1.5 standards

Conclusion: failure

View job details

##[group]Run set -euo pipefail
 �[36;1mset -euo pipefail�[0m
 �[36;1mTARGET="rolling"�[0m
 �[36;1mMAPPED=$(jq -r --arg b "$TARGET" '.[$b] // empty' reviewer/branches.json)�[0m
 �[36;1mif [ -z "$MAPPED" ]; then�[0m
 �[36;1m  echo "::error::Docs branch '$TARGET' is not configured for AI validation. Add it to branches.json in vyos-docs-opus-reviewer (known: $(jq -c 'keys' reviewer/branches.json))."�[0m

GitHub Actions: AI Validation / 1_prepare.txt: docs: Update DNS forwarding page to VyOS 1.5 standards

Conclusion: failure

View job details

##[group]Run set -euo pipefail
 �[36;1mset -euo pipefail�[0m
 �[36;1m# Fetch the base branch explicitly by refname to avoid ambiguity with�[0m
 �[36;1m# same-named tags (e.g., a `rolling` tag), then diff against FETCH_HEAD.�[0m
 �[36;1mgit fetch --no-tags --depth=1 origin "refs/heads/rolling"�[0m
 �[36;1mBASE="FETCH_HEAD"�[0m
 �[36;1m# --diff-filter=ACMRT excludes Deleted entries so the bundling�[0m
 �[36;1m# loop below (`git show HEAD:<path>`) doesn't try to extract�[0m
 �[36;1m# blobs for files that no longer exist in the merge ref.�[0m
 �[36;1m# Deletions still appear in diff-md.patch (full diff) but not�[0m
 �[36;1m# in changed-md.txt (which drives the bundling step).�[0m
 �[36;1mgit diff "$BASE...HEAD" --name-only --diff-filter=ACMRT -z -- ':(glob)docs/**/*.md'  > changed-md.z�[0m
 �[36;1mgit diff "$BASE...HEAD" --name-only --diff-filter=ACMRT -z -- ':(glob)docs/**/*.rst' > changed-rst.z�[0m
 �[36;1m# Reject paths containing line-disrupting control bytes (LF, CR,�[0m
 �[36;1m# other 0x01-0x1F + 0x7F) before generating the newline-delimited�[0m
 �[36;1m# *.txt manifests. NUL itself can't appear in a git pathname�[0m
 �[36;1m# (it's the on-disk tree-entry terminator), so it stays out of�[0m
 �[36;1m# the rejection class and remains the legitimate record delimiter�[0m
 �[36;1m# for `git diff -z` — `grep -z` honors that contract.�[0m
 �[36;1m#�[0m
 �[36;1m# POSIX filesystems generally allow LF/CR in filenames and git�[0m
 �[36;1m# stores them fine; the hazard is purely in our line-delimited�[0m
 �[36;1m# downstream tooling. Without this guard, `tr '\0' '\n'` on a�[0m
 �[36;1m# path like `docs/foo\nbar.md` would split it into two logical�[0m
 �[36;1m# lines — downstream consumers reading line-by-line would miss�[0m
 �[36;1m# validation coverage on the real file (or worse, act on a�[0m
 �[36;1m# synthetic path). Fail fast at this seam.�[0m
 �[36;1m#�[0m
 �[36;1m# An earlier `tr -d '\0\n\r' | grep [\x00-\x1F\x7F]` form�[0m
 �[36;1m# stripped the very bytes it was m...
🧰 Additional context used
🔍 Remote MCP vyos.dev

Additional relevant context

  • Custom DNS ports: T738 documents support for custom listening and upstream resolver ports, including listen-address ... port 5353; it is Resolved and marked compatible. This supports reviewing the new port documentation for correct scope and examples.
  • DNS-over-TLS/integration use case: T5113 requested custom upstream ports to support alternative resolvers and PowerDNS DNS-over-TLS via port 853. It is Resolved and marked compatible.
  • DNS64: T4509 requested exposing PowerDNS’s dns64-prefix through VyOS configuration; it is Resolved, low priority, and marked compatible.
  • Listening-address migration caveat: T3866 records that migration from listen-on <interface> to address-based DNS forwarding can fail for OpenVPN or interfaces without fixed addresses. The task is Resolved but classified as syntax-incompatible, so the documentation should clearly distinguish current listen-address requirements and migration implications.

📝 Walkthrough

Summary by CodeRabbit

  • Documentation
    • Expanded and modernized DNS forwarding documentation with a clearer introduction and committability note (requires listen-address and allow-from).
    • Added detailed guidance on forwarding/service controls, caching/timer parameters, DNSSEC behavior, NXDOMAIN cut handling, DNS64 (dns64-prefix), and EDNS Client Subnet tuning.
    • Significantly extended authoritative DNS documentation, including zone and per-record enable/disable options, TTL configuration, and additional record types (including NAPTR details).
    • Updated operational commands and guidance for viewing statistics, logs, and handling reset/restart with cache-clearing notes.
    • Refreshed configuration examples to match the expanded command set.

Walkthrough

The DNS forwarding documentation was rewritten with expanded forwarding, authoritative zone, zone-caching, operational command, and split-horizon example references.

Changes

DNS service reference

Layer / File(s) Summary
Forwarding configuration controls
docs/configuration/service/dns.md
Lines 1–475 revise the introduction and document listener, upstream, cache, timer, DNSSEC, NXDOMAIN, DNS64, ECS, and per-domain forwarding controls.
Domain and authoritative zone controls
docs/configuration/service/dns.md
Lines 476–867 document zone and record enablement, TTLs, record types, and NAPTR options.
Zone caching reference
docs/configuration/service/dns.md
Lines 868–1003 document AXFR and URL retrieval sources, timing and size controls, ZONEMD handling, and DNSSEC validation policies.
Operations and example configuration
docs/configuration/service/dns.md
Lines 1004–1088 add statistics and log commands, describe cache-clearing reset behavior, and reformat the split-horizon example configuration.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed Accurately summarizes the DNS forwarding docs rewrite for VyOS 1.5 standards.
Description check ✅ Passed The description matches the DNS forwarding documentation rewrite and lists the main additions and move.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Fix failing CI checks
✨ Simplify code
  • Create PR with simplified code

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/configuration/service/dns.md`:
- Around line 287-292: Update the serve-stale-extension description in the DNS
configuration documentation to state that the expired record’s TTL is extended
when a refresh fails to update it successfully, rather than implying it is
served while refresh is still in progress.
- Around line 370-378: Update the ecs-add-for documentation to state that it
selects the client source address only when ECS is emitted, which additionally
requires the outgoing query to match edns-subnet-allow-list; remove the
implication that non-matching clients always send a placeholder ECS address. In
the ecs-ipv4-bits documentation, clarify that the setting applies only when the
ECS option is emitted.
- Around line 242-249: Update the minimum-ttl-override documentation near the
cfgcmd definition to describe it as a returned TTL floor: authoritative TTLs
below the configured value are raised to that value when cached and returned,
rather than describing the setting only as cache retention. Preserve the
existing default and range details.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: afb190b8-bb8a-4a15-8008-f777f688fbf6

📥 Commits

Reviewing files that changed from the base of the PR and between 56fe7c6 and 8d5b07c.

📒 Files selected for processing (1)
  • docs/configuration/service/dns.md
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • ansible/ansible (manual)
📜 Review details
⏰ Context from checks skipped due to timeout. (2)
  • GitHub Check: Mergify Merge Protections
  • GitHub Check: Summary
⚠️ CI failures not shown inline (5)

GitHub Actions: AI Validation / validate: docs: Update DNS forwarding page to VyOS 1.5 standards

Conclusion: failure

View job details

##[group]Removing auth
 Removing SSH command configuration
 [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
 [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
 Removing HTTP extra header
 [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
 [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :"
 Removing includeIf entries pointing to credentials config files
 [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
 includeif.gitdir:/home/runner/work/vyos-documentation/vyos-documentation/.vyos-1x/.git.path
 includeif.gitdir:/home/runner/work/vyos-documentation/vyos-documentation/.vyos-1x/.git/worktrees/*.path
 includeif.gitdir:/github/workspace/.vyos-1x/.git.path
 includeif.gitdir:/github/workspace/.vyos-1x/.git/worktrees/*.path
 [command]/usr/bin/git config --local --get-all includeif.gitdir:/home/runner/work/vyos-documentation/vyos-documentation/.vyos-1x/.git.path
 /home/runner/work/_temp/git-credentials-4115be56-f389-471c-b7a9-fa4fbf77c6e9.config
 [command]/usr/bin/git config --local --unset includeif.gitdir:/home/runner/work/vyos-documentation/vyos-documentation/.vyos-1x/.git.path /home/runner/work/_temp/git-credentials-4115be56-f389-471c-b7a9-fa4fbf77c6e9.config
 [command]/usr/bin/git config --local --get-all includeif.gitdir:/home/runner/work/vyos-documentation/vyos-documentation/.vyos-1x/.git/worktrees/*.path
 /home/runner/work/_temp/git-credentials-4115be56-f389-471c-b7a9-fa4fbf77c6e9.config
 [command]/usr/bin/git config --local --unset includeif.gitdir:/home/runner/work/vyos-documentation/vyos-documentation/.vyos-1x/.git/worktrees/*.path /home/runne...

GitHub Actions: AI Validation / validate: docs: Update DNS forwarding page to VyOS 1.5 standards

Conclusion: failure

View job details

##[group]Run set -euo pipefail
 �[36;1mset -euo pipefail�[0m
 �[36;1mTARGET="rolling"�[0m
 �[36;1mMAPPED=$(jq -r --arg b "$TARGET" '.[$b] // empty' reviewer/branches.json)�[0m
 �[36;1mif [ -z "$MAPPED" ]; then�[0m
 �[36;1m  echo "::error::Docs branch '$TARGET' is not configured for AI validation. Add it to branches.json in vyos-docs-opus-reviewer (known: $(jq -c 'keys' reviewer/branches.json))."�[0m

GitHub Actions: AI Validation / 1_prepare.txt: docs: Update DNS forwarding page to VyOS 1.5 standards

Conclusion: failure

View job details

##[group]Run set -euo pipefail
 �[36;1mset -euo pipefail�[0m
 �[36;1m# Fetch the base branch explicitly by refname to avoid ambiguity with�[0m
 �[36;1m# same-named tags (e.g., a `rolling` tag), then diff against FETCH_HEAD.�[0m
 �[36;1mgit fetch --no-tags --depth=1 origin "refs/heads/rolling"�[0m
 �[36;1mBASE="FETCH_HEAD"�[0m
 �[36;1m# --diff-filter=ACMRT excludes Deleted entries so the bundling�[0m
 �[36;1m# loop below (`git show HEAD:<path>`) doesn't try to extract�[0m
 �[36;1m# blobs for files that no longer exist in the merge ref.�[0m
 �[36;1m# Deletions still appear in diff-md.patch (full diff) but not�[0m
 �[36;1m# in changed-md.txt (which drives the bundling step).�[0m
 �[36;1mgit diff "$BASE...HEAD" --name-only --diff-filter=ACMRT -z -- ':(glob)docs/**/*.md'  > changed-md.z�[0m
 �[36;1mgit diff "$BASE...HEAD" --name-only --diff-filter=ACMRT -z -- ':(glob)docs/**/*.rst' > changed-rst.z�[0m
 �[36;1m# Reject paths containing line-disrupting control bytes (LF, CR,�[0m
 �[36;1m# other 0x01-0x1F + 0x7F) before generating the newline-delimited�[0m
 �[36;1m# *.txt manifests. NUL itself can't appear in a git pathname�[0m
 �[36;1m# (it's the on-disk tree-entry terminator), so it stays out of�[0m
 �[36;1m# the rejection class and remains the legitimate record delimiter�[0m
 �[36;1m# for `git diff -z` — `grep -z` honors that contract.�[0m
 �[36;1m#�[0m
 �[36;1m# POSIX filesystems generally allow LF/CR in filenames and git�[0m
 �[36;1m# stores them fine; the hazard is purely in our line-delimited�[0m
 �[36;1m# downstream tooling. Without this guard, `tr '\0' '\n'` on a�[0m
 �[36;1m# path like `docs/foo\nbar.md` would split it into two logical�[0m
 �[36;1m# lines — downstream consumers reading line-by-line would miss�[0m
 �[36;1m# validation coverage on the real file (or worse, act on a�[0m
 �[36;1m# synthetic path). Fail fast at this seam.�[0m
 �[36;1m#�[0m
 �[36;1m# An earlier `tr -d '\0\n\r' | grep [\x00-\x1F\x7F]` form�[0m
 �[36;1m# stripped the very bytes it was m...

GitHub Actions: AI Validation / 0_validate.txt: docs: Update DNS forwarding page to VyOS 1.5 standards

Conclusion: failure

View job details

##[group]Run set -euo pipefail
 �[36;1mset -euo pipefail�[0m
 �[36;1mTARGET="rolling"�[0m
 �[36;1mMAPPED=$(jq -r --arg b "$TARGET" '.[$b] // empty' reviewer/branches.json)�[0m
 �[36;1mif [ -z "$MAPPED" ]; then�[0m
 �[36;1m  echo "::error::Docs branch '$TARGET' is not configured for AI validation. Add it to branches.json in vyos-docs-opus-reviewer (known: $(jq -c 'keys' reviewer/branches.json))."�[0m

GitHub Actions: AI Validation / prepare: docs: Update DNS forwarding page to VyOS 1.5 standards

Conclusion: failure

View job details

##[group]Run set -euo pipefail
 �[36;1mset -euo pipefail�[0m
 �[36;1m# Fetch the base branch explicitly by refname to avoid ambiguity with�[0m
 �[36;1m# same-named tags (e.g., a `rolling` tag), then diff against FETCH_HEAD.�[0m
 �[36;1mgit fetch --no-tags --depth=1 origin "refs/heads/rolling"�[0m
 �[36;1mBASE="FETCH_HEAD"�[0m
 �[36;1m# --diff-filter=ACMRT excludes Deleted entries so the bundling�[0m
 �[36;1m# loop below (`git show HEAD:<path>`) doesn't try to extract�[0m
 �[36;1m# blobs for files that no longer exist in the merge ref.�[0m
 �[36;1m# Deletions still appear in diff-md.patch (full diff) but not�[0m
 �[36;1m# in changed-md.txt (which drives the bundling step).�[0m
 �[36;1mgit diff "$BASE...HEAD" --name-only --diff-filter=ACMRT -z -- ':(glob)docs/**/*.md'  > changed-md.z�[0m
 �[36;1mgit diff "$BASE...HEAD" --name-only --diff-filter=ACMRT -z -- ':(glob)docs/**/*.rst' > changed-rst.z�[0m
 �[36;1m# Reject paths containing line-disrupting control bytes (LF, CR,�[0m
 �[36;1m# other 0x01-0x1F + 0x7F) before generating the newline-delimited�[0m
 �[36;1m# *.txt manifests. NUL itself can't appear in a git pathname�[0m
 �[36;1m# (it's the on-disk tree-entry terminator), so it stays out of�[0m
 �[36;1m# the rejection class and remains the legitimate record delimiter�[0m
 �[36;1m# for `git diff -z` — `grep -z` honors that contract.�[0m
 �[36;1m#�[0m
 �[36;1m# POSIX filesystems generally allow LF/CR in filenames and git�[0m
 �[36;1m# stores them fine; the hazard is purely in our line-delimited�[0m
 �[36;1m# downstream tooling. Without this guard, `tr '\0' '\n'` on a�[0m
 �[36;1m# path like `docs/foo\nbar.md` would split it into two logical�[0m
 �[36;1m# lines — downstream consumers reading line-by-line would miss�[0m
 �[36;1m# validation coverage on the real file (or worse, act on a�[0m
 �[36;1m# synthetic path). Fail fast at this seam.�[0m
 �[36;1m#�[0m
 �[36;1m# An earlier `tr -d '\0\n\r' | grep [\x00-\x1F\x7F]` form�[0m
 �[36;1m# stripped the very bytes it was m...
🧰 Additional context used
📓 Path-based instructions (2)
docs/**/*.md

📄 CodeRabbit inference engine (AGENTS.md)

docs/**/*.md: Canonical docs pages must be written as MyST Markdown (.md); edit existing pages in .md only and never use the old md- prefix for new pages.
Use {cfgcmd}, {opcmd}, and {cmdincludemd} fenced directives in MyST pages for VyOS command coverage; do not replace them with plain text or bash fences.
Use MyST ATX headings (#, ##, ###, etc.) in canonical pages; the RST heading hierarchy does not apply to .md sources.
In MyST pages, prefer single backticks for inline code; double backticks are reserved for embedded RST contexts.
Use % stop_vyoslinter and % start_vyoslinter comment markers in top-level MyST content to suppress real IPs or other allowed long-line exceptions, and keep them paired.
In MyST pages, write TODO markers as {todo} fenced directives.

Files:

  • docs/configuration/service/dns.md
docs/{_include/*.txt,**/*.md}

📄 CodeRabbit inference engine (AGENTS.md)

Keep documentation lines within 80 characters unless the content is inside a code block or fenced/preformatted block.

Files:

  • docs/configuration/service/dns.md
🧠 Learnings (13)
📚 Learning: 2026-05-06T20:48:49.689Z
Learnt from: andamasov
Repo: vyos/vyos-documentation PR: 1902
File: CLAUDE.md:71-71
Timestamp: 2026-05-06T20:48:49.689Z
Learning: In vyos/vyos-documentation, the 80-character line-length rule documented under Source conventions / Formatting applies only to documentation source files located under docs/ (e.g., docs/**/*.rst and docs/**/*.md). The rule is enforced by the vyoslinter (doc-linter.py from vyos/.github) when reviewing changed files via lint-doc.yml, and only for files within docs/**. Do not suggest hard-wrapping CLAUDE.md (repo-root documentation) because GitHub renders and reflows content. For CLAUDE.md, reviews should not enforce the 80-char wrapping; apply the rule only to files matching **/docs/**/*.{rst,md}.

Applied to files:

  • docs/configuration/service/dns.md
📚 Learning: 2026-05-06T20:48:57.970Z
Learnt from: andamasov
Repo: vyos/vyos-documentation PR: 1902
File: CLAUDE.md:91-93
Timestamp: 2026-05-06T20:48:57.970Z
Learning: The 80-character line limit applies only to documentation sources under docs/** (RST/MD). Do not enforce this limit on repo-root Markdown files like CLAUDE.md or README.md. The vyoslinter (doc-linter.py, run via lint-doc.yml from vyos/.github) lints only changed files within docs/**; root files are excluded. GitHub renders root Markdown with viewport-width reflow, so hard-wrapping these files reduces readability without tooling benefit.

Applied to files:

  • docs/configuration/service/dns.md
📚 Learning: 2026-05-06T20:48:50.446Z
Learnt from: andamasov
Repo: vyos/vyos-documentation PR: 1902
File: CLAUDE.md:64-64
Timestamp: 2026-05-06T20:48:50.446Z
Learning: Enforce the 80-character line-length limit only for documentation source files under docs/ (docs/**/*.md and docs/**/*.rst rendered by Sphinx and linted by vyoslinter via lint-doc.yml). Do not flag line-length issues in repository-root Markdown files such as CLAUDE.md or README.md, which GitHub renders with viewport-width reflow. This applies to all files within docs/ that are part of the documentation source.

Applied to files:

  • docs/configuration/service/dns.md
📚 Learning: 2026-05-06T20:48:54.578Z
Learnt from: andamasov
Repo: vyos/vyos-documentation PR: 1902
File: CLAUDE.md:80-84
Timestamp: 2026-05-06T20:48:54.578Z
Learning: Enforce the 80-character line-length limit only for documentation source files under docs/ (docs/**/*.rst and docs/**/*.md). Do not flag repo-root files like CLAUDE.md or README.md, since they are rendered by GitHub and not subject to this rule. The doc-linter (doc-linter.py via lint-doc.yml) only lints docs/**, so CI checks won't flag root files for line length.

Applied to files:

  • docs/configuration/service/dns.md
📚 Learning: 2026-05-06T20:49:00.044Z
Learnt from: andamasov
Repo: vyos/vyos-documentation PR: 1902
File: CLAUDE.md:108-108
Timestamp: 2026-05-06T20:49:00.044Z
Learning: Limit the 80-character line length check and vyoslinter (doc-linter.py) enforcement to documentation source files under docs/**/*.{rst,md}. Do not apply or flag line-length issues in repo-root files like CLAUDE.md or README.md, which are rendered directly by GitHub and are not linted by lint-doc.yml. This pattern narrows checks to Sphinx source docs and prevents false positives in non-doc files.

Applied to files:

  • docs/configuration/service/dns.md
📚 Learning: 2026-05-06T20:48:53.302Z
Learnt from: andamasov
Repo: vyos/vyos-documentation PR: 1902
File: CLAUDE.md:79-79
Timestamp: 2026-05-06T20:48:53.302Z
Learning: Limit line length to 80 characters only for documentation sources under the docs directory (docs/**/*.rst and docs/**/*.md). This is enforced by the vyoslinter doc-linter.py (from the vyos/.github repo) via lint-doc.yml on changed files under docs/**. Do not flag line-length violations in repository-root Markdown files like CLAUDE.md or README.md, as they are rendered by GitHub and reflow in the UI.

Applied to files:

  • docs/configuration/service/dns.md
📚 Learning: 2026-05-06T20:49:10.359Z
Learnt from: andamasov
Repo: vyos/vyos-documentation PR: 1902
File: CLAUDE.md:142-142
Timestamp: 2026-05-06T20:49:10.359Z
Learning: In vyos/vyos-documentation, the 80-character line limit and vyoslinter enforcement apply only to documentation source files under docs/**/*.rst and docs/**/*.md that Sphinx renders. Repo-root files such as CLAUDE.md and README.md are outside the linter's scope (lint-doc.yml runs on docs/**) and are rendered by GitHub with automatic paragraph reflow — do not flag line-length violations in these files.

Applied to files:

  • docs/configuration/service/dns.md
📚 Learning: 2026-05-06T20:49:15.361Z
Learnt from: andamasov
Repo: vyos/vyos-documentation PR: 1902
File: CLAUDE.md:163-163
Timestamp: 2026-05-06T20:49:15.361Z
Learning: In vyos/vyos-documentation, enforce the 80-character line-length limit (Source conventions / Formatting) only for Sphinx documentation source files under docs/**/*.rst and docs/**/*.md. The lint-doc.yml workflow runs the doc-linter (doc-linter.py) and checks only docs/** changed files. Files in the repository root (e.g., CLAUDE.md, README.md) are rendered by GitHub and are not subject to this rule; do not flag line-length violations in those files.

Applied to files:

  • docs/configuration/service/dns.md
📚 Learning: 2026-05-08T07:01:22.978Z
Learnt from: andamasov
Repo: vyos/vyos-documentation PR: 1878
File: docs/troubleshooting/connectivity.rst:0-0
Timestamp: 2026-05-08T07:01:22.978Z
Learning: For the VyOS documentation (MyST-based docs), MyST directive opener lines must keep the entire directive arguments on a single line. This includes MyST fenced-directive openers like ```{opcmd} ... ``` and the RST-equivalent form .. opcmd:: ... when ported/used in MyST. Because the MyST parser does not support wrapped/continued directive arguments across multiple lines, do not raise/keep review warnings suggesting line wrapping for these directive opener lines due to line-length (even if they exceed 80 characters).

Applied to files:

  • docs/configuration/service/dns.md
📚 Learning: 2026-05-08T07:01:22.978Z
Learnt from: andamasov
Repo: vyos/vyos-documentation PR: 1878
File: docs/troubleshooting/connectivity.rst:0-0
Timestamp: 2026-05-08T07:01:22.978Z
Learning: In vyos/vyos-documentation, do not raise line-length (>80 chars) review findings for MyST directive opener lines (the directive “opener” that uses MyST directive syntax such as `{cfgcmd}` / `{opcmd}` fence/openers). CI does not enforce the 80-character limit for these specific opener lines, and existing documentation contains longer opener lines that pass lint.

Applied to files:

  • docs/configuration/service/dns.md
📚 Learning: 2026-05-13T22:16:06.198Z
Learnt from: andamasov
Repo: vyos/vyos-documentation PR: 2021
File: docs/automation/terraform/terraformvyos.md:14-14
Timestamp: 2026-05-13T22:16:06.198Z
Learning: In the vyos/vyos-documentation repo, when a PR is a byte-for-byte documentation port of an existing file from the rolling branch to a release branch (e.g., circinus, sagitta), keep the port content identical to the production-tested rolling source. For these ports, do not raise new review findings for documentation issues that are already present in the rolling source (for example, markdownlint MD059 like non-descriptive link text such as `[link]`/`[install]`). Instead, defer those existing issues to a rolling-side cleanup PR (e.g., `#2024`) and then backport the cleanup via Mergify.

Applied to files:

  • docs/configuration/service/dns.md
📚 Learning: 2026-05-13T22:43:41.056Z
Learnt from: andamasov
Repo: vyos/vyos-documentation PR: 2024
File: docs/automation/terraform/terraformvyos.md:0-0
Timestamp: 2026-05-13T22:43:41.056Z
Learning: In docs/**/*.md, for Markdown reference definition lines of the form `[label]: <URL>`, if the line cannot be shortened to <= 80 characters (because the URL itself is near/at the limit), suppress the vyoslinter warning by wrapping only that reference definition with a `% stop_vyoslinter` / `% start_vyoslinter` block. If the reference definition can fit within 80 characters, leave it outside any suppression block.

Applied to files:

  • docs/configuration/service/dns.md
📚 Learning: 2026-06-05T19:21:44.474Z
Learnt from: LiudmylaNad
Repo: vyos/vyos-documentation PR: 2066
File: docs/configuration/protocols/traffic-engineering.md:0-0
Timestamp: 2026-06-05T19:21:44.474Z
Learning: In the vyos/vyos-documentation MyST documentation pages, when writing CLI example invocations directly under a `{cfgcmd}` directive, use `none` fenced code blocks for those examples. Do not change these example blocks to `{opcmd}` or `{cfgcmd}`—`{opcmd}` is reserved for operational-mode commands, and the surrounding `{cfgcmd}` directive already documents the target command. Plain `none` blocks for these CLI examples are intentional and correct.

Applied to files:

  • docs/configuration/service/dns.md
🔍 Remote MCP vyos.dev

Relevant context

  • Task "PowerDNS refresh-on-ttl-perc, nothing-below-nxdomain, minimum-ttl-override, response policy zones (malware / adblocking)" is Resolved and explicitly asks for these options to be exposed under service dns forwarding; it also flags RPZ memory/reload-time impact and DNSSEC interaction as things worth documenting.
  • That same task’s comment history links it to PR 5209.
  • Task "Remote attacker can execute arbitrary code via a specially crafted DDNS update DHCP client message" is Resolved and says that when DHCP dynamic host file update and DNS forwarding are enabled, unescaped host/zone values can inject Lua code. This is relevant to the PR’s removal of Dynamic DNS content from the DNS forwarding page.
🔇 Additional comments (1)
docs/configuration/service/dns.md (1)

1-32: LGTM!

Also applies to: 34-211, 213-240, 252-285, 301-366, 416-866, 868-1002, 1004-1072

Comment thread docs/configuration/service/dns.md Outdated
Comment thread docs/configuration/service/dns.md
Comment thread docs/configuration/service/dns.md Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request refreshes the DNS forwarding documentation page to align with VyOS 1.5 documentation conventions (metadata, structure, expanded command coverage, and updated operational examples).

Changes:

  • Added MyST html_meta metadata (description, keywords) and rewrote introductory/configuration guidance to match current doc style.
  • Expanded and reorganized DNS forwarding configuration coverage (listener options, upstream forwarding, DNSSEC/NXDOMAIN behavior, DNS64, ECS, authoritative records, zone caching).
  • Updated and extended operational commands and end-to-end configuration example(s).

Comment thread docs/configuration/service/dns.md Outdated
Comment thread docs/configuration/service/dns.md
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Development

Successfully merging this pull request may close these issues.

2 participants