Skip to content

Commit de42f92

Browse files
committed
fix: pass IPv6 DNS resolvers correctly
1 parent f612e19 commit de42f92

File tree

4 files changed

+55
-3
lines changed

4 files changed

+55
-3
lines changed

internal/controller/nginx/config/base_http_config.go

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package config
22

33
import (
4+
"fmt"
5+
"net"
46
gotemplate "text/template"
57

68
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/shared"
@@ -34,7 +36,7 @@ func executeBaseHTTPConfig(conf dataplane.Configuration) []executeResult {
3436
Includes: includes,
3537
NginxReadinessProbePort: conf.BaseHTTPConfig.NginxReadinessProbePort,
3638
IPFamily: getIPFamily(conf.BaseHTTPConfig),
37-
DNSResolver: conf.BaseHTTPConfig.DNSResolver,
39+
DNSResolver: buildDNSResolver(conf.BaseHTTPConfig.DNSResolver),
3840
AccessLog: buildAccessLog(conf.Logging.AccessLog),
3941
GatewaySecretID: conf.BaseHTTPConfig.GatewaySecretID,
4042
}
@@ -49,6 +51,34 @@ func executeBaseHTTPConfig(conf dataplane.Configuration) []executeResult {
4951
return results
5052
}
5153

54+
func buildDNSResolver(dnsResolver *dataplane.DNSResolverConfig) *dataplane.DNSResolverConfig {
55+
if dnsResolver == nil {
56+
return nil
57+
}
58+
59+
fixed := &dataplane.DNSResolverConfig{
60+
Timeout: dnsResolver.Timeout,
61+
Valid: dnsResolver.Valid,
62+
DisableIPv6: dnsResolver.DisableIPv6,
63+
}
64+
65+
for _, address := range dnsResolver.Addresses {
66+
ip := net.ParseIP(address)
67+
if ip == nil {
68+
continue
69+
}
70+
71+
if ip.To4() == nil {
72+
// nginx expects IPv6 DNS resolvers to be passed with brackets
73+
fixed.Addresses = append(fixed.Addresses, fmt.Sprintf("[%s]", address))
74+
} else {
75+
fixed.Addresses = append(fixed.Addresses, address)
76+
}
77+
}
78+
79+
return fixed
80+
}
81+
5282
func buildAccessLog(accessLogConfig *dataplane.AccessLog) *AccessLog {
5383
if accessLogConfig != nil {
5484
accessLog := &AccessLog{

internal/controller/nginx/config/base_http_config_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,28 @@ func TestExecuteBaseHttp_DNSResolver(t *testing.T) {
317317
},
318318
expectedConfig: "resolver 8.8.8.8;",
319319
},
320+
{
321+
name: "DNS resolver with single IPv6 address",
322+
conf: dataplane.Configuration{
323+
BaseHTTPConfig: dataplane.BaseHTTPConfig{
324+
DNSResolver: &dataplane.DNSResolverConfig{
325+
Addresses: []string{"2606:4700:4700::64"},
326+
},
327+
},
328+
},
329+
expectedConfig: "resolver [2606:4700:4700::64];",
330+
},
331+
{
332+
name: "DNS resolver with one IPv6 address and one IPv4 address",
333+
conf: dataplane.Configuration{
334+
BaseHTTPConfig: dataplane.BaseHTTPConfig{
335+
DNSResolver: &dataplane.DNSResolverConfig{
336+
Addresses: []string{"2606:4700:4700::64", "8.8.8.8"},
337+
},
338+
},
339+
},
340+
expectedConfig: "resolver [2606:4700:4700::64] 8.8.8.8;",
341+
},
320342
{
321343
name: "no DNS resolver",
322344
conf: dataplane.Configuration{

internal/controller/nginx/config/stream_servers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func (g GeneratorImpl) executeStreamServers(conf dataplane.Configuration) []exec
1919
Servers: streamServers,
2020
IPFamily: getIPFamily(conf.BaseHTTPConfig),
2121
Plus: g.plus,
22-
DNSResolver: conf.BaseStreamConfig.DNSResolver,
22+
DNSResolver: buildDNSResolver(conf.BaseStreamConfig.DNSResolver),
2323
}
2424

2525
streamServerResult := executeResult{

internal/controller/nginx/config/stream_servers_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@ server {
471471
},
472472
expectedConfig: `
473473
# DNS resolver configuration for ExternalName services
474-
resolver 2001:4860:4860::8888 valid=30s;
474+
resolver [2001:4860:4860::8888] valid=30s;
475475
resolver_timeout 5s;
476476
477477
server {

0 commit comments

Comments
 (0)