Sfoglia il codice sorgente

libnetwork: reply SERVFAIL if DNS forwarding fails

Fixes moby/moby issue 44575

Signed-off-by: Cory Snider <csnider@mirantis.com>
Cory Snider 2 anni fa
parent
commit
e6258e6590
2 ha cambiato i file con 38 aggiunte e 17 eliminazioni
  1. 5 6
      libnetwork/resolver.go
  2. 33 11
      libnetwork/resolver_test.go

+ 5 - 6
libnetwork/resolver.go

@@ -408,15 +408,14 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) {
 			resp = createRespMsg(query)
 		} else {
 			resp = r.forwardExtDNS(proto, maxSize, query)
-			if resp == nil {
-				return
-			}
 		}
-	} else {
-		// The backend doesn't support proxying DNS requests.
-		resp = new(dns.Msg).SetRcode(query, dns.RcodeServerFailure)
 	}
 
+	if resp == nil {
+		// We were unable to get an answer from any of the upstream DNS
+		// servers or the backend doesn't support proxying DNS requests.
+		resp = new(dns.Msg).SetRcode(query, dns.RcodeServerFailure)
+	}
 	if err = w.WriteMsg(resp); err != nil {
 		logrus.WithError(err).Errorf("[resolver] failed to write response")
 	}

+ 33 - 11
libnetwork/resolver_test.go

@@ -417,17 +417,39 @@ func (noopDNSBackend) NdotsSet() bool { return false }
 
 func (noopDNSBackend) HandleQueryResp(name string, ip net.IP) {}
 
-func TestReplySERVFAILOnInternalError(t *testing.T) {
-	defer redirectLogrusTo(t)
-
-	rsv := NewResolver("", false, badSRVDNSBackend{}).(*resolver)
-	w := &tstwriter{}
-	q := new(dns.Msg).SetQuestion("_sip._tcp.example.com.", dns.TypeSRV)
-	rsv.ServeDNS(w, q)
-	resp := w.GetResponse()
-	checkNonNullResponse(t, resp)
-	t.Log("Response: ", resp.String())
-	checkDNSResponseCode(t, resp, dns.RcodeServerFailure)
+func TestReplySERVFAIL(t *testing.T) {
+	cases := []struct {
+		name     string
+		q        *dns.Msg
+		proxyDNS bool
+	}{
+		{
+			name: "InternalError",
+			q:    new(dns.Msg).SetQuestion("_sip._tcp.example.com.", dns.TypeSRV),
+		},
+		{
+			name: "ProxyDNS=false",
+			q:    new(dns.Msg).SetQuestion("example.com.", dns.TypeA),
+		},
+		{
+			name:     "ProxyDNS=true", // No extDNS servers configured -> no answer from any upstream
+			q:        new(dns.Msg).SetQuestion("example.com.", dns.TypeA),
+			proxyDNS: true,
+		},
+	}
+	for _, tt := range cases {
+		t.Run(tt.name, func(t *testing.T) {
+			defer redirectLogrusTo(t)
+
+			rsv := NewResolver("", tt.proxyDNS, badSRVDNSBackend{}).(*resolver)
+			w := &tstwriter{}
+			rsv.ServeDNS(w, tt.q)
+			resp := w.GetResponse()
+			checkNonNullResponse(t, resp)
+			t.Log("Response: ", resp.String())
+			checkDNSResponseCode(t, resp, dns.RcodeServerFailure)
+		})
+	}
 }
 
 type badSRVDNSBackend struct{ noopDNSBackend }