1
0
mirror of https://github.com/StackExchange/dnscontrol.git synced 2024-05-11 05:55:12 +00:00

AXFRDDNS: Support separate servers for AXFR and DDNS (#2723)

Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
This commit is contained in:
Midnight Veil
2023-12-19 01:34:40 +11:00
committed by GitHub
parent d1a75e9348
commit 36f6b19943
2 changed files with 33 additions and 5 deletions

View File

@ -98,7 +98,7 @@ var DSP_AXFRDDNS = NewDnsProvider("axfrddns", {
"ns4.example.com." "ns4.example.com."
] ]
} }
} )
``` ```
{% endcode %} {% endcode %}
@ -107,7 +107,7 @@ var DSP_AXFRDDNS = NewDnsProvider("axfrddns", {
{ {
"axfrddns": { "axfrddns": {
"TYPE": "AXFRDDNS", "TYPE": "AXFRDDNS",
"nameservers": "ns1.example.com.,ns2.example.com.,ns3.example.com.,ns4.example.com." "nameservers": "ns1.example.com,ns2.example.com,ns3.example.com,ns4.example.com"
} }
} }
``` ```
@ -144,6 +144,24 @@ the following error message:
Please consider adding default `nameservers` or an explicit `master` in `creds.json`. Please consider adding default `nameservers` or an explicit `master` in `creds.json`.
``` ```
### Transfer/AXFR server
As mentioned above, the AXFR+DDNS provider will send AXFR requests to the
primary master for the zone. On some networks, the AXFR requests are handled
by a separate server to DDNS requests. Use the `transfer-server` option in
`creds.json`. If not specified, it falls back to the primary master.
{% code title="creds.json" %}
```json
{
"axfrddns": {
"TYPE": "AXFRDDNS",
"transfer-server": "233.252.0.0"
}
}
```
{% endcode %}
### Buggy DNS servers regarding CNAME updates ### Buggy DNS servers regarding CNAME updates
When modifying a CNAME record, or when replacing an A record by a When modifying a CNAME record, or when replacing an A record by a

View File

@ -58,6 +58,7 @@ type axfrddnsProvider struct {
rand *rand.Rand rand *rand.Rand
master string master string
updateMode string updateMode string
transferServer string
transferMode string transferMode string
nameservers []*models.Nameserver nameservers []*models.Nameserver
transferKey *Key transferKey *Key
@ -125,6 +126,14 @@ func initAxfrDdns(config map[string]string, providermeta json.RawMessage) (provi
} else { } else {
return nil, fmt.Errorf("nameservers list is empty: creds.json needs a default `nameservers` or an explicit `master`") return nil, fmt.Errorf("nameservers list is empty: creds.json needs a default `nameservers` or an explicit `master`")
} }
if config["transfer-server"] != "" {
api.transferServer = config["transfer-server"]
if !strings.Contains(api.transferServer, ":") {
api.transferServer = api.transferServer + ":53"
}
} else {
api.transferServer = api.master
}
api.updateKey, err = readKey(config["update-key"], "update-key") api.updateKey, err = readKey(config["update-key"], "update-key")
if err != nil { if err != nil {
return nil, err return nil, err
@ -145,6 +154,7 @@ func initAxfrDdns(config map[string]string, providermeta json.RawMessage) (provi
"nameservers", "nameservers",
"update-key", "update-key",
"transfer-key", "transfer-key",
"transfer-server",
"update-mode", "update-mode",
"transfer-mode", "transfer-mode",
"domain", "domain",
@ -214,9 +224,9 @@ func (c *axfrddnsProvider) getAxfrConnection() (*dns.Transfer, error) {
var con net.Conn = nil var con net.Conn = nil
var err error = nil var err error = nil
if c.transferMode == "tcp-tls" { if c.transferMode == "tcp-tls" {
con, err = tls.Dial("tcp", c.master, &tls.Config{}) con, err = tls.Dial("tcp", c.transferServer, &tls.Config{})
} else { } else {
con, err = net.Dial("tcp", c.master) con, err = net.Dial("tcp", c.transferServer)
} }
if err != nil { if err != nil {
return nil, err return nil, err
@ -247,7 +257,7 @@ func (c *axfrddnsProvider) FetchZoneRecords(domain string) ([]dns.RR, error) {
} }
} }
envelope, err := transfer.In(request, c.master) envelope, err := transfer.In(request, c.transferServer)
if err != nil { if err != nil {
return nil, err return nil, err
} }