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:
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user