mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2024-09-20 06:46:19 +08:00
AXFRDDNS: Support separate servers for AXFR and DDNS (#2723)
Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
This commit is contained in:
parent
d1a75e9348
commit
36f6b19943
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue