Introduction
DNS split-view (also known as split-horizon DNS or DNS views) is a technique where a single DNS server returns different answers depending on the client’s source IP address or network location. This is essential for organizations that need to serve internal IP addresses to internal clients while presenting public-facing addresses to external queries. Whether you are running a corporate intranet with private service endpoints, managing multi-tenant DNS hosting, or implementing geo-aware DNS routing, split-view DNS gives you fine-grained control over DNS responses.
In this guide, we compare three powerful open-source DNS servers and their approaches to implementing split-view DNS: BIND 9 with its built-in views feature, PowerDNS with LUA script records and GeoIP backend, and Knot DNS with response policy and query-level filtering. Each solution offers a different trade-off between simplicity, flexibility, and performance.
BIND 9 Views
BIND 9 (Berkeley Internet Name Domain) is the oldest and most widely deployed DNS server. Its views feature allows you to define multiple virtual DNS configurations within a single server instance, each matching on client source addresses via ACLs.
Key Features
- Multiple virtual servers within a single BIND process
- ACL-based matching using
match-clients,match-destinations - Per-view zone files — complete zone isolation between views
allow-recursioncontrol per viewallow-query,allow-transferaccess controls
Docker Compose Configuration
| |
BIND Views Configuration Example
| |
In this setup, internal clients in the 192.168.0.0/16 and 10.0.0.0/8 ranges receive the internal zone file, while all other clients receive the external zone file. BIND evaluates views in order — the first matching view wins, making ACL ordering critical.
Pros and Cons
- ✅ Mature, battle-tested — used by most root DNS servers
- ✅ Complete zone isolation between views
- ✅ Fine-grained ACLs and per-view access controls
- ❌ Configuration duplication — each view needs complete zone files
- ❌ Memory overhead proportional to number of views
- ❌ Views are evaluated sequentially — large ACLs can slow query processing
PowerDNS LUA Records & GeoIP Backend
PowerDNS takes a fundamentally different approach to split-view DNS. Instead of maintaining separate virtual servers with separate zone files, PowerDNS uses backend plugins and LUA script records to dynamically compute responses based on the query source.
Key Features
- LUA records — execute scripts to determine responses dynamically
- GeoIP backend — return different records based on geographic location
- Pipe backend — pipe queries to external programs for custom logic
- Per-record
scopeMask— mark records as internal or external - DNSSEC-aware — dynamic responses with valid signatures
Docker Compose Configuration
| |
PowerDNS LUA Record Example
| |
Then in your zone, define a LUA record:
| |
When a query arrives, PowerDNS calls the LUA function with the client’s IP, and the function returns the appropriate response. This is far more flexible than BIND’s static views — you can implement any custom logic you need.
GeoIP Backend Example
PowerDNS can also use the GeoIP backend for geographic-based split-view:
| |
Zone configuration using YAML:
| |
Pros and Cons
- ✅ Dynamic logic via LUA — no zone file duplication
- ✅ GeoIP integration for geographic routing
- ✅ Backend extensibility (MySQL, PostgreSQL, LDAP, etc.)
- ✅ DNSSEC-compatible dynamic responses
- ❌ LUA scripting has a learning curve
- ❌ Per-query script execution adds latency
- ❌ GeoIP database must be kept up to date
Knot DNS Response Policy
Knot DNS is a high-performance authoritative DNS server developed by CZ.NIC. While it does not have a direct “views” equivalent, its response policy module (mod-rrl and mod-dnstap) combined with query tuning provides flexible response differentiation.
Key Features
- Query modules — pluggable query processing pipeline
mod-rrl— Response Rate Limiting with per-client policiesmod-dnstap— query logging for analysisaclblocks — per-ACL action controlsubmissionandpolicy— fine-grained client-based actions- Fast zone reloads — incremental zone transfers with minimal latency
Docker Compose Configuration
| |
Knot DNS ACL-Based Configuration
| |
Knot’s approach maps different zone files to different ACLs on the same domain, achieving split-view functionality. The acl directive on each zone definition controls which clients can query that particular zone configuration.
Pros and Cons
- ✅ Extremely fast — designed for TLD-level query volumes
- ✅ Clean, modern configuration syntax
- ✅ Efficient memory usage — minimal overhead for ACL-based routing
- ✅ Incremental zone reloads without restart
- ❌ No dynamic LUA scripting equivalent
- ❌ Limited policy complexity compared to PowerDNS backends
- ❌ Multiple zone definitions for the same domain can be confusing
Comparison Table
| Feature | BIND 9 Views | PowerDNS LUA/GeoIP | Knot DNS ACL |
|---|---|---|---|
| Stars | 743★ | 4,383★ | 306★ |
| Split-View Method | Static views + ACL | Dynamic LUA records | ACL-mapped zone files |
| Dynamic Logic | No — static zone files | Yes — LUA scripts | No — static zone files |
| GeoIP Support | Via GeoIP ACL module | Native GeoIP backend | No built-in support |
| DNSSEC | Full support | Full dynamic DNSSEC | Full support |
| Configuration Language | Named-style (classic) | YAML + LUA | YAML (libyang) |
| Performance | Good (~50K qps) | Good (~40K qps) | Excellent (~200K qps) |
| Memory Usage | High (per-view copies) | Moderate | Low |
| Learning Curve | Medium | High (LUA scripting) | Low-Medium |
| Primary Language | C | C++ | C |
| Last Update | 2026-06-02 | 2026-06-02 | 2026-06-02 |
Why Self-Host Your DNS Split-View?
Self-hosting your DNS split-view configuration gives you complete control over how different client populations resolve your domain names. Unlike cloud DNS providers that charge per zone and per query, self-hosted DNS splits put you in full command of your namespace.
For organizations running hybrid infrastructure — with some services in the cloud and others on-premises — split-view DNS eliminates the need to maintain separate domain names for internal and external services. Employees can use the same app.company.com URL whether they are in the office or working remotely, with the DNS server automatically resolving it to the correct internal IP or public endpoint.
Data sovereignty is another critical consideration. When you self-host your DNS infrastructure, you control exactly which clients receive which information. There is no risk of a cloud misconfiguration accidentally exposing internal IP addresses or hostnames to the public internet — a mistake that has led to significant security incidents at major organizations. For a deeper dive into DNS privacy and encrypted DNS, see our complete DNS privacy guide.
Cost savings compound as your infrastructure grows. BIND and PowerDNS are free, and Knot DNS is developed by a non-profit registry. The only operating costs are server resources, which are modest for DNS workloads. If you are exploring DNS server options more broadly, check our DNS server comparison guide and our DNS load balancing guide.
FAQ
What is the difference between split-view DNS and anycast DNS?
Split-view DNS returns different answers based on the querying client’s IP address, while anycast DNS routes queries to the nearest server instance using BGP routing. Split-view is about what answer you return, while anycast is about where the query is answered. They are complementary — you can run BIND views on anycast-advertised DNS servers for geographic and logical routing simultaneously.
Does split-view DNS work with DNSSEC?
Yes — but with caveats. BIND can sign different zone files with different keys for each view, which works seamlessly. PowerDNS supports dynamic DNSSEC signatures with LUA records, meaning the DNSSEC records are generated on-the-fly based on the computed response. Knot DNS signs each zone definition independently. The key requirement is that each view must have its own DNSSEC signing keys and the zone content must be consistent.
Can I use split-view DNS with Kubernetes or containers?
Yes. All three servers run in containers and can be deployed in Kubernetes. However, Kubernetes DNS patterns differ — you may find it simpler to use CoreDNS with the view plugin or to run separate DNS deployments for internal and external traffic. Our DNS load balancing guide covers CoreDNS-based setups.
Which DNS server is best for a small business with one office?
BIND 9 with views is the most straightforward choice for a simple internal/external split. The configuration is well-documented, the static zone files are easy to audit, and there is a large community for troubleshooting. Set up one internal view matching your office subnet and one external view matching any, and you are done.
How do I test that my split-view DNS is working correctly?
Use dig with the -b flag to specify a source IP address: dig @dns-server example.com -b 192.168.1.100. This simulates a query coming from an internal IP, allowing you to verify the internal view response. For external testing, use dig @dns-server example.com from outside your network or specify a public source IP. Also test with dig +short for quick response comparison.
Can PowerDNS LUA records affect DNS performance?
Yes — LUA record callbacks execute on every query, adding approximately 0.1-0.5ms per invocation. For a low-traffic authoritative server (under 1,000 qps), this is negligible. For high-traffic deployments (>10,000 qps), consider pre-computing common results or using the GeoIP backend which has native C++ performance. PowerDNS also supports LUA JIT compilation in newer versions, which significantly reduces script execution overhead.
💰 Want to test your market judgment? I use Polymarket for prediction market trading — the world’s largest prediction market platform where you can bet on anything from election outcomes to tech regulation timelines. Unlike gambling, this is a real information market: the more you know, the better your odds. I’ve profited by predicting tech-related event trajectories. Sign up with my invite link: Polymarket.com