mirror of
https://github.com/tailscale/tailscale.git
synced 2025-04-08 17:24:57 +00:00

- Add a Quad100conn for the DNS resolver. This uses the dns.Manager to perform the resolution and a fake IO interface for it. - Add a UserDialCustomResolverDial to Dialer so we can override the IP resolution in UserDial, which is used by proxy handlers, to use the aforementioned Quad100conn - Update the dns Forwarder to use UserDial instead so it can reach into the tailnet - Change Dialer.UserDial to use the quad100 resolver after MagicDNS Updates #4677 Updates #9619 Signed-off-by: Samy Djemaï <53857555+SamyDjemai@users.noreply.github.com> Co-authored-by: Zero Cho <itszero@gmail.com> Co-authored-by: Matt Morrison <matt.morrison@ditto.live>
116 lines
2.7 KiB
Go
116 lines
2.7 KiB
Go
// Copyright (c) Tailscale Inc & AUTHORS
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package dns
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
"testing"
|
|
|
|
dns "golang.org/x/net/dns/dnsmessage"
|
|
"tailscale.com/health"
|
|
"tailscale.com/net/netmon"
|
|
"tailscale.com/net/tsdial"
|
|
"tailscale.com/util/dnsname"
|
|
)
|
|
|
|
func TestQuad100Conn(t *testing.T) {
|
|
f := fakeOSConfigurator{
|
|
SplitDNS: true,
|
|
BaseConfig: OSConfig{
|
|
Nameservers: mustIPs("8.8.8.8"),
|
|
SearchDomains: fqdns("coffee.shop"),
|
|
},
|
|
}
|
|
m := NewManager(t.Logf, &f, new(health.Tracker), tsdial.NewDialer(netmon.NewStatic()), nil, nil, "")
|
|
m.resolver.TestOnlySetHook(f.SetResolver)
|
|
m.Set(Config{
|
|
Hosts: hosts(
|
|
"dave.ts.net.", "1.2.3.4",
|
|
"matt.ts.net.", "2.3.4.5"),
|
|
Routes: upstreams("ts.net", ""),
|
|
SearchDomains: fqdns("tailscale.com", "universe.tf"),
|
|
})
|
|
defer m.Down()
|
|
|
|
q100 := &ManagerConn{
|
|
Ctx: context.Background(),
|
|
DnsManager: m,
|
|
}
|
|
defer q100.Close()
|
|
|
|
var b []byte
|
|
domain := dnsname.FQDN("matt.ts.net.")
|
|
|
|
// Send a query
|
|
b = mkDNSRequest(domain, dns.TypeA, addEDNS)
|
|
_, err := q100.Write(b)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
resp := make([]byte, 100)
|
|
if _, err := q100.Read(resp); err != nil {
|
|
t.Fatalf("reading data: %v", err)
|
|
}
|
|
|
|
var parser dns.Parser
|
|
if _, err := parser.Start(resp); err != nil {
|
|
t.Errorf("parser.Start() failed: %v", err)
|
|
}
|
|
_, err = parser.Question()
|
|
if err != nil {
|
|
t.Errorf("parser.Question(): %v", err)
|
|
}
|
|
if err := parser.SkipAllQuestions(); err != nil {
|
|
t.Errorf("parser.SkipAllQuestions(): %v", err)
|
|
}
|
|
ah, err := parser.AnswerHeader()
|
|
if err != nil {
|
|
t.Errorf("parser.AnswerHeader(): %v", err)
|
|
}
|
|
if ah.Type != dns.TypeA {
|
|
t.Errorf("unexpected answer type: got %v, want %v", ah.Type, dns.TypeA)
|
|
}
|
|
res, err := parser.AResource()
|
|
if err != nil {
|
|
t.Errorf("parser.AResource(): %v", err)
|
|
}
|
|
if net.IP(res.A[:]).String() != "2.3.4.5" {
|
|
t.Fatalf("dns query did not return expected result")
|
|
}
|
|
}
|
|
|
|
func TestQuad100ResolverDial(t *testing.T) {
|
|
f := fakeOSConfigurator{
|
|
SplitDNS: true,
|
|
BaseConfig: OSConfig{
|
|
Nameservers: mustIPs("8.8.8.8"),
|
|
SearchDomains: fqdns("coffee.shop"),
|
|
},
|
|
}
|
|
m := NewManager(t.Logf, &f, new(health.Tracker), tsdial.NewDialer(netmon.NewStatic()), nil, nil, "")
|
|
m.resolver.TestOnlySetHook(f.SetResolver)
|
|
m.Set(Config{
|
|
Hosts: hosts(
|
|
"dave.ts.net.", "1.2.3.4",
|
|
"matt.ts.net.", "2.3.4.5"),
|
|
Routes: upstreams("ts.net", ""),
|
|
SearchDomains: fqdns("tailscale.com", "universe.tf"),
|
|
})
|
|
defer m.Down()
|
|
|
|
var r net.Resolver
|
|
r.Dial = Quad100ResolverDial(context.Background(), m)
|
|
|
|
ips, err := r.LookupHost(context.Background(), "matt.ts.net")
|
|
if err != nil {
|
|
t.Errorf("could not resolve host: %v", err)
|
|
}
|
|
|
|
if ips[0] != "2.3.4.5" {
|
|
t.Fatalf("dns query did not return expected result")
|
|
}
|
|
}
|