2016-03-18 21:25:47 +00:00
|
|
|
# CoreDNS
|
2016-03-18 21:31:55 +00:00
|
|
|
|
2016-09-25 08:39:20 +01:00
|
|
|
[](https://godoc.org/github.com/miekg/coredns)
|
|
|
|
[](https://travis-ci.org/miekg/coredns)
|
|
|
|
|
2016-08-22 13:48:23 -07:00
|
|
|
CoreDNS is a DNS server that started as a fork of [Caddy](https://github.com/mholt/caddy/). It has the
|
|
|
|
same model: it chains middleware. In fact it's so similar that CoreDNS is now a server type plugin for
|
2016-09-17 21:28:59 +01:00
|
|
|
Caddy.
|
2016-03-18 21:31:55 +00:00
|
|
|
|
2016-08-22 13:48:23 -07:00
|
|
|
CoreDNS is the successor to [SkyDNS](https://github.com/skynetservices/skydns). SkyDNS is a thin
|
2016-06-26 15:28:27 +01:00
|
|
|
layer that exposes services in etcd in the DNS. CoreDNS builds on this idea and is a generic DNS
|
2016-09-17 21:28:59 +01:00
|
|
|
server that can talk to multiple backends (etcd, kubernetes, etc.).
|
2016-06-26 15:28:27 +01:00
|
|
|
|
2016-08-22 13:48:23 -07:00
|
|
|
CoreDNS aims to be a fast and flexible DNS server. The keyword here is *flexible*: with CoreDNS you
|
|
|
|
are able to do what you want with your DNS data. And if not: write some middleware!
|
2016-04-24 08:11:00 +01:00
|
|
|
|
2016-04-03 19:05:49 +01:00
|
|
|
Currently CoreDNS is able to:
|
|
|
|
|
2016-08-22 13:48:23 -07:00
|
|
|
* Serve zone data from a file; both DNSSEC (NSEC only) and DNS are supported (middleware/file).
|
|
|
|
* Retrieve zone data from primaries, i.e., act as a secondary server (AXFR only) (middleware/secondary).
|
2016-05-01 11:12:07 +01:00
|
|
|
* Sign zone data on-the-fly (middleware/dnssec).
|
2016-08-22 13:48:23 -07:00
|
|
|
* Load balancing of responses (middleware/loadbalance).
|
|
|
|
* Allow for zone transfers, i.e., act as a primary server (middleware/file).
|
2016-04-20 12:46:24 +00:00
|
|
|
* Caching (middleware/cache).
|
2016-05-01 11:12:07 +01:00
|
|
|
* Health checking (middleware/health).
|
2016-08-22 13:48:23 -07:00
|
|
|
* Use etcd as a backend, i.e., a 101.5% replacement for
|
2016-04-20 12:46:24 +00:00
|
|
|
[SkyDNS](https://github.com/skynetservices/skydns) (middleware/etcd).
|
2016-06-26 15:28:27 +01:00
|
|
|
* Use k8s (kubernetes) as a backend (middleware/kubernetes).
|
2016-04-20 12:46:24 +00:00
|
|
|
* Serve as a proxy to forward queries to some other (recursive) nameserver (middleware/proxy).
|
2016-08-22 13:48:23 -07:00
|
|
|
* Rewrite queries (qtype, qclass and qname) (middleware/rewrite).
|
2016-04-20 12:46:24 +00:00
|
|
|
* Provide metrics (by using Prometheus) (middleware/metrics).
|
|
|
|
* Provide Logging (middleware/log).
|
2016-08-22 13:48:23 -07:00
|
|
|
* Support the CH class: `version.bind` and friends (middleware/chaos).
|
2016-05-01 11:12:07 +01:00
|
|
|
* Profiling support (middleware/pprof).
|
2016-04-20 12:46:24 +00:00
|
|
|
|
2016-08-22 13:48:23 -07:00
|
|
|
Each of the middlewares has a README.md of its own.
|
2016-08-22 07:47:03 +01:00
|
|
|
|
2016-04-20 12:46:24 +00:00
|
|
|
## Status
|
|
|
|
|
2016-09-18 09:32:06 +01:00
|
|
|
CoreDNS can be used as a authoritative nameserver for your domains, and should be stable enough to
|
|
|
|
provide you with good DNS(SEC) service.
|
2016-04-03 19:05:49 +01:00
|
|
|
|
2016-04-16 16:16:52 +01:00
|
|
|
There are still few [issues](https://github.com/miekg/coredns/issues), and work is ongoing on making
|
2016-08-22 13:48:23 -07:00
|
|
|
things fast and to reduce the memory usage.
|
2016-04-03 20:13:33 +01:00
|
|
|
|
2016-09-18 09:32:06 +01:00
|
|
|
All in all, CoreDNS should be able to provide you with enough functionality to replace parts of BIND
|
|
|
|
9, Knot, NSD or PowerDNS and SkyDNS. Most documentation is in the source and some blog articles can
|
|
|
|
be [found here](https://miek.nl/tags/coredns/). If you do want to use CoreDNS in production, please
|
|
|
|
let us know and how we can help.
|
2016-03-18 21:31:55 +00:00
|
|
|
|
|
|
|
<https://caddyserver.com/> is also full of examples on how to structure a Corefile (renamed from
|
|
|
|
Caddyfile when I forked it).
|
2016-03-18 21:36:42 +00:00
|
|
|
|
2016-08-19 17:14:17 -07:00
|
|
|
## Compilation
|
|
|
|
|
2016-08-23 16:36:29 +01:00
|
|
|
CoreDNS (as a servertype plugin for Caddy) has a dependency on Caddy, but this is not different than
|
2016-09-18 09:32:06 +01:00
|
|
|
any other Go dependency. If you have the source of CoreDNS, get all dependencies:
|
2016-08-19 17:14:17 -07:00
|
|
|
|
|
|
|
go get ./...
|
|
|
|
|
2016-09-17 21:28:59 +01:00
|
|
|
And then `go build` as you would normally do:
|
2016-08-19 17:14:17 -07:00
|
|
|
|
|
|
|
go build
|
|
|
|
|
2016-08-22 13:48:23 -07:00
|
|
|
This should yield a `coredns` binary.
|
2016-08-19 17:14:17 -07:00
|
|
|
|
2016-04-03 20:30:37 +01:00
|
|
|
## Examples
|
2016-03-18 21:36:42 +00:00
|
|
|
|
2016-09-18 09:32:06 +01:00
|
|
|
When starting CoreDNS without any configuration, it loads the `whoami` middleware and starts
|
|
|
|
listening on port 2053, it should show the following:
|
|
|
|
|
|
|
|
~~~ txt
|
|
|
|
.:2053
|
2016-10-07 10:14:23 +00:00
|
|
|
2016/09/18 09:20:50 [INFO] CoreDNS-001
|
|
|
|
CoreDNS-001
|
2016-09-18 09:32:06 +01:00
|
|
|
~~~
|
|
|
|
|
|
|
|
Any query send to port 2053 should return some information; your sending address, port and protocol
|
|
|
|
used.
|
|
|
|
|
2016-08-22 07:47:03 +01:00
|
|
|
Start a simple proxy, you'll need to be root to start listening on port 53.
|
2016-03-18 21:36:42 +00:00
|
|
|
|
|
|
|
`Corefile` contains:
|
|
|
|
|
2016-04-03 20:30:37 +01:00
|
|
|
~~~ txt
|
2016-08-22 07:47:03 +01:00
|
|
|
.:53 {
|
2016-03-18 21:36:42 +00:00
|
|
|
proxy . 8.8.8.8:53
|
2016-08-22 07:47:03 +01:00
|
|
|
log stdout
|
2016-03-18 21:36:42 +00:00
|
|
|
}
|
|
|
|
~~~
|
|
|
|
|
|
|
|
Just start CoreDNS: `./coredns`.
|
2016-08-22 13:48:23 -07:00
|
|
|
And then just query on that port (53). The query should be forwarded to 8.8.8.8 and the response
|
2016-08-22 07:47:03 +01:00
|
|
|
will be returned. Each query should also show up in the log.
|
2016-03-20 08:45:21 +00:00
|
|
|
|
2016-09-18 09:32:06 +01:00
|
|
|
Serve the (NSEC) DNSSEC-signed `example.org` on port 1053, with errors and logging sent to stdout.
|
|
|
|
Allow zone transfers to everybody, but specically mention 1 IP address so that CoreDNS can send
|
|
|
|
notifies to it.
|
2016-04-03 20:30:37 +01:00
|
|
|
|
|
|
|
~~~ txt
|
2016-08-22 07:47:03 +01:00
|
|
|
example.org:1053 {
|
|
|
|
file /var/lib/coredns/example.org.signed {
|
2016-04-03 20:30:37 +01:00
|
|
|
transfer to *
|
2016-08-22 07:47:03 +01:00
|
|
|
transfer to 2001:500:8f::53
|
2016-04-03 20:30:37 +01:00
|
|
|
}
|
|
|
|
errors stdout
|
|
|
|
log stdout
|
|
|
|
}
|
|
|
|
~~~
|
|
|
|
|
2016-08-22 07:47:03 +01:00
|
|
|
Serve `example.org` on port 1053, but forward everything that does *not* match `example.org` to a recursive
|
2016-04-03 20:30:37 +01:00
|
|
|
nameserver *and* rewrite ANY queries to HINFO.
|
|
|
|
|
|
|
|
~~~ txt
|
|
|
|
.:1053 {
|
|
|
|
rewrite ANY HINFO
|
|
|
|
proxy . 8.8.8.8:53
|
|
|
|
|
2016-08-22 07:47:03 +01:00
|
|
|
file /var/lib/coredns/example.org.signed example.org {
|
2016-04-03 20:30:37 +01:00
|
|
|
transfer to *
|
2016-08-22 07:47:03 +01:00
|
|
|
transfer to 2001:500:8f::53
|
2016-04-03 20:30:37 +01:00
|
|
|
}
|
|
|
|
errors stdout
|
|
|
|
log stdout
|
|
|
|
}
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
2016-08-22 07:47:03 +01:00
|
|
|
## What Remains To Be Done
|
2016-04-03 20:30:37 +01:00
|
|
|
|
|
|
|
* Optimizations.
|
|
|
|
* Load testing.
|
2016-04-16 16:16:52 +01:00
|
|
|
* The [issues](https://github.com/miekg/coredns/issues).
|
2016-04-03 20:30:37 +01:00
|
|
|
|
2016-08-22 07:47:03 +01:00
|
|
|
|
2016-08-19 17:14:17 -07:00
|
|
|
## Blog and Contact
|
|
|
|
|
|
|
|
Website: <https://coredns.io>
|
2016-08-30 15:35:17 -07:00
|
|
|
Twitter: [@corednsio](https://twitter.com/corednsio)
|
2016-08-19 17:14:17 -07:00
|
|
|
Docs: <https://miek.nl/tags/coredns/>
|
|
|
|
Github: <https://github.com/miekg/coredns>
|
2016-03-20 08:45:21 +00:00
|
|
|
|
2016-05-03 09:00:25 +00:00
|
|
|
|
2016-08-22 07:47:03 +01:00
|
|
|
## Systemd Service File
|
2016-05-03 09:00:25 +00:00
|
|
|
|
2016-10-08 16:44:43 +01:00
|
|
|
Use this as a systemd service file. It defaults to a coredns with a homedir of /home/coredns
|
2016-08-22 07:47:03 +01:00
|
|
|
and the binary lives in /opt/bin and the config in `/etc/coredns/Corefile`:
|
2016-05-03 09:00:25 +00:00
|
|
|
|
|
|
|
~~~ txt
|
2016-07-29 13:03:51 +01:00
|
|
|
[Unit]
|
2016-05-03 09:00:25 +00:00
|
|
|
Description=CoreDNS DNS server
|
2016-08-22 07:47:03 +01:00
|
|
|
Documentation=https://coredns.io
|
2016-05-03 09:00:25 +00:00
|
|
|
After=network.target
|
|
|
|
|
|
|
|
[Service]
|
|
|
|
PermissionsStartOnly=true
|
|
|
|
LimitNOFILE=8192
|
|
|
|
User=coredns
|
|
|
|
WorkingDirectory=/home/coredns
|
|
|
|
ExecStartPre=/sbin/setcap cap_net_bind_service=+ep /opt/bin/coredns
|
2016-10-08 16:44:43 +01:00
|
|
|
ExecStart=/opt/bin/coredns -conf=/etc/coredns/Corefile
|
2016-08-05 16:11:08 +00:00
|
|
|
ExecReload=/bin/kill -SIGUSR1 $MAINPID
|
2016-05-03 09:00:25 +00:00
|
|
|
Restart=on-failure
|
|
|
|
|
|
|
|
[Install]
|
|
|
|
WantedBy=multi-user.target
|
|
|
|
~~~
|