Serve DNS authoritative responses... with Erlang.
This application consists of three main subsystems:
m:erldns_zones
The system responsible for loading and caching zone data.
m:erldns_pipeline
The system responsible for processing incoming DNS queries, including resolution and any extension thereof.
m:erldns_listeners
The system responsible for listening for incoming DNS queries. The system is designed to be able to listen on multiple ports and interfaces and supports both UDP and TCP, Unix network stack optimisations, and high parallelism.
There is also an Admin API for querying the current zone cache and for basic control.
Telemetry is used to instrument the code.
All events are divided in the following namespaces:
[erldns, pipeline | _] are triggered by the m:erldns_pipeline subsystem.[erldns, request | _] are triggered by the m:erldns_listeners subsystem.You can use this application as a standalone service or embedded into your OTP application. In both cases, you'll need to: configure it, and load zones.
Zones are loaded from JSON files in the priv/zones/ directory. The path is configured in erldns.config using the zones.path setting. For more details about zone file format and configuration, see priv/zones/ZONES.
An example configuration file can be found in erldns.example.config. For more details, see the
subsystems and the admin API documentation.
To get started, copy it into your own erldns.config and modify as needed.
To build:
make
To start fresh:
make fresh
make
overmind start
rebar3 shell
rebar3 release
_build/default/rel/erldns/bin/erldns foreground
Here are some queries to try:
dig -p 8053 @127.0.0.1 example.com a
dig -p 8053 @127.0.0.1 example.com cname
dig -p 8053 @127.0.0.1 example.com ns
dig -p 8053 @127.0.0.1 example.com mx
dig -p 8053 @127.0.0.1 example.com txt
dig -p 8053 @127.0.0.1 example.com sshfp
dig -p 8053 @127.0.0.1 example.com soa
dig -p 8053 @127.0.0.1 example.com naptr
dig -p 8053 @127.0.0.1 -x 127.0.0.1 ptr
The Admin API provides a RESTful HTTP interface for managing zones at runtime. By default, it listens on port 8083.
# List all zones
curl http://localhost:8083/
# Get zone details
curl http://localhost:8083/zones/example.com
# Get specific records
curl "http://localhost:8083/zones/example.com/records/example.com?type=A"
For complete documentation including authentication, TLS configuration, and extensibility options, see the Admin API documentation.
If you want to perform some benchmarks, see the benchmarking guide.
AXFR zone transfers are not currently implemented. The current implementation (m:erldns_axfr) is a stub.
erldns adjusts its socket options and socket counts to the host platform,
| Platform | Wildcard ip => any binds | Sockets per listener | Load spread across them |
|---|---|---|---|
| Linux | dual-stack, one socket | parallel_factor × schedulers | yes |
| FreeBSD | one socket per family | parallel_factor × schedulers | yes |
| macOS, NetBSD | dual-stack, one socket | parallel_factor × schedulers | no |
| OpenBSD | IPv4 only | parallel_factor × schedulers | no |
| Windows | IPv4 only | one | no |
To run automated tests:
make test
This runs the following:
(top 30 of 32)
Erlang
99.5%
Serve DNS authoritative responses... with Erlang.
This application consists of three main subsystems:
m:erldns_zones
The system responsible for loading and caching zone data.
m:erldns_pipeline
The system responsible for processing incoming DNS queries, including resolution and any extension thereof.
m:erldns_listeners
The system responsible for listening for incoming DNS queries. The system is designed to be able to listen on multiple ports and interfaces and supports both UDP and TCP, Unix network stack optimisations, and high parallelism.
There is also an Admin API for querying the current zone cache and for basic control.
Telemetry is used to instrument the code.
All events are divided in the following namespaces:
[erldns, pipeline | _] are triggered by the m:erldns_pipeline subsystem.[erldns, request | _] are triggered by the m:erldns_listeners subsystem.You can use this application as a standalone service or embedded into your OTP application. In both cases, you'll need to: configure it, and load zones.
Zones are loaded from JSON files in the priv/zones/ directory. The path is configured in erldns.config using the zones.path setting. For more details about zone file format and configuration, see priv/zones/ZONES.
An example configuration file can be found in erldns.example.config. For more details, see the
subsystems and the admin API documentation.
To get started, copy it into your own erldns.config and modify as needed.
To build:
make
To start fresh:
make fresh
make
overmind start
rebar3 shell
rebar3 release
_build/default/rel/erldns/bin/erldns foreground
Here are some queries to try:
dig -p 8053 @127.0.0.1 example.com a
dig -p 8053 @127.0.0.1 example.com cname
dig -p 8053 @127.0.0.1 example.com ns
dig -p 8053 @127.0.0.1 example.com mx
dig -p 8053 @127.0.0.1 example.com txt
dig -p 8053 @127.0.0.1 example.com sshfp
dig -p 8053 @127.0.0.1 example.com soa
dig -p 8053 @127.0.0.1 example.com naptr
dig -p 8053 @127.0.0.1 -x 127.0.0.1 ptr
The Admin API provides a RESTful HTTP interface for managing zones at runtime. By default, it listens on port 8083.
# List all zones
curl http://localhost:8083/
# Get zone details
curl http://localhost:8083/zones/example.com
# Get specific records
curl "http://localhost:8083/zones/example.com/records/example.com?type=A"
For complete documentation including authentication, TLS configuration, and extensibility options, see the Admin API documentation.
If you want to perform some benchmarks, see the benchmarking guide.
AXFR zone transfers are not currently implemented. The current implementation (m:erldns_axfr) is a stub.
erldns adjusts its socket options and socket counts to the host platform,
| Platform | Wildcard ip => any binds | Sockets per listener | Load spread across them |
|---|---|---|---|
| Linux | dual-stack, one socket | parallel_factor × schedulers | yes |
| FreeBSD | one socket per family | parallel_factor × schedulers | yes |
| macOS, NetBSD | dual-stack, one socket | parallel_factor × schedulers | no |
| OpenBSD | IPv4 only | parallel_factor × schedulers | no |
| Windows | IPv4 only | one | no |
To run automated tests:
make test
This runs the following:
(top 30 of 32)
Erlang
99.5%