Skip to content

Commit 6436c51

Browse files
Merge pull request #467 from evidolob/revert-dns
Revert PR #339
2 parents c9dd0cb + 88ffff3 commit 6436c51

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+126
-4651
lines changed

go.mod

-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ go 1.22.0
55
require (
66
github.com/Microsoft/go-winio v0.6.2
77
github.com/apparentlymart/go-cidr v1.1.0
8-
github.com/areYouLazy/libhosty v1.1.0
98
github.com/containers/winquit v1.1.0
109
github.com/coreos/stream-metadata-go v0.4.5
1110
github.com/dustin/go-humanize v1.0.1
@@ -18,7 +17,6 @@ require (
1817
github.com/onsi/gomega v1.36.2
1918
github.com/opencontainers/go-digest v1.0.0
2019
github.com/pkg/errors v0.9.1
21-
github.com/qdm12/dns/v2 v2.0.0-rc6
2220
github.com/sirupsen/logrus v1.9.3
2321
github.com/songgao/packets v0.0.0-20160404182456-549a10cd4091
2422
github.com/songgao/water v0.0.0-20200317203138-2b4b6d7c09d8

pkg/services/dns/dns.go

+123-78
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package dns
22

33
import (
4+
"context"
45
"encoding/json"
5-
"errors"
66
"fmt"
77
"net"
88
"net/http"
99
"strings"
1010
"sync"
1111

12-
"github.com/areYouLazy/libhosty"
1312
"github.com/containers/gvisor-tap-vsock/pkg/types"
1413
"github.com/miekg/dns"
1514
log "github.com/sirupsen/logrus"
@@ -18,34 +17,13 @@ import (
1817
type dnsHandler struct {
1918
zones []types.Zone
2019
zonesLock sync.RWMutex
21-
udpClient *dns.Client
22-
tcpClient *dns.Client
23-
hostsFile *HostsFile
24-
dnsConfig *dnsConfig
2520
}
2621

27-
func newDNSHandler(zones []types.Zone) (*dnsHandler, error) {
28-
dnsConfig, err := newDNSConfig()
29-
if err != nil {
30-
return nil, err
31-
}
32-
33-
hostsFile, err := NewHostsFile("")
34-
if err != nil {
35-
return nil, err
36-
}
37-
38-
return &dnsHandler{
39-
zones: zones,
40-
tcpClient: &dns.Client{Net: "tcp"},
41-
udpClient: &dns.Client{Net: "udp"},
42-
dnsConfig: dnsConfig,
43-
hostsFile: hostsFile,
44-
}, nil
45-
}
46-
47-
func (h *dnsHandler) handle(w dns.ResponseWriter, dnsClient *dns.Client, r *dns.Msg, responseMessageSize int) {
48-
m := h.addAnswers(dnsClient, r)
22+
func (h *dnsHandler) handle(w dns.ResponseWriter, r *dns.Msg, responseMessageSize int) {
23+
m := new(dns.Msg)
24+
m.SetReply(r)
25+
m.RecursionAvailable = true
26+
h.addAnswers(m)
4927
edns0 := r.IsEdns0()
5028
if edns0 != nil {
5129
responseMessageSize = int(edns0.UDPSize())
@@ -57,25 +35,23 @@ func (h *dnsHandler) handle(w dns.ResponseWriter, dnsClient *dns.Client, r *dns.
5735
}
5836

5937
func (h *dnsHandler) handleTCP(w dns.ResponseWriter, r *dns.Msg) {
60-
h.handle(w, h.tcpClient, r, dns.MaxMsgSize)
38+
h.handle(w, r, dns.MaxMsgSize)
6139
}
6240

6341
func (h *dnsHandler) handleUDP(w dns.ResponseWriter, r *dns.Msg) {
64-
h.handle(w, h.udpClient, r, dns.MinMsgSize)
42+
h.handle(w, r, dns.MinMsgSize)
6543
}
6644

6745
func (h *dnsHandler) addLocalAnswers(m *dns.Msg, q dns.Question) bool {
68-
// resolve only ipv4 requests
69-
if q.Qtype != dns.TypeA {
70-
return false
71-
}
72-
7346
h.zonesLock.RLock()
7447
defer h.zonesLock.RUnlock()
7548

7649
for _, zone := range h.zones {
7750
zoneSuffix := fmt.Sprintf(".%s", zone.Name)
7851
if strings.HasSuffix(q.Name, zoneSuffix) {
52+
if q.Qtype != dns.TypeA {
53+
return false
54+
}
7955
for _, record := range zone.Records {
8056
withoutZone := strings.TrimSuffix(q.Name, zoneSuffix)
8157
if (record.Name != "" && record.Name == withoutZone) ||
@@ -107,55 +83,127 @@ func (h *dnsHandler) addLocalAnswers(m *dns.Msg, q dns.Question) bool {
10783
m.Rcode = dns.RcodeNameError
10884
return true
10985
}
110-
ip, err := h.hostsFile.LookupByHostname(q.Name)
111-
if err != nil {
112-
// ignore only ErrHostnameNotFound error
113-
if !errors.Is(err, libhosty.ErrHostnameNotFound) {
114-
log.Errorf("Error during looking in hosts file records: %v", err)
115-
}
116-
} else {
117-
m.Answer = append(m.Answer, &dns.A{
118-
Hdr: dns.RR_Header{
119-
Name: q.Name,
120-
Rrtype: dns.TypeA,
121-
Class: dns.ClassINET,
122-
Ttl: 0,
123-
},
124-
A: ip,
125-
})
126-
return true
127-
}
12886
}
12987
return false
13088
}
13189

132-
func (h *dnsHandler) addAnswers(dnsClient *dns.Client, r *dns.Msg) *dns.Msg {
133-
m := new(dns.Msg)
134-
m.SetReply(r)
135-
m.RecursionAvailable = true
136-
90+
func (h *dnsHandler) addAnswers(m *dns.Msg) {
13791
for _, q := range m.Question {
13892
if done := h.addLocalAnswers(m, q); done {
139-
return m
93+
return
94+
}
14095

141-
// ignore IPv6 request, we support only IPv4 requests for now
142-
} else if q.Qtype == dns.TypeAAAA {
143-
return m
96+
resolver := net.Resolver{
97+
PreferGo: false,
14498
}
145-
}
146-
for _, nameserver := range h.dnsConfig.Nameservers() {
147-
msg := r.Copy()
148-
r, _, err := dnsClient.Exchange(msg, nameserver)
149-
// return first good answer
150-
if err == nil {
151-
return r
99+
switch q.Qtype {
100+
case dns.TypeA:
101+
ips, err := resolver.LookupIPAddr(context.TODO(), q.Name)
102+
if err != nil {
103+
m.Rcode = dns.RcodeNameError
104+
return
105+
}
106+
for _, ip := range ips {
107+
if len(ip.IP.To4()) != net.IPv4len {
108+
continue
109+
}
110+
m.Answer = append(m.Answer, &dns.A{
111+
Hdr: dns.RR_Header{
112+
Name: q.Name,
113+
Rrtype: dns.TypeA,
114+
Class: dns.ClassINET,
115+
Ttl: 0,
116+
},
117+
A: ip.IP.To4(),
118+
})
119+
}
120+
case dns.TypeCNAME:
121+
cname, err := resolver.LookupCNAME(context.TODO(), q.Name)
122+
if err != nil {
123+
m.Rcode = dns.RcodeNameError
124+
return
125+
}
126+
m.Answer = append(m.Answer, &dns.CNAME{
127+
Hdr: dns.RR_Header{
128+
Name: q.Name,
129+
Rrtype: dns.TypeCNAME,
130+
Class: dns.ClassINET,
131+
Ttl: 0,
132+
},
133+
Target: cname,
134+
})
135+
case dns.TypeMX:
136+
records, err := resolver.LookupMX(context.TODO(), q.Name)
137+
if err != nil {
138+
m.Rcode = dns.RcodeNameError
139+
return
140+
}
141+
for _, mx := range records {
142+
m.Answer = append(m.Answer, &dns.MX{
143+
Hdr: dns.RR_Header{
144+
Name: q.Name,
145+
Rrtype: dns.TypeMX,
146+
Class: dns.ClassINET,
147+
Ttl: 0,
148+
},
149+
Mx: mx.Host,
150+
Preference: mx.Pref,
151+
})
152+
}
153+
case dns.TypeNS:
154+
records, err := resolver.LookupNS(context.TODO(), q.Name)
155+
if err != nil {
156+
m.Rcode = dns.RcodeNameError
157+
return
158+
}
159+
for _, ns := range records {
160+
m.Answer = append(m.Answer, &dns.NS{
161+
Hdr: dns.RR_Header{
162+
Name: q.Name,
163+
Rrtype: dns.TypeNS,
164+
Class: dns.ClassINET,
165+
Ttl: 0,
166+
},
167+
Ns: ns.Host,
168+
})
169+
}
170+
case dns.TypeSRV:
171+
_, records, err := resolver.LookupSRV(context.TODO(), "", "", q.Name)
172+
if err != nil {
173+
m.Rcode = dns.RcodeNameError
174+
return
175+
}
176+
for _, srv := range records {
177+
m.Answer = append(m.Answer, &dns.SRV{
178+
Hdr: dns.RR_Header{
179+
Name: q.Name,
180+
Rrtype: dns.TypeSRV,
181+
Class: dns.ClassINET,
182+
Ttl: 0,
183+
},
184+
Port: srv.Port,
185+
Priority: srv.Priority,
186+
Target: srv.Target,
187+
Weight: srv.Weight,
188+
})
189+
}
190+
case dns.TypeTXT:
191+
records, err := resolver.LookupTXT(context.TODO(), q.Name)
192+
if err != nil {
193+
m.Rcode = dns.RcodeNameError
194+
return
195+
}
196+
m.Answer = append(m.Answer, &dns.TXT{
197+
Hdr: dns.RR_Header{
198+
Name: q.Name,
199+
Rrtype: dns.TypeTXT,
200+
Class: dns.ClassINET,
201+
Ttl: 0,
202+
},
203+
Txt: records,
204+
})
152205
}
153-
log.Debugf("Error during DNS Exchange: %s", err)
154206
}
155-
156-
// return the error if none of configured nameservers has right answer
157-
m.Rcode = dns.RcodeNameError
158-
return m
159207
}
160208

161209
type Server struct {
@@ -165,10 +213,7 @@ type Server struct {
165213
}
166214

167215
func New(udpConn net.PacketConn, tcpLn net.Listener, zones []types.Zone) (*Server, error) {
168-
handler, err := newDNSHandler(zones)
169-
if err != nil {
170-
return nil, err
171-
}
216+
handler := &dnsHandler{zones: zones}
172217
return &Server{udpConn: udpConn, tcpLn: tcpLn, handler: handler}, nil
173218
}
174219

pkg/services/dns/dns_config.go

-24
This file was deleted.

pkg/services/dns/dns_config_unix.go

-61
This file was deleted.

0 commit comments

Comments
 (0)