A CoreDNS plugin to handle split dns
Go to file
Adphi 1a71c6f47b
add cname / srv / ptr doc to README
Signed-off-by: Adphi <philippe.adrien.nousse@gmail.com>
2022-12-17 23:12:41 +01:00
.github Create dependabot.yml 2022-10-27 11:05:40 +02:00
.gitignore naive implementation 2022-03-24 18:33:18 +01:00
LICENSE bootstrap from example 2022-03-24 15:26:15 +01:00
README.md add cname / srv / ptr doc to README 2022-12-17 23:12:41 +01:00
example.org add fallback nameserver, rework configuration 2022-10-27 13:19:58 +02:00
go.mod add fallback nameserver, rework configuration 2022-10-27 13:19:58 +02:00
go.sum add fallback nameserver, rework configuration 2022-10-27 13:19:58 +02:00
metrics.go go module setup, rename example as split 2022-03-24 15:43:41 +01:00
ready.go naive implementation 2022-03-24 18:33:18 +01:00
setup.go add fallback nameserver, rework configuration 2022-10-27 13:19:58 +02:00
setup_test.go naive implementation 2022-03-24 18:33:18 +01:00
split.go filter cnames, ptr and srv records (close #6 #7 #8) 2022-12-17 23:10:12 +01:00
split_test.go naive implementation 2022-03-24 18:33:18 +01:00




split - Filter DNS Server response Records based on network definitions and request source IP.


The split plugin allows filtering DNS Server responses Records based on network definitions. That way you do not need to run multiple DNS servers to handle split DNS.

If there are multiple A Records in the response, only the records matching the defined network will be returned to a matching querier, and the records not matching the network to the other sources.

⚠️ This plugin is not much about security, it is designed only to give a better answer to the incoming source IP, if you need to apply security filtering rules, please consider using the coredns acl plugin.


This package will always be compiled as part of CoreDNS and not in a standalone way. It will require you to use go get or as a dependency on plugin.cfg.

The manual will have more information about how to configure and extend the server with external plugins.

A simple way to consume this plugin, is by adding the following on plugin.cfg, and recompile it as detailed on coredns.io.


Put this higher in the plugin list, so that split is before after any of the other plugins.

After this you can compile coredns by:

go generate
go build

Or you can instead use make:



# TODO: docs


This plugin reports readiness to the ready plugin. It will be immediately ready.


In this configuration, we forward all queries to and to if did not respond.

If only used with the forward plugin, the private dns server must be configured as the first forwarded server in the list. The policy must be configured as sequential, so that the first server is always tried first and the second only if the first do not return any answer.

We filter out A / CNAME / SRV / PTR records pointing to an IP address in the network except for queries coming from the and networks. If the allowed networks are not defined, the plugin will allow the requests from the same network, e.g.

If the record exists both as public and private, the private record will be filtered, resulting with no records at all. So you can provide a fallback server that will be used to get the public record.

. {
  split {
    net allow
    net # implicitely: allow
  # we could also use any records source
  # e.g.: file example.org
  forward . {
    policy sequential

Also See

See the manual.