coredns_mysql

package module
v0.0.0-...-d0fcefa Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 28, 2023 License: Apache-2.0 Imports: 15 Imported by: 0

README

MySQL

MySQL backend for CoreDNS

Name

mysql - MySQL backend for CoreDNS

Description

This plugin uses MySQL as a backend to store DNS records. These will then can served by CoreDNS. The backend uses a simple, single table data structure that can be shared by other systems to add and remove records from the DNS server. As there is no state stored in the plugin, the service can be scaled out by spinning multiple instances of CoreDNS backed by the same database.

Syntax

mysql {
    dsn DSN
    [table_prefix TABLE_PREFIX]
    [max_lifetime MAX_LIFETIME]
    [max_open_connections MAX_OPEN_CONNECTIONS]
    [max_idle_connections MAX_IDLE_CONNECTIONS]
    [ttl DEFAULT_TTL]
    [zone_update_interval ZONE_UPDATE_INTERVAL]
}
  • dsn DSN for MySQL as per https://github.com/go-sql-driver/mysql examples. You can use $ENV_NAME format in the DSN, and it will be replaced with the environment variable value.
  • table_prefix Prefix for the MySQL tables. Defaults to coredns_.
  • max_lifetime Duration (in Golang format) for a SQL connection. Default is 1 minute.
  • max_open_connections Maximum number of open connections to the database server. Default is 10.
  • max_idle_connections Maximum number of idle connections in the database connection pool. Default is 10.
  • ttl Default TTL for records without a specified TTL in seconds. Default is 360 (seconds)
  • zone_update_interval Maximum time interval between loading all the zones from the database. Default is 10 minutes.

Supported Record Types

A, AAAA, CNAME, SOA, TXT, NS, MX, CAA and SRV. Wildcard records are supported as well. This backend doesn't support AXFR requests.

Setup (as an external plugin)

Add this as an external plugin in plugin.cfg file:

mysql:github.com/SuikeTech/coredns_mysql

then run

$ go generate
$ go build

Add any required modules to CoreDNS code as prompted.

Database Setup

This plugin doesn't create or migrate database schema for its use yet. To create the database and tables, use the following table structure (note the table name prefix):

CREATE TABLE `coredns_records` (
    `id` INT NOT NULL AUTO_INCREMENT,
	`zone` VARCHAR(255) NOT NULL,
	`name` VARCHAR(255) NOT NULL,
	`ttl` INT DEFAULT NULL,
	`content` TEXT,
	`record_type` VARCHAR(255) NOT NULL,
	PRIMARY KEY (`id`)
) ENGINE = INNODB AUTO_INCREMENT = 6 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;

Record setup

Each record served by this plugin, should belong to the zone it is allowed to server by CoreDNS. Here are some examples:

-- Insert batch #1
INSERT INTO coredns_records (zone, name, ttl, content, record_type) VALUES
('example.org.', 'foo', 30, '{"ip": "1.1.1.1"}', 'A'),
('example.org.', 'foo', '60', '{"ip": "1.1.1.0"}', 'A'),
('example.org.', 'foo', 30, '{"text": "hello"}', 'TXT'),
('example.org.', 'foo', 30, '{"host" : "foo.example.org.","priority" : 10}', 'MX');

These can be queries using dig like this:

$ dig A MX foo.example.org 
Acknowledgements and Credits

This plugin, is inspired by https://github.com/wenerme/coredns-pdsql and https://github.com/arvancloud/redis

Development

To develop this plugin further, make sure you can compile CoreDNS locally and get this repo (go get github.com/SuikeTech/coredns_mysql). You can switch the CoreDNS mod file to look for the plugin code locally while you're developing it:

Put replace github.com/SuikeTech/coredns_mysql => LOCAL_PATH_TO_THE_SOURCE_CODE at the end of the go.mod file in CoreDNS code.

Pull requests and bug reports are welcome!

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type AAAARecord

type AAAARecord struct {
	Ip net.IP `json:"ip"`
}

type ARecord

type ARecord struct {
	Ip net.IP `json:"ip"`
}

type CAARecord

type CAARecord struct {
	Flag  uint8  `json:"flag"`
	Tag   string `json:"tag"`
	Value string `json:"value"`
}

type CNAMERecord

type CNAMERecord struct {
	Host string `json:"host"`
}

type CoreDNSMySql

type CoreDNSMySql struct {
	Next               plugin.Handler
	Dsn                string
	TablePrefix        string
	MaxLifetime        time.Duration
	MaxOpenConnections int
	MaxIdleConnections int
	Ttl                uint32
	// contains filtered or unexported fields
}

func (*CoreDNSMySql) Name

func (handler *CoreDNSMySql) Name() string

Name implements the Handler interface.

func (*CoreDNSMySql) ServeDNS

func (handler *CoreDNSMySql) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error)

ServeDNS implements the plugin.Handler interface.

type MXRecord

type MXRecord struct {
	Host       string `json:"host"`
	Preference uint16 `json:"preference"`
}

type NSRecord

type NSRecord struct {
	Host string `json:"host"`
}

type Record

type Record struct {
	Zone       string
	Name       string
	RecordType string
	Ttl        uint32
	Content    string
	// contains filtered or unexported fields
}

func (*Record) AsAAAARecord

func (rec *Record) AsAAAARecord() (record dns.RR, extras []dns.RR, err error)

func (*Record) AsARecord

func (rec *Record) AsARecord() (record dns.RR, extras []dns.RR, err error)

func (*Record) AsCAARecord

func (rec *Record) AsCAARecord() (record dns.RR, extras []dns.RR, err error)

func (*Record) AsCNAMERecord

func (rec *Record) AsCNAMERecord() (record dns.RR, extras []dns.RR, err error)

func (*Record) AsMXRecord

func (rec *Record) AsMXRecord() (record dns.RR, extras []dns.RR, err error)

func (*Record) AsNSRecord

func (rec *Record) AsNSRecord() (record dns.RR, extras []dns.RR, err error)

func (*Record) AsSOARecord

func (rec *Record) AsSOARecord() (record dns.RR, extras []dns.RR, err error)

func (*Record) AsSRVRecord

func (rec *Record) AsSRVRecord() (record dns.RR, extras []dns.RR, err error)

func (*Record) AsTXTRecord

func (rec *Record) AsTXTRecord() (record dns.RR, extras []dns.RR, err error)

type SOARecord

type SOARecord struct {
	Ns      string `json:"ns"`
	MBox    string `json:"MBox"`
	Refresh uint32 `json:"refresh"`
	Retry   uint32 `json:"retry"`
	Expire  uint32 `json:"expire"`
	MinTtl  uint32 `json:"minttl"`
}

type SRVRecord

type SRVRecord struct {
	Priority uint16 `json:"priority"`
	Weight   uint16 `json:"weight"`
	Port     uint16 `json:"port"`
	Target   string `json:"target"`
}

type TXTRecord

type TXTRecord struct {
	Text string `json:"text"`
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL