Skip to content

Commit 128ed22

Browse files
committed
feat: add support for search domains in dns config
1 parent 5d1ac32 commit 128ed22

File tree

6 files changed

+85
-85
lines changed

6 files changed

+85
-85
lines changed

internal/cmd/dns.go

Lines changed: 39 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -26,35 +26,7 @@ func getDNSConfigCommand() *cobra.Command {
2626
}
2727
config := resp.Msg.Config
2828

29-
w := new(tabwriter.Writer)
30-
w.Init(os.Stdout, 8, 8, 1, '\t', 0)
31-
defer w.Flush()
32-
33-
fmt.Fprintf(w, "%s\t\t%v\n", "MagicDNS", config.MagicDns)
34-
fmt.Fprintf(w, "%s\t\t%v\n", "HTTPS Certs", config.HttpsCerts)
35-
fmt.Fprintf(w, "%s\t\t%v\n", "Override Local DNS", config.OverrideLocalDns)
36-
37-
if config.MagicDns {
38-
fmt.Fprintf(w, "MagicDNS\t%s\t%s\n", config.MagicDnsSuffix, "100.100.100.100")
39-
}
40-
41-
for k, r := range config.Routes {
42-
for i, t := range r.Routes {
43-
if i == 0 {
44-
fmt.Fprintf(w, "SplitDNS\t%s\t%s\n", k, t)
45-
} else {
46-
fmt.Fprintf(w, "%s\t%s\n", "", t)
47-
}
48-
}
49-
}
50-
51-
for i, t := range config.Nameservers {
52-
if i == 0 {
53-
fmt.Fprintf(w, "%s\t%s\t%s\n", "Global", "", t)
54-
} else {
55-
fmt.Fprintf(w, "%s\t%s\t%s\n", "", "", t)
56-
}
57-
}
29+
printDnsConfig(config)
5830

5931
return nil
6032
}
@@ -73,11 +45,13 @@ func setDNSConfigCommand() *cobra.Command {
7345
var magicDNS bool
7446
var httpsCerts bool
7547
var overrideLocalDNS bool
48+
var searchDomains []string
7649

7750
command.Flags().StringSliceVarP(&nameservers, "nameserver", "", []string{}, "Machines on your network will use these nameservers to resolve DNS queries.")
7851
command.Flags().BoolVarP(&magicDNS, "magic-dns", "", false, "Enable MagicDNS for the specified Tailnet")
7952
command.Flags().BoolVarP(&httpsCerts, "https-certs", "", false, "Enable HTTPS Certificates for the specified Tailnet")
8053
command.Flags().BoolVarP(&overrideLocalDNS, "override-local-dns", "", false, "When enabled, connected clients ignore local DNS settings and always use the nameservers specified for this Tailnet")
54+
command.Flags().StringSliceVarP(&searchDomains, "search-domain", "", []string{}, "Custom DNS search domains.")
8155

8256
command.RunE = func(cmd *cobra.Command, args []string) error {
8357
var globalNameservers []string
@@ -105,6 +79,7 @@ func setDNSConfigCommand() *cobra.Command {
10579
Nameservers: globalNameservers,
10680
Routes: routes,
10781
HttpsCerts: httpsCerts,
82+
SearchDomains: searchDomains,
10883
},
10984
}
11085
resp, err := tc.Client().SetDNSConfig(cmd.Context(), connect.NewRequest(&req))
@@ -120,38 +95,50 @@ func setDNSConfigCommand() *cobra.Command {
12095
fmt.Println()
12196
}
12297

123-
w := new(tabwriter.Writer)
124-
w.Init(os.Stdout, 8, 8, 1, '\t', 0)
125-
defer w.Flush()
98+
printDnsConfig(config)
12699

127-
fmt.Fprintf(w, "%s\t\t%v\n", "MagicDNS", config.MagicDns)
128-
fmt.Fprintf(w, "%s\t\t%v\n", "HTTPS Certs", config.HttpsCerts)
129-
fmt.Fprintf(w, "%s\t\t%v\n", "Override Local DNS", config.OverrideLocalDns)
100+
return nil
101+
}
130102

