Skip to content

Commit 83175d6

Browse files
committed
Apply global DNS resolvers to reverse proxy and ACME server modules
1 parent b1a77d3 commit 83175d6

File tree

3 files changed

+99
-1
lines changed

3 files changed

+99
-1
lines changed

modules/caddyhttp/reverseproxy/httptransport.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,34 @@ func (h *HTTPTransport) NewTransport(caddyCtx caddy.Context) (*http.Transport, e
269269
return d.DialContext(ctx, addr.Network, addr.JoinHostPort(0))
270270
},
271271
}
272+
} else {
273+
// If no local resolver is configured, check for global resolvers from TLS app
274+
tlsAppIface, err := caddyCtx.App("tls")
275+
if err == nil {
276+
tlsApp := tlsAppIface.(*caddytls.TLS)
277+
if len(tlsApp.Resolvers) > 0 {
278+
// Create UpstreamResolver from global resolvers
279+
h.Resolver = &UpstreamResolver{
280+
Addresses: tlsApp.Resolvers,
281+
}
282+
err := h.Resolver.ParseAddresses()
283+
if err != nil {
284+
return nil, err
285+
}
286+
d := &net.Dialer{
287+
Timeout: time.Duration(h.DialTimeout),
288+
FallbackDelay: time.Duration(h.FallbackDelay),
289+
}
290+
dialer.Resolver = &net.Resolver{
291+
PreferGo: true,
292+
Dial: func(ctx context.Context, _, _ string) (net.Conn, error) {
293+
//nolint:gosec
294+
addr := h.Resolver.netAddrs[weakrand.Intn(len(h.Resolver.netAddrs))]
295+
return d.DialContext(ctx, addr.Network, addr.JoinHostPort(0))
296+
},
297+
}
298+
}
299+
}
272300
}
273301

274302
dialContext := func(ctx context.Context, network, address string) (net.Conn, error) {

modules/caddyhttp/reverseproxy/upstreams.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"go.uber.org/zap/zapcore"
1616

1717
"github.com/caddyserver/caddy/v2"
18+
"github.com/caddyserver/caddy/v2/modules/caddytls"
1819
)
1920

2021
func init() {
@@ -106,6 +107,34 @@ func (su *SRVUpstreams) Provision(ctx caddy.Context) error {
106107
return d.DialContext(ctx, addr.Network, addr.JoinHostPort(0))
107108
},
108109
}
110+
} else {
111+
// If no local resolver is configured, check for global resolvers from TLS app
112+
tlsAppIface, err := ctx.App("tls")
113+
if err == nil {
114+
tlsApp := tlsAppIface.(*caddytls.TLS)
115+
if len(tlsApp.Resolvers) > 0 {
116+
// Create UpstreamResolver from global resolvers
117+
su.Resolver = &UpstreamResolver{
118+
Addresses: tlsApp.Resolvers,
119+
}
120+
err := su.Resolver.ParseAddresses()
121+
if err != nil {
122+
return err
123+
}
124+
d := &net.Dialer{
125+
Timeout: time.Duration(su.DialTimeout),
126+
FallbackDelay: time.Duration(su.FallbackDelay),
127+
}
128+
su.resolver = &net.Resolver{
129+
PreferGo: true,
130+
Dial: func(ctx context.Context, _, _ string) (net.Conn, error) {
131+
//nolint:gosec
132+
addr := su.Resolver.netAddrs[weakrand.Intn(len(su.Resolver.netAddrs))]
133+
return d.DialContext(ctx, addr.Network, addr.JoinHostPort(0))
134+
},
135+
}
136+
}
137+
}
109138
}
110139
if su.resolver == nil {
111140
su.resolver = net.DefaultResolver
@@ -326,6 +355,34 @@ func (au *AUpstreams) Provision(ctx caddy.Context) error {
326355
return d.DialContext(ctx, addr.Network, addr.JoinHostPort(0))
327356
},
328357
}
358+
} else {
359+
// If no local resolver is configured, check for global resolvers from TLS app
360+
tlsAppIface, err := ctx.App("tls")
361+
if err == nil {
362+
tlsApp := tlsAppIface.(*caddytls.TLS)
363+
if len(tlsApp.Resolvers) > 0 {
364+
// Create UpstreamResolver from global resolvers
365+
au.Resolver = &UpstreamResolver{
366+
Addresses: tlsApp.Resolvers,
367+
}
368+
err := au.Resolver.ParseAddresses()
369+
if err != nil {
370+
return err
371+
}
372+
d := &net.Dialer{
373+
Timeout: time.Duration(au.DialTimeout),
374+
FallbackDelay: time.Duration(au.FallbackDelay),
375+
}
376+
au.resolver = &net.Resolver{
377+
PreferGo: true,
378+
Dial: func(ctx context.Context, _, _ string) (net.Conn, error) {
379+
//nolint:gosec
380+
addr := au.Resolver.netAddrs[weakrand.Intn(len(au.Resolver.netAddrs))]
381+
return d.DialContext(ctx, addr.Network, addr.JoinHostPort(0))
382+
},
383+
}
384+
}
385+
}
329386
}
330387
if au.resolver == nil {
331388
au.resolver = net.DefaultResolver

modules/caddypki/acmeserver/acmeserver.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import (
4040
"github.com/caddyserver/caddy/v2"
4141
"github.com/caddyserver/caddy/v2/modules/caddyhttp"
4242
"github.com/caddyserver/caddy/v2/modules/caddypki"
43+
"github.com/caddyserver/caddy/v2/modules/caddytls"
4344
)
4445

4546
func init() {
@@ -287,7 +288,19 @@ func (ash Handler) openDatabase() (*db.AuthDB, error) {
287288
// makeClient creates an ACME client which will use a custom
288289
// resolver instead of net.DefaultResolver.
289290
func (ash Handler) makeClient() (acme.Client, error) {
290-
for _, v := range ash.Resolvers {
291+
// If no local resolvers are configured, check for global resolvers from TLS app
292+
resolversToUse := ash.Resolvers
293+
if len(resolversToUse) == 0 {
294+
tlsAppIface, err := ash.ctx.App("tls")
295+
if err == nil {
296+
tlsApp := tlsAppIface.(*caddytls.TLS)
297+
if len(tlsApp.Resolvers) > 0 {
298+
resolversToUse = tlsApp.Resolvers
299+
}
300+
}
301+
}
302+
303+
for _, v := range resolversToUse {
291304
addr, err := caddy.ParseNetworkAddressWithDefaults(v, "udp", 53)
292305
if err != nil {
293306
return nil, err

0 commit comments

Comments
 (0)