2017-08-12 23:34:56 -07:00
[](https://coredns.io)
2016-03-18 21:31:55 +00:00
2017-08-09 09:58:32 -07:00
[](https://godoc.org/github.com/coredns/coredns)
[](https://travis-ci.org/coredns/coredns)
[](https://codecov.io/github/coredns/coredns?branch=master)
2018-01-03 23:03:29 +08:00
[](https://hub.docker.com/r/coredns/coredns)
2017-08-09 09:58:32 -07:00
[](https://goreportcard.com/report/coredns/coredns)
2017-09-12 09:38:14 -04:00
[](https://bestpractices.coreinfrastructure.org/projects/1250)
2016-09-25 08:39:20 +01:00
2019-04-01 07:52:37 +01:00
CoreDNS is a DNS server/forwarder, written in Go, that chains [plugins ](https://coredns.io/plugins ).
Each plugin performs a (DNS) function.
2017-03-19 09:12:18 +00:00
2019-01-25 08:17:54 -05:00
CoreDNS is a [Cloud Native Computing Foundation ](https://cncf.io ) graduated project.
2016-03-18 21:31:55 +00:00
2019-04-01 07:52:37 +01:00
CoreDNS is a fast and flexible DNS server. The key word here is *flexible* : with CoreDNS you
2018-02-21 09:21:04 -05:00
are able to do what you want with your DNS data by utilizing plugins. If some functionality is not
2018-02-21 12:33:22 +00:00
provided out of the box you can add it by [writing a plugin ](https://coredns.io/explugins ).
2016-04-24 08:11:00 +01:00
2019-02-21 15:15:17 +08:00
CoreDNS can listen for DNS requests coming in over UDP/TCP (go'old DNS), TLS ([RFC
2019-04-01 07:52:37 +01:00
7858](https://tools.ietf.org/html/rfc7858)), also called DoT, DNS over HTTP/2 - DoH -
([RFC 8484 ](https://tools.ietf.org/html/rfc7858 )) and [gRPC ](https://grpc.io ) (not a standard).
2017-03-13 20:24:37 +00:00
2016-04-03 19:05:49 +01:00
Currently CoreDNS is able to:
2019-01-27 18:02:25 +00:00
* Serve zone data from a file; both DNSSEC (NSEC only) and DNS are supported (*file* and *auto* ).
2016-10-18 07:47:18 +01:00
* Retrieve zone data from primaries, i.e., act as a secondary server (AXFR only) (*secondary*).
* Sign zone data on-the-fly (*dnssec*).
* Load balancing of responses (*loadbalance*).
* Allow for zone transfers, i.e., act as a primary server (*file*).
2017-03-29 08:24:08 +00:00
* Automatically load zone files from disk (*auto*).
2019-04-01 07:52:37 +01:00
* Caching of DNS responses (*cache*).
2018-02-21 12:33:22 +00:00
* Use etcd as a backend (replace [SkyDNS ](https://github.com/skynetservices/skydns )) (*etcd*).
2016-10-18 07:47:18 +01:00
* Use k8s (kubernetes) as a backend (*kubernetes*).
2019-01-27 18:02:25 +00:00
* Serve as a proxy to forward queries to some other (recursive) nameserver (*forward*).
2016-10-18 07:47:18 +01:00
* Provide metrics (by using Prometheus) (*metrics*).
2018-08-14 17:55:55 +02:00
* Provide query (*log*) and error (*errors*) logging.
2016-10-18 07:47:18 +01:00
* Support the CH class: `version.bind` and friends (*chaos*).
2018-01-13 08:17:59 -08:00
* Support the RFC 5001 DNS name server identifier (NSID) option (*nsid*).
2016-10-18 07:47:18 +01:00
* Profiling support (*pprof*).
2018-02-21 12:33:22 +00:00
* Rewrite queries (qtype, qclass and qname) (*rewrite* and *template* ).
2016-04-20 12:46:24 +00:00
2018-02-21 12:33:22 +00:00
And more. Each of the plugins is documented. See [coredns.io/plugins ](https://coredns.io/plugins )
2017-10-27 20:08:25 +01:00
for all in-tree plugins, and [coredns.io/explugins ](https://coredns.io/explugins ) for all
out-of-tree plugins.
2016-08-22 07:47:03 +01:00
2018-02-21 12:33:22 +00:00
## Compilation from Source
2016-08-19 17:14:17 -07:00
2019-02-09 09:40:54 -05:00
To compile CoreDNS, we assume you have a working Go setup. See various tutorials if you don’t have that already configured.
2016-08-19 17:14:17 -07:00
2019-03-03 23:30:15 -08:00
First, make sure your golang version is 1.12 or higher as `go mod` support is needed.
See [here ](https://github.com/golang/go/wiki/Modules ) for `go mod` details.
Then, check out the project and run `make` to compile the binary:
2018-02-21 12:33:22 +00:00
~~~
2019-02-09 09:40:54 -05:00
$ git clone https://github.com/coredns/coredns
$ cd coredns
$ make
2018-02-21 12:33:22 +00:00
~~~
2016-08-19 17:14:17 -07:00
2016-08-22 13:48:23 -07:00
This should yield a `coredns` binary.
2016-08-19 17:14:17 -07:00
2017-09-15 23:49:20 +01:00
## Compilation with Docker
2017-09-13 16:36:20 -07:00
2017-09-15 23:49:20 +01:00
CoreDNS requires Go to compile. However, if you already have docker installed and prefer not to setup
2018-02-21 12:33:22 +00:00
a Go environment, you could build CoreDNS easily:
2017-09-13 16:36:20 -07:00
```
$ docker run --rm -i -t -v $PWD:/go/src/github.com/coredns/coredns \
2019-03-03 23:19:50 -08:00
-w /go/src/github.com/coredns/coredns golang:1.12 make
2017-09-13 16:36:20 -07:00
```
The above command alone will have `coredns` binary generated.
2016-04-03 20:30:37 +01:00
## Examples
2016-03-18 21:36:42 +00:00
2017-10-10 09:39:35 +02:00
When starting CoreDNS without any configuration, it loads the
2017-10-27 20:08:25 +01:00
[*whoami* ](https://coredns.io/plugins/whoami ) plugin and starts listening on port 53 (override with
`-dns.port` ), it should show the following:
2016-09-18 09:32:06 +01:00
~~~ txt
2016-10-18 07:47:18 +01:00
.:53
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
~~~
2019-02-21 15:15:17 +08:00
Any query sent to port 53 should return some information; your sending address, port and protocol
2016-09-18 09:32:06 +01:00
used.
2016-10-18 07:47:18 +01:00
If you have a Corefile without a port number specified it will, by default, use port 53, but you
can override the port with the `-dns.port` flag:
`./coredns -dns.port 1053` , runs the server on port 1053.
2019-02-21 15:15:17 +08: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:
2017-10-27 20:08:25 +01:00
~~~ corefile
2016-08-22 07:47:03 +01:00
.:53 {
2018-02-21 12:33:22 +00:00
forward . 8.8.8.8:53
2017-09-15 23:49:20 +01:00
log
2016-03-18 21:36:42 +00:00
}
~~~
2017-09-15 23:49:20 +01:00
Just start CoreDNS: `./coredns` . Then just query on that port (53). The query should be forwarded to
2017-10-27 20:08:25 +01:00
8.8.8.8 and the response will be returned. Each query should also show up in the log which is
printed on standard output.
2016-03-20 08:45:21 +00:00
2017-10-27 20:08:25 +01:00
Serve the (NSEC) DNSSEC-signed `example.org` on port 1053, with errors and logging sent to standard
output. Allow zone transfers to everybody, but specifically 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
}
2017-09-15 23:49:20 +01:00
errors
log
2016-04-03 20:30:37 +01:00
}
~~~
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
2018-02-21 12:33:22 +00:00
forward . 8.8.8.8:53
2016-04-03 20:30:37 +01:00
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
}
2017-09-15 23:49:20 +01:00
errors
log
2017-01-22 08:14:48 +00:00
}
~~~
2016-08-22 07:47:03 +01:00
2017-08-07 13:24:09 -07:00
IP addresses are also allowed. They are automatically converted to reverse zones:
2017-10-10 09:39:35 +02:00
~~~ corefile
2017-08-07 13:24:09 -07:00
10.0.0.0/24 {
2017-10-10 09:39:35 +02:00
whoami
2017-08-07 13:24:09 -07:00
}
~~~
2017-09-15 23:49:20 +01:00
Means you are authoritative for `0.0.10.in-addr.arpa.` .
2017-08-07 13:24:09 -07:00
2017-10-24 10:16:03 +01:00
This also works for IPv6 addresses. If for some reason you want to serve a zone named `10.0.0.0/24`
add the closing dot: `10.0.0.0/24.` as this also stops the conversion.
2018-02-21 12:33:22 +00:00
This even works for CIDR (See RFC 1518 and 1519) addressing, i.e. `10.0.0.0/25` , CoreDNS will then
2017-10-24 10:16:03 +01:00
check if the `in-addr` request falls in the correct range.
2017-08-07 13:24:09 -07:00
2017-03-13 20:24:37 +00:00
Listening on TLS and for gRPC? Use:
2017-10-10 09:39:35 +02:00
~~~ corefile
2017-03-13 20:24:37 +00:00
tls://example.org grpc://example.org {
2017-10-10 09:39:35 +02:00
whoami
2017-03-13 20:24:37 +00:00
}
~~~
Specifying ports works in the same way:
~~~ txt
grpc://example.org:1443 {
# ...
}
~~~
When no transport protocol is specified the default `dns://` is assumed.
2017-04-27 16:24:00 +01:00
## Community
2016-08-19 17:14:17 -07:00
2018-08-31 19:28:33 +01:00
We're most active on Github (and Slack):
2018-02-21 12:33:22 +00:00
- Github: < https: // github . com / coredns / coredns >
2018-08-31 19:28:33 +01:00
- Slack: #coredns on < https: // slack . cncf . io >
2018-02-21 12:33:22 +00:00
More resources can be found:
2017-03-29 08:24:08 +00:00
- Website: < https: // coredns . io >
2017-04-27 16:24:00 +01:00
- Blog: < https: // blog . coredns . io >
2017-03-29 08:24:08 +00:00
- Twitter: [@corednsio ](https://twitter.com/corednsio )
2018-08-31 19:28:33 +01:00
- Mailing list/group: < coredns-discuss @googlegroups .com > (not very active)
2016-05-03 09:00:25 +00:00
2019-07-25 13:20:23 -07:00
## Contribution guidelines
If you want to contribute to CoreDNS, be sure to review the [contribution guidelines ](CONTRIBUTING.md ).
2017-04-24 11:45:47 -04:00
## Deployment
2016-05-03 09:00:25 +00:00
2018-07-11 09:56:37 +01:00
Examples for deployment via systemd and other use cases can be found in the [deployment
repository](https://github.com/coredns/deployment).
2018-02-27 09:05:40 -08:00
2019-01-27 18:02:25 +00:00
## Deprecation Policy
When there is a backwards incompatible change in CoreDNS the following process is followed:
* Release x.y.z: Announce that in the next release we will make backward incompatible changes.
* Release x.y+1.0: Increase the minor version and set the patch version to 0. Make the changes,
but allow the old configuration to be parsed. I.e. CoreDNS will start from an unchanged
Corefile.
* Release x.y+1.1: Increase the patch version to 1. Remove the lenient parsing, so CoreDNS will
not start if those features are still used.
E.g. 1.3.1 announce a change. 1.4.0 a new release with the change but backward compatible config.
And finally 1.4.1 that removes the config workarounds.
2018-02-27 09:05:40 -08:00
## Security
2019-01-15 11:16:18 -06:00
### Security Audit
A third party security audit was performed by Cure53, you can see the full report [here ](https://coredns.io/assets/DNS-01-report.pdf ).
### Reporting security vulnerabilities
2018-07-11 09:56:37 +01:00
If you find a security vulnerability or any security related issues, please DO NOT file a public
issue, instead send your report privately to `security@coredns.io` . Security reports are greatly
appreciated and we will publicly thank you for it.
2018-10-21 13:25:22 -04:00
2019-02-03 21:46:19 +09:00
Please consult [security vulnerability disclosures and security fix and release process document ](https://github.com/coredns/coredns/blob/master/SECURITY-RELEASE-PROCESS.md )