mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-30 17:53:21 -04:00 
			
		
		
		
	doc update (#1140)
* doc update Go through all README and fix mistakes, extend example and let more corefile snippets be test for validity. * Cant use spefic addr in test
This commit is contained in:
		
							
								
								
									
										21
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								README.md
									
									
									
									
									
								
							| @@ -13,7 +13,7 @@ the same model: it chains plugins. | ||||
| CoreDNS is a [Cloud Native Computing Foundation](https://cncf.io) inception level project. | ||||
|  | ||||
| CoreDNS is the successor to [SkyDNS](https://github.com/skynetservices/skydns). SkyDNS is a thin | ||||
| layer that exposes services in etcd in the DNS. CoreDNS builds on this idea and is a generic DNS | ||||
| 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, kubernetes, etc.). | ||||
|  | ||||
| CoreDNS aims to be a fast and flexible DNS server. The keyword here is *flexible*: with CoreDNS you | ||||
| @@ -43,7 +43,8 @@ Currently CoreDNS is able to: | ||||
| * Rewrite queries (qtype, qclass and qname) (*rewrite*). | ||||
| * Echo back the IP address, transport and port number used (*whoami*). | ||||
|  | ||||
| Each of the plugins has a README.md of its own. | ||||
| Each of the plugins has a README.md of its own, see [coredns.io/plugins](https://coredns.io/plugins) | ||||
| for all in-tree plugins. | ||||
|  | ||||
| ## Status | ||||
|  | ||||
| @@ -54,9 +55,8 @@ here](https://coredns.io). If you do want to use CoreDNS in production, please l | ||||
|  | ||||
| ## Compilation | ||||
|  | ||||
| CoreDNS (as a servertype plugin for Caddy) has a dependency on Caddy, but this is not different than | ||||
| any other Go dependency. If you have the source of CoreDNS checked out in the appropriate place in | ||||
| your `GOPATH`, get all dependencies: | ||||
| If you have the source of CoreDNS checked out in the appropriate place in your `GOPATH`, get all | ||||
| dependencies: | ||||
|  | ||||
|     go get ./... | ||||
|  | ||||
| @@ -82,7 +82,8 @@ The above command alone will have `coredns` binary generated. | ||||
|  | ||||
| ## Examples | ||||
|  | ||||
| When starting CoreDNS without any configuration, it loads the `whoami` plugin and starts | ||||
| When starting CoreDNS without any configuration, it loads the | ||||
| [*whoami*](https://coredns.io/plugins/whoami) plugin and starts | ||||
| listening on port 53 (override with `-dns.port`), it should show the following: | ||||
|  | ||||
| ~~~ txt | ||||
| @@ -147,9 +148,9 @@ nameserver *and* rewrite ANY queries to HINFO. | ||||
|  | ||||
| IP addresses are also allowed. They are automatically converted to reverse zones: | ||||
|  | ||||
| ~~~ txt | ||||
| ~~~ corefile | ||||
| 10.0.0.0/24 { | ||||
|     # ... | ||||
|     whoami | ||||
| } | ||||
| ~~~ | ||||
| Means you are authoritative for `0.0.10.in-addr.arpa.`. | ||||
| @@ -160,9 +161,9 @@ dot: `10.0.0.0/24.` as this also stops the conversion. | ||||
|  | ||||
| Listening on TLS and for gRPC? Use: | ||||
|  | ||||
| ~~~ txt | ||||
| ~~~ corefile | ||||
| tls://example.org grpc://example.org { | ||||
|     # ... | ||||
|     whoami | ||||
| } | ||||
| ~~~ | ||||
|  | ||||
|   | ||||
| @@ -37,9 +37,11 @@ are used. | ||||
| All directives from the *file* plugin are supported. Note that *auto* will load all zones found, | ||||
| even though the directive might only receive queries for a specific zone. I.e: | ||||
|  | ||||
| ~~~ | ||||
| auto example.org { | ||||
|     directory /etc/coredns/zones | ||||
| ~~~ corefile | ||||
| . { | ||||
|     auto example.org { | ||||
|         directory /etc/coredns/zones | ||||
|     } | ||||
| } | ||||
| ~~~ | ||||
| Will happily pick up a zone for `example.COM`, except it will never be queried, because the *auto* | ||||
|   | ||||
| @@ -11,7 +11,7 @@ element in it) to the name of this answer. | ||||
| ## Syntax | ||||
|  | ||||
| ~~~ | ||||
| autopath [ZONE..] RESOLV-CONF | ||||
| autopath [ZONE...] RESOLV-CONF | ||||
| ~~~ | ||||
|  | ||||
| * **ZONES** zones *autopath* should be authoritative for. | ||||
|   | ||||
							
								
								
									
										17
									
								
								plugin/cache/README.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								plugin/cache/README.md
									
									
									
									
										vendored
									
									
								
							| @@ -10,7 +10,7 @@ cache [TTL] [ZONES...] | ||||
|  | ||||
| * **TTL** max TTL in seconds. If not specified, the maximum TTL will be used which is 3600 for | ||||
|     noerror responses and 1800 for denial of existence ones. | ||||
|     Setting a TTL of 300 *cache 300* would cache the record up to 300 seconds. | ||||
|     Setting a TTL of 300: `cache 300` would cache the record up to 300 seconds. | ||||
| * **ZONES** zones it should cache for. If empty, the zones from the configuration block are used. | ||||
|  | ||||
| Each element in the cache is cached according to its TTL (with **TTL** as the max). | ||||
| @@ -45,10 +45,10 @@ The minimum TTL allowed on resource records is 5 seconds. | ||||
|  | ||||
| If monitoring is enabled (via the *prometheus* directive) then the following metrics are exported: | ||||
|  | ||||
| * coredns_cache_size{type} - Total elements in the cache by cache type. | ||||
| * coredns_cache_capacity{type} - Total capacity of the cache by cache type. | ||||
| * coredns_cache_hits_total{type} - Counter of cache hits by cache type. | ||||
| * coredns_cache_misses_total - Counter of cache misses. | ||||
| * `coredns_cache_size{type}` - Total elements in the cache by cache type. | ||||
| * `coredns_cache_capacity{type}` - Total capacity of the cache by cache type. | ||||
| * `coredns_cache_hits_total{type}` - Counter of cache hits by cache type. | ||||
| * `coredns_cache_misses_total{}` - Counter of cache misses. | ||||
|  | ||||
| Cache types are either "denial" or "success". | ||||
|  | ||||
| @@ -56,8 +56,11 @@ Cache types are either "denial" or "success". | ||||
|  | ||||
| Enable caching for all zones, but cap everything to a TTL of 10 seconds: | ||||
|  | ||||
| ~~~ | ||||
| cache 10 | ||||
| ~~~ corefile | ||||
| . { | ||||
|     cache 10 | ||||
|     whoami | ||||
| } | ||||
| ~~~ | ||||
|  | ||||
| Proxy to Google Public DNS and only cache responses for example.org (or below). | ||||
|   | ||||
| @@ -2,8 +2,8 @@ | ||||
|  | ||||
| *debug* disables the automatic recovery upon a CoreDNS crash so that you'll get a nice stack trace. | ||||
|  | ||||
| Note that the *errors* plugin (if loaded) will also set a `recover` negating this setting. | ||||
| The main use of *debug* is to help testing. | ||||
| Note that the *errors* plugin (if loaded) will also set a `recover` negating this setting. The main | ||||
| use of *debug* is to help testing. | ||||
|  | ||||
| ## Syntax | ||||
|  | ||||
|   | ||||
| @@ -17,33 +17,31 @@ Authenticated denial of existence is implemented with NSEC black lies. Using ECD | ||||
| is preferred as this leads to smaller signatures (compared to RSA). NSEC3 is *not* supported. | ||||
|  | ||||
| If multiple *dnssec* plugins are specified in the same zone, the last one specified will be | ||||
| used ( see [bugs](#bugs) ). | ||||
| used (See [bugs](#bugs)). | ||||
|  | ||||
| * `ZONES` zones that should be signed. If empty, the zones from the configuration block | ||||
| * **ZONES** zones that should be signed. If empty, the zones from the configuration block | ||||
|     are used. | ||||
|  | ||||
| * `key file` indicates that key file(s) should be read from disk. When multiple keys are specified, RRsets | ||||
| * `key file` indicates that **KEY** file(s) should be read from disk. When multiple keys are specified, RRsets | ||||
|   will be signed with all keys. Generating a key can be done with `dnssec-keygen`: `dnssec-keygen -a | ||||
|   ECDSAP256SHA256 <zonename>`. A key created for zone *A* can be safely used for zone *B*. The name of the | ||||
|   key file can be specified as one of the following formats | ||||
|  | ||||
|     * basename of the generated key `Kexample.org+013+45330` | ||||
|  | ||||
|     * generated public key `Kexample.org+013+45330.key` | ||||
|  | ||||
|     * generated private key `Kexample.org+013+45330.private` | ||||
|  | ||||
| * `cache_capacity` indicates the capacity of the cache. The dnssec plugin uses a cache to store | ||||
|   RRSIGs. The default capacity is 10000. | ||||
|   RRSIGs. The default for **CAPACITY** is 10000. | ||||
|  | ||||
| ## Metrics | ||||
|  | ||||
| If monitoring is enabled (via the *prometheus* directive) then the following metrics are exported: | ||||
|  | ||||
| * coredns_dnssec_cache_size{type} - total elements in the cache, type is "signature". | ||||
| * coredns_dnssec_cache_capacity{type} - total capacity of the cache, type is "signature". | ||||
| * coredns_dnssec_cache_hits_total - Counter of cache hits. | ||||
| * coredns_dnssec_cache_misses_total - Counter of cache misses. | ||||
| * `coredns_dnssec_cache_size{type}` - total elements in the cache, type is "signature". | ||||
| * `coredns_dnssec_cache_capacity{type}` - total capacity of the cache, type is "signature". | ||||
| * `coredns_dnssec_cache_hits_total{}` - Counter of cache hits. | ||||
| * `coredns_dnssec_cache_misses_total{}` - Counter of cache misses. | ||||
|  | ||||
| ## Examples | ||||
|  | ||||
|   | ||||
| @@ -36,26 +36,26 @@ dnstap tcp://127.0.0.1:6000 full | ||||
| ## Dnstap command line tool | ||||
|  | ||||
| ~~~ sh | ||||
| go get github.com/dnstap/golang-dnstap | ||||
| cd $GOPATH/src/github.com/dnstap/golang-dnstap/dnstap | ||||
| go build | ||||
| ./dnstap | ||||
| % go get github.com/dnstap/golang-dnstap | ||||
| % cd $GOPATH/src/github.com/dnstap/golang-dnstap/dnstap | ||||
| % go build | ||||
| % ./dnstap | ||||
| ~~~ | ||||
|  | ||||
| The following command listens on the given socket and decodes messages to stdout. | ||||
|  | ||||
| ~~~ sh | ||||
| dnstap -u /tmp/dnstap.sock | ||||
| % dnstap -u /tmp/dnstap.sock | ||||
| ~~~ | ||||
|  | ||||
| The following command listens on the given socket and saves message payloads to a binary dnstap-format log file. | ||||
|  | ||||
| ~~~ sh | ||||
| dnstap -u /tmp/dnstap.sock -w /tmp/test.dnstap | ||||
| % dnstap -u /tmp/dnstap.sock -w /tmp/test.dnstap | ||||
| ~~~ | ||||
|  | ||||
| Listen for dnstap messages on port 6000. | ||||
|  | ||||
| ~~~ sh | ||||
| dnstap -l 127.0.0.1:6000 | ||||
| % dnstap -l 127.0.0.1:6000 | ||||
| ~~~ | ||||
|   | ||||
| @@ -4,8 +4,8 @@ | ||||
| a [message](https://github.com/skynetservices/skydns/blob/2fcff74cdc9f9a7dd64189a447ef27ac354b725f/msg/service.go#L26) | ||||
| like [SkyDNS](https://github.com/skynetservices/skydns). It should also work just like SkyDNS. | ||||
|  | ||||
| The etcd plugin makes extensive use of the proxy plugin to forward and query other servers | ||||
| in the network. | ||||
| The etcd plugin makes extensive use of the proxy plugin to forward and query other servers in the | ||||
| network. | ||||
|  | ||||
| ## Syntax | ||||
|  | ||||
| @@ -15,8 +15,8 @@ etcd [ZONES...] | ||||
|  | ||||
| * **ZONES** zones etcd should be authoritative for. | ||||
|  | ||||
| The path will default to `/skydns` the local etcd proxy (http://localhost:2379). | ||||
| If no zones are specified the block's zone will be used as the zone. | ||||
| The path will default to `/skydns` the local etcd proxy (http://localhost:2379). If no zones are | ||||
| specified the block's zone will be used as the zone. | ||||
|  | ||||
| If you want to `round robin` A and AAAA responses look at the `loadbalance` plugin. | ||||
|  | ||||
| @@ -103,7 +103,7 @@ Next you'll need to populate the zone with reverse records, here we add a revers | ||||
|  | ||||
| Querying with dig: | ||||
|  | ||||
| ~~~ | ||||
| ~~~ sh | ||||
| % dig @localhost -x 10.0.0.127 +short | ||||
| reverse.atoom.net. | ||||
| reverse.skydns.local. | ||||
| ~~~ | ||||
|   | ||||
| @@ -18,6 +18,8 @@ supports health checks has a section "Health" in their README. | ||||
|  | ||||
| Run another health endpoint on http://localhost:8091. | ||||
|  | ||||
| ~~~ | ||||
| health localhost:8091 | ||||
| ~~~ corefile | ||||
| . { | ||||
|     health localhost:8091 | ||||
| } | ||||
| ~~~ | ||||
|   | ||||
| @@ -29,8 +29,10 @@ hosts [FILE [ZONES...]] { | ||||
|  | ||||
| Load `/etc/hosts` file. | ||||
|  | ||||
| ~~~ | ||||
| hosts | ||||
| ~~~ corefile | ||||
| . { | ||||
|     hosts | ||||
| } | ||||
| ~~~ | ||||
|  | ||||
| Load `example.hosts` file in the current directory. | ||||
|   | ||||
| @@ -36,6 +36,7 @@ kubernetes [ZONES...] { | ||||
|     fallthrough | ||||
| } | ||||
| ``` | ||||
|  | ||||
| * `resyncperiod` specifies the Kubernetes data API **DURATION** period. | ||||
| * `endpoint` specifies the **URL** for a remove k8s API endpoint. | ||||
|    If omitted, it will connect to k8s in-cluster using the cluster service account. | ||||
|   | ||||
| @@ -17,6 +17,11 @@ loadbalance [POLICY] | ||||
|  | ||||
| ## Examples | ||||
|  | ||||
| ~~~ | ||||
| loadbalance round_robin | ||||
| Load balance replies coming back from Google Public DNS: | ||||
|  | ||||
| ~~~ corefile | ||||
| . { | ||||
|     loadbalance round_robin | ||||
|     proxy . 8.8.8.8 8.8.4.4 | ||||
| } | ||||
| ~~~ | ||||
|   | ||||
| @@ -11,23 +11,22 @@ log | ||||
| * With no arguments, a query log entry is written to *stdout* in the common log format for all requests | ||||
|  | ||||
| ~~~ txt | ||||
| log FILE | ||||
| log [stdout] | ||||
| ~~~ | ||||
|  | ||||
| * **FILE** is the log file to create (or append to). The *only* valid name for **FILE** is *stdout*. | ||||
| Or if you want/need slightly more control: | ||||
|  | ||||
| ~~~ txt | ||||
| log [NAME] FILE [FORMAT] | ||||
| log [NAME] stdout [FORMAT] | ||||
| ~~~ | ||||
|  | ||||
| * `NAME` is the name to match in order to be logged | ||||
| * `FILE` is the log file (again only *stdout* is allowed here). | ||||
| * `FORMAT` is the log format to use (default is Common Log Format) | ||||
|  | ||||
| You can further specify the class of responses that get logged: | ||||
|  | ||||
| ~~~ txt | ||||
| log [NAME] FILE [FORMAT] { | ||||
| log [NAME] stdout [FORMAT] { | ||||
|     class [success|denial|error|all] | ||||
| } | ||||
| ~~~ | ||||
| @@ -43,11 +42,6 @@ classes have the following meaning: | ||||
|  | ||||
| If no class is specified, it defaults to *all*. | ||||
|  | ||||
| ## Log File | ||||
|  | ||||
| The "log file" can only be *stdout*. CoreDNS expects another service to pick up this output and deal | ||||
| with it, i.e. journald when using systemd or Docker's logging capabilities. | ||||
|  | ||||
| ## Log Format | ||||
|  | ||||
| You can specify a custom log format with any placeholder values. Log supports both request and | ||||
| @@ -83,20 +77,27 @@ The default Common Log Format is: | ||||
|  | ||||
| Log all requests to stdout | ||||
|  | ||||
| ~~~ | ||||
| log stdout | ||||
| ~~~ corefile | ||||
| . { | ||||
|     log | ||||
|     whoami | ||||
| } | ||||
| ~~~ | ||||
|  | ||||
| Custom log format, for all zones (`.`) | ||||
|  | ||||
| ~~~ | ||||
| log . stdout "{proto} Request: {name} {type} {>id}" | ||||
| ~~~ corefile | ||||
| . { | ||||
|     log . stdout "{proto} Request: {name} {type} {>id}" | ||||
| } | ||||
| ~~~ | ||||
|  | ||||
| Only log denials for example.org (and below to a file) | ||||
|  | ||||
| ~~~ | ||||
| log example.org stdout { | ||||
|     class denial | ||||
| ~~~ corefile | ||||
| . { | ||||
|     log example.org stdout { | ||||
|         class denial | ||||
|     } | ||||
| } | ||||
| ~~~ | ||||
|   | ||||
| @@ -5,13 +5,13 @@ | ||||
| The default location for the metrics is `localhost:9153`. The metrics path is fixed to `/metrics`. | ||||
| The following metrics are exported: | ||||
|  | ||||
| * coredns_dns_request_count_total{zone, proto, family} | ||||
| * coredns_dns_request_duration_milliseconds{zone} | ||||
| * coredns_dns_request_size_bytes{zone, proto} | ||||
| * coredns_dns_request_do_count_total{zone} | ||||
| * coredns_dns_request_type_count_total{zone, type} | ||||
| * coredns_dns_response_size_bytes{zone, proto} | ||||
| * coredns_dns_response_rcode_count_total{zone, rcode} | ||||
| * `coredns_dns_request_count_total{zone, proto, family}` - total query count. | ||||
| * `coredns_dns_request_duration_milliseconds{zone}` - duration to process each query. | ||||
| * `coredns_dns_request_size_bytes{zone, proto}` - size of the request in bytes. | ||||
| * `coredns_dns_request_do_count_total{zone}` -  queries that have the DO bit set | ||||
| * `coredns_dns_request_type_count_total{zone, type}` - counter of queries per zone and type. | ||||
| * `coredns_dns_response_size_bytes{zone, proto}` - response size in bytes. | ||||
| * `coredns_dns_response_rcode_count_total{zone, rcode}` - response per zone and rcode. | ||||
|  | ||||
| Each counter has a label `zone` which is the zonename used for the request/response. | ||||
|  | ||||
| @@ -27,7 +27,6 @@ Extra labels used are: | ||||
| If monitoring is enabled, queries that do not enter the plugin chain are exported under the fake | ||||
| name "dropped" (without a closing dot - this is never a valid domain name). | ||||
|  | ||||
|  | ||||
| ## Syntax | ||||
|  | ||||
| ~~~ | ||||
|   | ||||
| @@ -6,7 +6,7 @@ You can visit `/debug/pprof` on your site for an index of the available endpoint | ||||
| will listen on localhost:6053. | ||||
|  | ||||
| > This is a debugging tool. Certain requests (such as collecting execution traces) can be slow. If | ||||
| > you use pprof on a live site, consider restricting access or enabling it only temporarily. | ||||
| > you use pprof on a live server, consider restricting access or enabling it only temporarily. | ||||
|  | ||||
| For more information, please see [Go's pprof | ||||
| documentation](https://golang.org/pkg/net/http/pprof/) and read | ||||
| @@ -25,12 +25,14 @@ If not specified, ADDRESS defaults to localhost:6053. | ||||
| Enable pprof endpoints: | ||||
|  | ||||
| ~~~ | ||||
| pprof | ||||
| . { | ||||
|     pprof | ||||
| } | ||||
| ~~~ | ||||
|  | ||||
| Listen on an alternate address: | ||||
|  | ||||
| ~~~ | ||||
| ~~~ txt | ||||
| . { | ||||
|     pprof 10.9.8.7:6060 | ||||
| } | ||||
| @@ -38,6 +40,8 @@ Listen on an alternate address: | ||||
|  | ||||
| Listen on an all addresses on port 6060: | ||||
|  | ||||
| ~~~ | ||||
| pprof :6060 | ||||
| ~~~ txt | ||||
| . { | ||||
|     pprof :6060 | ||||
| } | ||||
| ~~~ | ||||
|   | ||||
| @@ -48,14 +48,19 @@ This has two fields, code and data. A match is defined as having the same code. | ||||
|  | ||||
| * A string data can be treated as hex if it starts with `0x`. Example: | ||||
|  | ||||
| ~~~ | ||||
| rewrite edns0 local set 0xffee 0x61626364 | ||||
| ~~~ corefile | ||||
| . { | ||||
|     rewrite edns0 local set 0xffee 0x61626364 | ||||
|     whoami | ||||
| } | ||||
| ~~~ | ||||
|  | ||||
| rewrites the first local option with code 0xffee, setting the data to "abcd". Equivalent: | ||||
|  | ||||
| ~~~ | ||||
| rewrite edns0 local set 0xffee abcd | ||||
| ~~~ corefile | ||||
| . { | ||||
|     rewrite edns0 local set 0xffee abcd | ||||
| } | ||||
| ~~~ | ||||
|  | ||||
| * A variable data is specified with a pair of curly brackets `{}`. Following are the supported variables: | ||||
| @@ -86,9 +91,8 @@ length is used to extract the client subnet from the source IP address in the qu | ||||
| Example: | ||||
|  | ||||
| ~~~ | ||||
|    rewrite edns0 subnet set 24 56 | ||||
| rewrite edns0 subnet set 24 56 | ||||
| ~~~ | ||||
|  | ||||
| * If the query has source IP as IPv4, the first 24 bits in the IP will be the network subnet. | ||||
| * If the query has source IP as IPv6, the first 56 bits in the IP will be the network subnet. | ||||
|  | ||||
|   | ||||
| @@ -3,6 +3,8 @@ | ||||
| *whoami* returns your resolver's local IP address, port and transport. Your IP address is returned | ||||
|  in the additional section as either an A or AAAA record. | ||||
|  | ||||
| When CoreDNS can find a Corefile to load, this is the default plugin it loads. | ||||
|  | ||||
| The reply always has an empty answer section. The port and transport are included in the additional | ||||
| section as a SRV record, transport can be "tcp" or "udp". | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user