Technitium DNS Server
Advanced DNS server with DNSSEC, DNS-over-HTTPS, blocking, and web interface.
Overview
Technitium DNS Server is a comprehensive, open-source DNS solution developed as an alternative to traditional DNS servers like BIND and Microsoft DNS. Built on .NET Core, it provides enterprise-grade features including DNSSEC validation and signing, DNS-over-HTTPS (DoH) and DNS-over-TLS (DoT) support, advanced filtering capabilities, and a modern web-based management interface. Unlike legacy DNS servers that require complex configuration files, Technitium offers intuitive administration through its built-in web UI while maintaining full RFC compliance and supporting modern DNS security standards.
This stack combines Technitium DNS Server with Prometheus for metrics collection and Grafana for visualization, creating a complete DNS infrastructure monitoring solution. Prometheus scrapes DNS query metrics, response times, and server health data from Technitium's built-in metrics endpoint, while Grafana transforms this telemetry into actionable dashboards showing query patterns, blocked requests, upstream resolver performance, and DNSSEC validation statistics. The integration enables administrators to track DNS performance trends, identify potential security threats, and optimize resolver configurations based on real usage data.
This configuration is ideal for network administrators managing corporate DNS infrastructure, homelab enthusiasts seeking enterprise-grade DNS capabilities, and organizations requiring detailed DNS analytics and compliance reporting. The combination provides both operational DNS services and comprehensive monitoring in a single deployment, making it particularly valuable for environments where DNS performance and security visibility are critical requirements.
Key Features
- DNSSEC validation and authoritative zone signing with automatic key rotation
- DNS-over-HTTPS (DoH) and DNS-over-TLS (DoT) support for encrypted DNS queries
- Advanced DNS filtering with custom block lists and regex-based blocking rules
- Conditional forwarding with per-domain upstream resolver configuration
- Built-in DNS Apps framework supporting custom DNS response modification
- Real-time Prometheus metrics export for DNS queries, cache hits, and response times
- Grafana dashboard integration with pre-configured DNS performance visualizations
- Web-based zone management with support for all standard DNS record types
Common Use Cases
- 1Corporate network DNS infrastructure with centralized filtering and monitoring
- 2Homelab DNS server with ad-blocking capabilities and performance analytics
- 3ISP or hosting provider authoritative DNS service with DNSSEC compliance
- 4Educational institutions requiring DNS content filtering and usage reporting
- 5Development environments needing custom DNS resolution with split-horizon configurations
- 6Security-conscious organizations implementing DNS-over-HTTPS for privacy protection
- 7Network operations centers requiring real-time DNS performance monitoring and alerting
Prerequisites
- Minimum 1GB RAM for DNS server with additional 512MB for monitoring stack
- UDP/TCP port 53 available for DNS queries (may require host networking or privileged containers)
- Understanding of DNS concepts including zone files, record types, and DNSSEC
- Basic familiarity with PromQL for creating custom Grafana queries and alerts
- Network configuration knowledge for proper upstream resolver and forwarder setup
- SSL certificate management experience for DNS-over-HTTPS and web interface security
For development & testing. Review security settings, change default credentials, and test thoroughly before production use. See Terms
docker-compose.yml
docker-compose.yml
1services: 2 dns-server: 3 image: technitium/dns-server:latest4 ports: 5 - "53:53/tcp"6 - "53:53/udp"7 - "5380:5380/tcp"8 - "443:443/tcp"9 - "853:853/tcp"10 volumes: 11 - dns_config:/etc/dns12 environment: 13 DNS_SERVER_DOMAIN: ${DNS_DOMAIN}14 DNS_SERVER_ADMIN_PASSWORD: ${DNS_ADMIN_PASSWORD}15 networks: 16 - dns-net17 restart: unless-stopped1819 prometheus: 20 image: prom/prometheus:latest21 ports: 22 - "9090:9090"23 volumes: 24 - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro25 - prometheus_data:/prometheus26 networks: 27 - dns-net28 restart: unless-stopped2930 grafana: 31 image: grafana/grafana:latest32 ports: 33 - "3000:3000"34 environment: 35 GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD}36 volumes: 37 - grafana_data:/var/lib/grafana38 networks: 39 - dns-net40 restart: unless-stopped4142volumes: 43 dns_config: 44 prometheus_data: 45 grafana_data: 4647networks: 48 dns-net: 49 driver: bridge.env Template
.env
1# DNS Server2DNS_DOMAIN=dns.example.com3DNS_ADMIN_PASSWORD=secure_admin_password45# Grafana6GRAFANA_PASSWORD=secure_grafana_passwordUsage Notes
- 1Web UI at http://localhost:5380
- 2Supports DNSSEC validation and signing
- 3Built-in DNS over HTTPS and TLS
- 4Configure blocking via Apps section
Individual Services(3 services)
Copy individual services to mix and match with your existing compose files.
dns-server
dns-server:
image: technitium/dns-server:latest
ports:
- 53:53/tcp
- 53:53/udp
- 5380:5380/tcp
- 443:443/tcp
- 853:853/tcp
volumes:
- dns_config:/etc/dns
environment:
DNS_SERVER_DOMAIN: ${DNS_DOMAIN}
DNS_SERVER_ADMIN_PASSWORD: ${DNS_ADMIN_PASSWORD}
networks:
- dns-net
restart: unless-stopped
prometheus
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus_data:/prometheus
networks:
- dns-net
restart: unless-stopped
grafana
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD}
volumes:
- grafana_data:/var/lib/grafana
networks:
- dns-net
restart: unless-stopped
Quick Start
terminal
1# 1. Create the compose file2cat > docker-compose.yml << 'EOF'3services:4 dns-server:5 image: technitium/dns-server:latest6 ports:7 - "53:53/tcp"8 - "53:53/udp"9 - "5380:5380/tcp"10 - "443:443/tcp"11 - "853:853/tcp"12 volumes:13 - dns_config:/etc/dns14 environment:15 DNS_SERVER_DOMAIN: ${DNS_DOMAIN}16 DNS_SERVER_ADMIN_PASSWORD: ${DNS_ADMIN_PASSWORD}17 networks:18 - dns-net19 restart: unless-stopped2021 prometheus:22 image: prom/prometheus:latest23 ports:24 - "9090:9090"25 volumes:26 - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro27 - prometheus_data:/prometheus28 networks:29 - dns-net30 restart: unless-stopped3132 grafana:33 image: grafana/grafana:latest34 ports:35 - "3000:3000"36 environment:37 GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD}38 volumes:39 - grafana_data:/var/lib/grafana40 networks:41 - dns-net42 restart: unless-stopped4344volumes:45 dns_config:46 prometheus_data:47 grafana_data:4849networks:50 dns-net:51 driver: bridge52EOF5354# 2. Create the .env file55cat > .env << 'EOF'56# DNS Server57DNS_DOMAIN=dns.example.com58DNS_ADMIN_PASSWORD=secure_admin_password5960# Grafana61GRAFANA_PASSWORD=secure_grafana_password62EOF6364# 3. Start the services65docker compose up -d6667# 4. View logs68docker compose logs -fOne-Liner
Run this command to download and set up the recipe in one step:
terminal
1curl -fsSL https://docker.recipes/api/recipes/technitium-dns-server/run | bashTroubleshooting
- DNS queries failing with permission denied: Run container with --cap-add=NET_BIND_SERVICE or use host networking mode for port 53 binding
- Technitium web interface shows 'Unable to load dashboard': Check that DNS_SERVER_DOMAIN environment variable matches your actual domain configuration
- DNSSEC validation errors in logs: Verify system time synchronization as DNSSEC requires accurate timestamps for signature validation
- Prometheus not scraping DNS metrics: Enable statistics API in Technitium admin panel and configure prometheus.yml to scrape port 5380/stats endpoint
- High memory usage during zone transfers: Increase container memory limits and configure zone transfer throttling in Technitium advanced settings
- Grafana dashboards showing no DNS data: Verify Prometheus data source URL points to http://prometheus:9090 within the Docker network
Community Notes
Loading...
Loading notes...
Download Recipe Kit
Get all files in a ready-to-deploy package
Includes docker-compose.yml, .env template, README, and license
Components
technitium-dnsprometheusgrafana
Tags
#dns#technitium#dnssec#doh#ad-blocking
Category
Home Lab & Self-HostingAd Space
Shortcuts: C CopyF FavoriteD Download