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
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 5 deletions

View file

@ -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

View file

@ -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
}