diff --git a/documentation/providers/axfrddns.md b/documentation/providers/axfrddns.md index ea78fbeb2..ca182e276 100644 --- a/documentation/providers/axfrddns.md +++ b/documentation/providers/axfrddns.md @@ -98,7 +98,7 @@ var DSP_AXFRDDNS = NewDnsProvider("axfrddns", { "ns4.example.com." ] } -} +) ``` {% endcode %} @@ -107,7 +107,7 @@ var DSP_AXFRDDNS = NewDnsProvider("axfrddns", { { "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`. ``` +### 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 When modifying a CNAME record, or when replacing an A record by a diff --git a/providers/axfrddns/axfrddnsProvider.go b/providers/axfrddns/axfrddnsProvider.go index 3fba13688..fabeb6a4d 100644 --- a/providers/axfrddns/axfrddnsProvider.go +++ b/providers/axfrddns/axfrddnsProvider.go @@ -58,6 +58,7 @@ type axfrddnsProvider struct { rand *rand.Rand master string updateMode string + transferServer string transferMode string nameservers []*models.Nameserver transferKey *Key @@ -125,6 +126,14 @@ func initAxfrDdns(config map[string]string, providermeta json.RawMessage) (provi } else { 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") if err != nil { return nil, err @@ -145,6 +154,7 @@ func initAxfrDdns(config map[string]string, providermeta json.RawMessage) (provi "nameservers", "update-key", "transfer-key", + "transfer-server", "update-mode", "transfer-mode", "domain", @@ -214,9 +224,9 @@ func (c *axfrddnsProvider) getAxfrConnection() (*dns.Transfer, error) { var con net.Conn = nil var err error = nil if c.transferMode == "tcp-tls" { - con, err = tls.Dial("tcp", c.master, &tls.Config{}) + con, err = tls.Dial("tcp", c.transferServer, &tls.Config{}) } else { - con, err = net.Dial("tcp", c.master) + con, err = net.Dial("tcp", c.transferServer) } if err != nil { 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 { return nil, err }