| 
									
										
										
										
											2016-03-18 21:25:47 +00:00
										 |  |  | # CoreDNS
 | 
					
						
							| 
									
										
										
										
											2016-03-18 21:31:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | Caddy, i.e., you'll need Caddy to compile CoreDNS. | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | server that can talk to multiple backends (etcd, consul, kubernetes, etc.). | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | I'm using CoreDNS is my primary, authoritative, nameserver for my domains (`miek.nl`, `atoom.net` | 
					
						
							| 
									
										
										
										
											2016-08-22 13:48:23 -07:00
										 |  |  | and a few others). CoreDNS 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-04-16 16:16:52 +01:00
										 |  |  | All in all, CoreDNS should be able to provide you with enough functionality to replace parts of | 
					
						
							| 
									
										
										
										
											2016-08-22 13:48:23 -07:00
										 |  |  | BIND 9, Knot, NSD or PowerDNS and SkyDNS. | 
					
						
							| 
									
										
										
										
											2016-04-16 16:16:52 +01:00
										 |  |  | 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 | 
					
						
							|  |  |  | any other Go dependency. | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | You have the source of CoreDNS, this should preferably be downloaded under your `$GOPATH`. Get all | 
					
						
							|  |  |  | dependencies: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     go get ./... | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-22 13:48:23 -07:00
										 |  |  | Then, execute `go generate`. This will patch Caddy to add CoreDNS (and remove the HTTP server | 
					
						
							| 
									
										
										
										
											2016-08-22 07:47:03 +01:00
										 |  |  | plugin), and then `go build` as you would normally do: | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     go generate | 
					
						
							|  |  |  |     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-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-08-22 13:48:23 -07:00
										 |  |  | Serve the (NSEC) DNSSEC-signed `example.org` on port 1053, with errors and logging sent to stdout. Allow zone | 
					
						
							| 
									
										
										
										
											2016-08-22 07:47:03 +01:00
										 |  |  | 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
										 |  |  | 
 | 
					
						
							|  |  |  | Use this as a systemd service file. It defaults to a coredns wich 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 | 
					
						
							|  |  |  | PIDFile=/home/coredns/coredns.pid | 
					
						
							|  |  |  | LimitNOFILE=8192 | 
					
						
							|  |  |  | User=coredns | 
					
						
							|  |  |  | WorkingDirectory=/home/coredns | 
					
						
							|  |  |  | ExecStartPre=/sbin/setcap cap_net_bind_service=+ep /opt/bin/coredns | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | ExecStart=/opt/bin/coredns -pidfile /home/coredns/coredns.pid -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 | 
					
						
							|  |  |  | ~~~ |