Manage DNS zones and records directly in Drupal.

The DNS module provides a modern, extensible system for defining and managing DNS data using Drupal content entities. It supports common and modern record types, strict validation, and a plugin-based architecture for future extensions and provider integrations.

Full documentation is available at project.pages.drupalcode.org/dns, including user guides, developer documentation, and migration instructions.

✨ Features

  • Zone management
    • Create, edit, and delete DNS zones
    • Unicode (IDN) support with automatic Punycode normalization
    • Clean, canonical URLs based on zone names
    • Per-zone collaborator delegation with fine-grained capabilities (view/edit/delete zone, CRUD records)
  • Record management
    • Full CRUD for DNS records within each zone
    • Built-in support for common and modern record types:
      • A, AAAA, CNAME, NS, MX, TXT, PTR, CAA, SRV, HTTPS, SVCB
    • Validation based on DNS RFCs (including CNAME exclusivity rules)
  • Modern Drupal architecture
    • Zones and records are content entities
    • Works with Views, REST, JSON:API, and other entity-based systems
    • Plugin-based record type system for extensibility
  • Views integration
    • Built-in admin listing for records
    • Zone pages include embedded record listings
    • Custom Views fields for record data
  • IDN-aware
    • Enter domains like münchen.de
    • Stored internally as Punycode
    • Displayed to users in Unicode
  • Migration from Drupal 7
    • Built-in Migrate support for dns_zones and dns_records
    • Tolerant handling of imperfect legacy data with logged review output
  • Tested and CI-enabled
    • Extensive unit, kernel, and functional test coverage
    • Drupal.org CI (phpcs, phpstan, phpunit, etc.)

🔐 Access model

DNS uses a two-layer access system:

  • Site-wide permissions (roles) control general capabilities (create zones, administer DNS)
  • Per-zone delegation allows assigning fine-grained capabilities to specific users via collaborators

Records inherit access from their parent zone.

🚧 Project status

This is a complete rewrite of the legacy Drupal 7 DNS module.

  • Current branch: 2.x
  • Status: alpha
  • Suitable for testing and early adoption; review before using for production-critical DNS workflows

The 2.x branch is a new architecture, not an in-place upgrade of the 7.x codebase.

⚠️ Current limitations

  • No DNS provider integration yet
    • Support for Cloudflare, Route 53, PowerDNS, etc. is planned
  • Specialty record types in optional module
    • Additional DNS types (DNAME, TLSA, SSHFP, etc.) are provided via the optional dns_extras module

🧩 Extensibility

The module is designed to be extended:

  • Add new DNS record types via plugins:
    #[RecordType(
      id: "my_type",
      label: "My record type"
    )]
  • Future provider modules will:
    • Implement DNS APIs
    • Add provider-specific record types or extensions

🛣 Roadmap

  • DNS provider integration (Cloudflare, Route 53, etc.)
  • SPF builder/validator for TXT records
  • IANA TLD validation
  • DNS drift detection (compare stored vs live DNS)

📦 Requirements

  • Drupal 10.3+, 11.x
    (Drupal 12 compatibility is tracked but not yet guaranteed)

🔄 Drupal 7 users

  • The 7.x-1.x branch remains available for Drupal 7 sites
  • Use the built-in migration path when upgrading to 2.x

📚 Documentation

Comprehensive documentation is available at project.pages.drupalcode.org/dns, including:

  • User guides and concepts
  • Migration instructions from Drupal 7
  • Developer documentation and extension points

💬 Feedback

Bug reports, feature requests, and architecture feedback are welcome in the project issue queue.

🧠 Why this module?

  • DNS-aware validation and correctness
  • Modern Drupal architecture (entities + plugins)
  • Extensibility for record types and future providers
  • Real-world usability (Views, APIs, IDN handling)

Project information

Releases