mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-09-17 01:45:27 +02:00
Use discover_ptr_endpoints for PTR resolver
This commit is contained in:
@@ -285,6 +285,12 @@ func (p *prog) proxy(ctx context.Context, upstreams []string, failoverRcodes []i
|
|||||||
resolve1 := func(n int, upstreamConfig *ctrld.UpstreamConfig, msg *dns.Msg) (*dns.Msg, error) {
|
resolve1 := func(n int, upstreamConfig *ctrld.UpstreamConfig, msg *dns.Msg) (*dns.Msg, error) {
|
||||||
ctrld.Log(ctx, mainLog.Load().Debug(), "sending query to %s: %s", upstreams[n], upstreamConfig.Name)
|
ctrld.Log(ctx, mainLog.Load().Debug(), "sending query to %s: %s", upstreams[n], upstreamConfig.Name)
|
||||||
dnsResolver, err := ctrld.NewResolver(upstreamConfig)
|
dnsResolver, err := ctrld.NewResolver(upstreamConfig)
|
||||||
|
if upstreamConfig.Type == ctrld.ResolverTypePrivate {
|
||||||
|
if r := p.ptrResolver; r != nil {
|
||||||
|
ctrld.ProxyLogger.Load().Debug().Msgf("using nameservers %v for PTR resolver", p.cfg.Service.DiscoverPtrEndpoints)
|
||||||
|
dnsResolver = r
|
||||||
|
}
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctrld.Log(ctx, mainLog.Load().Error().Err(err), "failed to create resolver")
|
ctrld.Log(ctx, mainLog.Load().Error().Err(err), "failed to create resolver")
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ type prog struct {
|
|||||||
ciTable *clientinfo.Table
|
ciTable *clientinfo.Table
|
||||||
um *upstreamMonitor
|
um *upstreamMonitor
|
||||||
router router.Router
|
router router.Router
|
||||||
|
ptrResolver ctrld.Resolver
|
||||||
|
|
||||||
loopMu sync.Mutex
|
loopMu sync.Mutex
|
||||||
loop map[string]bool
|
loop map[string]bool
|
||||||
@@ -229,6 +230,9 @@ func (p *prog) run(reload bool, reloadCh chan struct{}) {
|
|||||||
p.cache = cacher
|
p.cache = cacher
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if r := p.cfg.Service.PtrResolver(); r != nil {
|
||||||
|
p.ptrResolver = r
|
||||||
|
}
|
||||||
|
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
wg.Add(len(p.cfg.Listener))
|
wg.Add(len(p.cfg.Listener))
|
||||||
|
|||||||
@@ -196,6 +196,29 @@ type ServiceConfig struct {
|
|||||||
AllocateIP bool `mapstructure:"-" toml:"-"`
|
AllocateIP bool `mapstructure:"-" toml:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PtrResolver returns a Resolver used for PTR lookup, based on ServiceConfig.DiscoverPtrEndpoints value.
|
||||||
|
func (s ServiceConfig) PtrResolver() Resolver {
|
||||||
|
if len(s.DiscoverPtrEndpoints) > 0 {
|
||||||
|
nss := make([]string, 0, len(s.DiscoverPtrEndpoints))
|
||||||
|
for _, ns := range s.DiscoverPtrEndpoints {
|
||||||
|
host, port := ns, "53"
|
||||||
|
if h, p, err := net.SplitHostPort(ns); err == nil {
|
||||||
|
host, port = h, p
|
||||||
|
}
|
||||||
|
// Only use valid ip:port pair.
|
||||||
|
if _, portErr := strconv.Atoi(port); portErr == nil && port != "0" && net.ParseIP(host) != nil {
|
||||||
|
nss = append(nss, net.JoinHostPort(host, port))
|
||||||
|
} else {
|
||||||
|
ProxyLogger.Load().Warn().Msgf("ignoring invalid nameserver for PTR resolver: %q", ns)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(nss) > 0 {
|
||||||
|
return NewResolverWithNameserver(nss)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// NetworkConfig specifies configuration for networks where ctrld will handle requests.
|
// NetworkConfig specifies configuration for networks where ctrld will handle requests.
|
||||||
type NetworkConfig struct {
|
type NetworkConfig struct {
|
||||||
Name string `mapstructure:"name" toml:"name,omitempty"`
|
Name string `mapstructure:"name" toml:"name,omitempty"`
|
||||||
|
|||||||
@@ -3,9 +3,7 @@ package clientinfo
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
@@ -185,24 +183,9 @@ func (t *Table) init() {
|
|||||||
// PTR lookup.
|
// PTR lookup.
|
||||||
if t.discoverPTR() {
|
if t.discoverPTR() {
|
||||||
t.ptr = &ptrDiscover{resolver: ctrld.NewPrivateResolver()}
|
t.ptr = &ptrDiscover{resolver: ctrld.NewPrivateResolver()}
|
||||||
if len(t.svcCfg.DiscoverPtrEndpoints) > 0 {
|
if r := t.svcCfg.PtrResolver(); r != nil {
|
||||||
nss := make([]string, 0, len(t.svcCfg.DiscoverPtrEndpoints))
|
ctrld.ProxyLogger.Load().Debug().Msgf("using nameservers %v for PTR discover", t.svcCfg.DiscoverPtrEndpoints)
|
||||||
for _, ns := range t.svcCfg.DiscoverPtrEndpoints {
|
t.ptr.resolver = r
|
||||||
host, port := ns, "53"
|
|
||||||
if h, p, err := net.SplitHostPort(ns); err == nil {
|
|
||||||
host, port = h, p
|
|
||||||
}
|
|
||||||
// Only use valid ip:port pair.
|
|
||||||
if _, portErr := strconv.Atoi(port); portErr == nil && port != "0" && net.ParseIP(host) != nil {
|
|
||||||
nss = append(nss, net.JoinHostPort(host, port))
|
|
||||||
} else {
|
|
||||||
ctrld.ProxyLogger.Load().Warn().Msgf("ignoring invalid nameserver for ptr discover: %q", ns)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(nss) > 0 {
|
|
||||||
t.ptr.resolver = ctrld.NewResolverWithNameserver(nss)
|
|
||||||
ctrld.ProxyLogger.Load().Debug().Msgf("using nameservers %v for ptr discovery", nss)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ctrld.ProxyLogger.Load().Debug().Msg("start ptr discovery")
|
ctrld.ProxyLogger.Load().Debug().Msg("start ptr discovery")
|
||||||
if err := t.ptr.refresh(); err != nil {
|
if err := t.ptr.refresh(); err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user