DNS Forwarding
VyOS uses PowerDNS Recursor to provide a DNS forwarding service - lightweight DNS infrastructure for small and medium-sized networks.
Overview
DNS Forwarding allows you to:
- Cache DNS queries to speed up name resolution
- Forward queries to upstream DNS servers
- Provide split-horizon DNS (different answers for different domains)
- Act as a recursive DNS server
- Host authoritative DNS zones
Basic Configuration
Minimal Setup
set service dns forwarding listen-address '192.168.1.1'
set service dns forwarding allow-from '192.168.1.0/24'
commitThis configuration:
- Listens on address 192.168.1.1
- Accepts queries from the 192.168.1.0/24 network
- Uses the system DNS servers as upstream
Specifying Upstream DNS Servers
Explicitly specifying DNS servers:
set service dns forwarding listen-address '192.168.1.1'
set service dns forwarding allow-from '192.168.1.0/24'
set service dns forwarding name-server '8.8.8.8'
set service dns forwarding name-server '8.8.4.4'
commitUsing System DNS Servers
set service dns forwarding system
commitThis uses the DNS servers configured on the system (for example, obtained via DHCP on the WAN interface).
Using DNS from a DHCP Client
set service dns forwarding dhcp eth0
commitThe DNS server will use the nameservers obtained via DHCP on the eth0 interface.
Listen Address
The addresses on which the DNS server accepts queries:
Single address:
set service dns forwarding listen-address '192.168.1.1'Multiple addresses:
set service dns forwarding listen-address '192.168.1.1'
set service dns forwarding listen-address '192.168.2.1'
set service dns forwarding listen-address '::1'Listen on all interfaces (not recommended):
set service dns forwarding listen-address '0.0.0.0'Access Control
Allow From
Allowing queries from specific networks:
set service dns forwarding allow-from '192.168.1.0/24'
set service dns forwarding allow-from '192.168.2.0/24'
set service dns forwarding allow-from '10.0.0.0/8'By default, if not specified, only queries from localhost are allowed.
Ignore Hosts File
Ignoring the local /etc/hosts file:
set service dns forwarding ignore-hosts-file
commitDomain-Specific Forwarding
Forwarding queries for specific domains to dedicated DNS servers.
Basic Example
Sending queries for the example.com domain to a corporate DNS server:
set service dns forwarding domain example.com name-server '192.168.100.1'
commitSplit-Horizon DNS
Different DNS servers for internal and external domains:
# Internal domains to the internal DNS
set service dns forwarding domain corp.local name-server '192.168.1.10'
set service dns forwarding domain internal.local name-server '192.168.1.10'
# External queries to public DNS
set service dns forwarding name-server '8.8.8.8'
set service dns forwarding name-server '1.1.1.1'
commitReverse DNS Zones
Forwarding reverse DNS zones:
set service dns forwarding domain 1.168.192.in-addr.arpa name-server '192.168.1.10'
set service dns forwarding domain 2.168.192.in-addr.arpa name-server '192.168.2.10'
commitRecursive Lookups in Subdomains
Adding the addNTA option to bypass DNSSEC:
set service dns forwarding domain example.com addnta
commitCaching
Cache Size
DNS cache size (number of records):
set service dns forwarding cache-size 10000
commitDefault: 10000 records.
For high-load networks:
set service dns forwarding cache-size 50000
commitNegative TTL
The caching time for negative responses (NXDOMAIN):
set service dns forwarding negative-ttl 3600
commitValue in seconds. Default: 3600 (1 hour).
DNSSEC
DNS Security Extensions for verifying the authenticity of DNS responses.
DNSSEC Modes
set service dns forwarding dnssec <mode>Available modes:
- off - DNSSEC disabled (default)
- process-no-validate - process DNSSEC records but do not validate
- process - process and validate
- log-fail - log validation failures
- validate - strict validation (reject invalid responses)
Recommended setting:
set service dns forwarding dnssec validate
commitAuthoritative Domains
Hosting your own DNS zones on VyOS.
Creating a Zone
set service dns forwarding authoritative-domain example.local
commitAdding Records
A Record (IPv4)
set service dns forwarding authoritative-domain example.local records a server1 address '192.168.1.10'
set service dns forwarding authoritative-domain example.local records a server2 address '192.168.1.20'
commitAAAA Record (IPv6)
set service dns forwarding authoritative-domain example.local records aaaa server1 address '2001:db8::10'
commitCNAME Record (Alias)
set service dns forwarding authoritative-domain example.local records cname www target 'server1.example.local'
commitMX Record (Mail)
set service dns forwarding authoritative-domain example.local records mx mail priority 10
set service dns forwarding authoritative-domain example.local records mx mail server 'mail.example.local'
commitNS Record (Name Server)
set service dns forwarding authoritative-domain example.local records ns ns1 target 'dns1.example.local'
commitPTR Record (Reverse DNS)
set service dns forwarding authoritative-domain 1.168.192.in-addr.arpa records ptr 10 target 'server1.example.local'
commitTXT Record
set service dns forwarding authoritative-domain example.local records txt spf value 'v=spf1 mx ~all'
commitSRV Record (Service)
set service dns forwarding authoritative-domain example.local records srv _ldap._tcp entry 0
set service dns forwarding authoritative-domain example.local records srv _ldap._tcp entry 0 hostname 'ldap.example.local'
set service dns forwarding authoritative-domain example.local records srv _ldap._tcp entry 0 port 389
set service dns forwarding authoritative-domain example.local records srv _ldap._tcp entry 0 priority 10
set service dns forwarding authoritative-domain example.local records srv _ldap._tcp entry 0 weight 100
commitPerformance and Timeouts
Timeout
Timeout for DNS queries (milliseconds):
set service dns forwarding timeout 1500
commitDefault: 1500ms.
Max Cache Entries
Maximum number of cached records:
set service dns forwarding max-cache-entries 100000
commitConfiguration Examples
Home Network
# Basic setup
set service dns forwarding listen-address '192.168.1.1'
set service dns forwarding allow-from '192.168.1.0/24'
# Public DNS servers
set service dns forwarding name-server '8.8.8.8'
set service dns forwarding name-server '1.1.1.1'
# Cache
set service dns forwarding cache-size 10000
commitCorporate Network with Split-Horizon
# Listen on the management interface
set service dns forwarding listen-address '192.168.10.1'
set service dns forwarding allow-from '192.168.0.0/16'
# Internal domains to the corporate DNS
set service dns forwarding domain corp.local name-server '192.168.1.10'
set service dns forwarding domain corp.local name-server '192.168.1.11'
# Reverse zones
set service dns forwarding domain 10.168.192.in-addr.arpa name-server '192.168.1.10'
set service dns forwarding domain 20.168.192.in-addr.arpa name-server '192.168.1.10'
# External queries
set service dns forwarding name-server '8.8.8.8'
set service dns forwarding name-server '8.8.4.4'
# Cache and DNSSEC
set service dns forwarding cache-size 50000
set service dns forwarding dnssec validate
commitAuthoritative Zone for a Local Network
# DNS forwarding
set service dns forwarding listen-address '192.168.1.1'
set service dns forwarding allow-from '192.168.1.0/24'
set service dns forwarding name-server '8.8.8.8'
# Local domain
set service dns forwarding authoritative-domain home.local
# Servers
set service dns forwarding authoritative-domain home.local records a router address '192.168.1.1'
set service dns forwarding authoritative-domain home.local records a nas address '192.168.1.10'
set service dns forwarding authoritative-domain home.local records a printer address '192.168.1.20'
# Aliases
set service dns forwarding authoritative-domain home.local records cname gateway target 'router.home.local'
set service dns forwarding authoritative-domain home.local records cname storage target 'nas.home.local'
commitMulti-Site with Several Locations
# DNS forwarding
set service dns forwarding listen-address '10.0.0.1'
set service dns forwarding allow-from '10.0.0.0/8'
# HQ site
set service dns forwarding domain hq.corp.local name-server '10.1.0.10'
# Branch office 1
set service dns forwarding domain branch1.corp.local name-server '10.10.0.10'
# Branch office 2
set service dns forwarding domain branch2.corp.local name-server '10.20.0.10'
# Shared corporate domain
set service dns forwarding domain corp.local name-server '10.1.0.10'
set service dns forwarding domain corp.local name-server '10.1.0.11'
# Internet
set service dns forwarding name-server '8.8.8.8'
set service dns forwarding name-server '1.1.1.1'
# Performance
set service dns forwarding cache-size 100000
set service dns forwarding dnssec validate
commitDNSSEC with Validation
set service dns forwarding listen-address '192.168.1.1'
set service dns forwarding allow-from '192.168.1.0/24'
# DNS servers with DNSSEC support
set service dns forwarding name-server '1.1.1.1'
set service dns forwarding name-server '9.9.9.9'
# Enable DNSSEC validation
set service dns forwarding dnssec validate
# Increase the cache for DNSSEC
set service dns forwarding cache-size 20000
commitOperational Commands
Clearing the Cache
Full cache flush:
reset dns forwarding allFlush for a specific domain:
reset dns forwarding domain example.comRestarting the Service
restart dns forwardingViewing Statistics
Show DNS statistics:
show dns forwarding statisticsTesting
Verifying name resolution through VyOS DNS:
nslookup example.com 192.168.1.1or
dig @192.168.1.1 example.comLogs
Viewing DNS logs:
show log dns forwarding
monitor log | grep recursorIntegration with DHCP
The DHCP server can automatically use DNS forwarding.
In the DHCP configuration, specify:
set service dhcp-server shared-network-name LAN subnet 192.168.1.0/24 option name-server '192.168.1.1'Where 192.168.1.1 is the address of the VyOS host running DNS forwarding.
Troubleshooting
DNS Not Responding
Check the configuration:
show service dns forwardingCheck whether the service is running:
show dns forwarding statisticsCheck the firewall:
show firewall ipv4 input filterMake sure UDP port 53 is open:
set firewall ipv4 input filter rule 30 action accept
set firewall ipv4 input filter rule 30 destination port 53
set firewall ipv4 input filter rule 30 protocol udp
set firewall ipv4 input filter rule 30 source address 192.168.1.0/24
commitSlow Name Resolution
Increase the cache size:
set service dns forwarding cache-size 50000
commitCheck the upstream DNS servers:
dig @8.8.8.8 example.comSwitch the upstream to faster servers:
set service dns forwarding name-server '1.1.1.1'
set service dns forwarding name-server '8.8.8.8'
commitDNSSEC Issues
If validation causes problems, disable it:
set service dns forwarding dnssec off
commitOr use a less strict mode:
set service dns forwarding dnssec process
commitSplit-Horizon Not Working
Make sure the domain-specific rules are specified correctly:
show service dns forwardingOrder matters - more specific domains must be specified first.
Verify by testing:
dig @192.168.1.1 server.corp.localSecurity
Restricting Access
Always use allow-from to restrict the sources:
set service dns forwarding allow-from '192.168.1.0/24'Never use 0.0.0.0/0 in allow-from - this would open DNS to the entire internet (DNS amplification attacks).
Firewall Rules
Additionally restrict access through the firewall:
set firewall ipv4 input filter rule 30 action accept
set firewall ipv4 input filter rule 30 destination port 53
set firewall ipv4 input filter rule 30 protocol udp
set firewall ipv4 input filter rule 30 source address 192.168.1.0/24
commitRate Limiting
Use firewall rate limiting to protect against DoS:
set firewall ipv4 input filter rule 30 action accept
set firewall ipv4 input filter rule 30 destination port 53
set firewall ipv4 input filter rule 30 protocol udp
set firewall ipv4 input filter rule 30 limit rate 50/second
commitDNSSEC
Enable DNSSEC to protect against DNS spoofing:
set service dns forwarding dnssec validate
commitBest Practices
- Use allow-from - always restrict the sources of queries
- Multiple upstreams - specify 2-3 upstream DNS servers
- DNSSEC - enable it for security
- Cache - tune the cache size to match the load
- Split-horizon - separate internal and external domains
- Firewall - add extra protection through the firewall
- Monitoring - regularly review statistics and logs
- Redundancy - use multiple DNS servers
- Documentation - document domain-specific forwarding
- Testing - verify name resolution after changes
Public DNS Servers
Recommended public DNS servers:
- Cloudflare: 1.1.1.1, 1.0.0.1 (fast, private)
- Google: 8.8.8.8, 8.8.4.4 (reliable)
- Quad9: 9.9.9.9, 149.112.112.112 (malicious domain blocking)
- OpenDNS: 208.67.222.222, 208.67.220.220 (content filtering)
Next Steps
- DHCP Server - DHCP integration with DNS
- Dynamic DNS - automatic DNS updates
- Firewall - protecting the DNS service