131-
if config.MagicDns {
132-
fmt.Fprintf(w, "MagicDNS\t%s\t%s\n", config.MagicDnsSuffix, "100.100.100.100")
133-
}
103+
return command
104+
}
134105

135-
for k, r := range config.Routes {
136-
for i, t := range r.Routes {
137-
if i == 0 {
138-
fmt.Fprintf(w, "SplitDNS\t%s\t%s\n", k, t)
139-
} else {
140-
fmt.Fprintf(w, "%s\t%s\n", "", t)
141-
}
142-
}
143-
}
106+
func printDnsConfig(config *api.DNSConfig) {
107+
w := new(tabwriter.Writer)
108+
w.Init(os.Stdout, 8, 8, 1, '\t', 0)
109+
defer w.Flush()
144110

145-
for i, t := range config.Nameservers {
111+
fmt.Fprintf(w, "%s\t\t%v\n", "MagicDNS", config.MagicDns)
112+
fmt.Fprintf(w, "%s\t\t%v\n", "HTTPS Certs", config.HttpsCerts)
113+
fmt.Fprintf(w, "%s\t\t%v\n", "Override Local DNS", config.OverrideLocalDns)
114+
115+
if config.MagicDns {
116+
fmt.Fprintf(w, "MagicDNS\t%s\t%s\n", config.MagicDnsSuffix, "100.100.100.100")
117+
}
118+
119+
for k, r := range config.Routes {
120+
for i, t := range r.Routes {
146121
if i == 0 {
147-
fmt.Fprintf(w, "%s\t%s\t%s\n", "Global", "", t)
122+
fmt.Fprintf(w, "SplitDNS\t%s\t%s\n", k, t)
148123
} else {
149-
fmt.Fprintf(w, "%s\t%s\t%s\n", "", "", t)
124+
fmt.Fprintf(w, "%s\t%s\n", "", t)
150125
}
151126
}
127+
}
152128

153-
return nil
129+
for i, t := range config.Nameservers {
130+
if i == 0 {
131+
fmt.Fprintf(w, "%s\t%s\t%s\n", "Global", "", t)
132+
} else {
133+
fmt.Fprintf(w, "%s\t%s\t%s\n", "", "", t)
134+
}
154135
}
155136

156-
return command
137+
for i, t := range config.SearchDomains {
138+
if i == 0 {
139+
fmt.Fprintf(w, "%s\t%s\t%s\n", "Search Domains", t, "")
140+
} else {
141+
fmt.Fprintf(w, "%s\t%s\t%s\n", "", t, "")
142+
}
143+
}
157144
}

internal/domain/dns_config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ type DNSConfig struct {
1414
OverrideLocalDNS bool `json:"override_local_dns"`
1515
Nameservers []string `json:"nameservers"`
1616
Routes map[string][]string `json:"routes"`
17+
SearchDomains []string `json:"search_domains"`
1718
}
1819

1920
func (i *DNSConfig) Scan(destination interface{}) error {

internal/mapping/mapping.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,20 +34,20 @@ func ToDNSConfig(m *domain.Machine, tailnet *domain.Tailnet, c *domain.DNSConfig
3434
sanitizeTailnetName := domain.SanitizeTailnetName(tailnet.Name)
3535
tailnetDomain := fmt.Sprintf("%s.%s", sanitizeTailnetName, config.MagicDNSSuffix())
3636

37-
resolvers := []*dnstype.Resolver{}
37+
resolvers := make([]*dnstype.Resolver, 0)
38+
3839
for _, r := range c.Nameservers {
39-
resolver := &dnstype.Resolver{
40-
Addr: r,
41-
}
42-
resolvers = append(resolvers, resolver)
40+
resolvers = append(resolvers, &dnstype.Resolver{Addr: r})
4341
}
4442

4543
dnsConfig := &tailcfg.DNSConfig{}
4644

45+
var routes = make(map[string][]*dnstype.Resolver)
4746
var domains []string
4847
var certDomains []string
4948

5049
if c.MagicDNS {
50+
routes[tailnetDomain] = nil
5151
domains = append(domains, tailnetDomain)
5252
dnsConfig.Proxied = true
5353

@@ -63,23 +63,24 @@ func ToDNSConfig(m *domain.Machine, tailnet *domain.Tailnet, c *domain.DNSConfig
6363
}
6464

6565
if len(c.Routes) != 0 || certsEnabled {
66-
routes := make(map[string][]*dnstype.Resolver)
67-
6866
for r, s := range c.Routes {
69-
routeResolver := []*dnstype.Resolver{}
67+
routeResolver := make([]*dnstype.Resolver, 0)
7068
for _, addr := range s {
71-
resolver := &dnstype.Resolver{Addr: addr}
72-
routeResolver = append(routeResolver, resolver)
69+
routeResolver = append(routeResolver, &dnstype.Resolver{Addr: addr})
7370
}
7471
routes[r] = routeResolver
75-
domains = append(domains, r)
7672
}
73+
7774
dnsConfig.Routes = routes
7875
}
7976

80-
dnsConfig.Domains = domains
77+
dnsConfig.Domains = append(domains, c.SearchDomains...)
8178
dnsConfig.CertDomains = certDomains
8279

80+
dnsConfig.ExitNodeFilteredSet = []string{
81+
fmt.Sprintf(".%s", config.MagicDNSSuffix()),
82+
}
83+
8384
return dnsConfig
8485
}
8586

internal/service/dns.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ func (s *Service) SetDNSConfig(ctx context.Context, req *connect.Request[api.Set
4242
return nil, connect.NewError(connect.CodeFailedPrecondition, fmt.Errorf("MagicDNS must be enabled when enabling HTTPS Certs"))
4343
}
4444

45+
if dnsConfig.HttpsCerts && s.dnsProvider != nil {
46+
return nil, connect.NewError(connect.CodeFailedPrecondition, fmt.Errorf("A DNS provider must be configured when enabling HTTPS Certs"))
47+
}
48+
4549
tailnet, err := s.repository.GetTailnet(ctx, req.Msg.TailnetId)
4650
if err != nil {
4751
return nil, logError(err)
@@ -50,13 +54,7 @@ func (s *Service) SetDNSConfig(ctx context.Context, req *connect.Request[api.Set
5054
return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("tailnet not found"))
5155
}
5256

53-
tailnet.DNSConfig = domain.DNSConfig{
54-
MagicDNS: dnsConfig.MagicDns,
55-
HttpsCertsEnabled: s.dnsProvider != nil && dnsConfig.HttpsCerts,
56-
OverrideLocalDNS: dnsConfig.OverrideLocalDns,
57-
Nameservers: dnsConfig.Nameservers,
58-
Routes: apiRoutesToDomainRoutes(dnsConfig.Routes),
59-
}
57+
tailnet.DNSConfig = apiDNSConfigToDomainDNSConfig(req.Msg.Config)
6058

6159
if err := s.repository.SaveTailnet(ctx, tailnet); err != nil {
6260
return nil, logError(err)
@@ -102,6 +100,7 @@ func apiDNSConfigToDomainDNSConfig(dnsConfig *api.DNSConfig) domain.DNSConfig {
102100
OverrideLocalDNS: dnsConfig.OverrideLocalDns,
103101
Nameservers: dnsConfig.Nameservers,
104102
Routes: apiRoutesToDomainRoutes(dnsConfig.Routes),
103+
SearchDomains: dnsConfig.SearchDomains,
105104
}
106105
}
107106

@@ -115,5 +114,6 @@ func domainDNSConfigToApiDNSConfig(tailnet *domain.Tailnet) *api.DNSConfig {
115114
OverrideLocalDns: dnsConfig.OverrideLocalDNS,
116115
Nameservers: dnsConfig.Nameservers,
117116
Routes: domainRoutesToApiRoutes(dnsConfig.Routes),
117+
SearchDomains: dnsConfig.SearchDomains,
118118
}
119119
}

pkg/gen/ionscale/v1/dns.pb.go

Lines changed: 24 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

proto/ionscale/v1/dns.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ message DNSConfig {
2929
map<string, Routes> routes = 4;
3030
string magic_dns_suffix = 5;
3131
bool https_certs = 6;
32+
repeated string search_domains = 7;
3233
}
3334

3435
message Routes {

0 commit comments

Comments
 (0)