Monorepo for Tangled
tangled.org
1package microvm
2
3import (
4 "net"
5 "testing"
6
7 "github.com/miekg/dns"
8)
9
10func TestFilterDNSResponseDropsBlockedAddressRecords(t *testing.T) {
11 msg := new(dns.Msg)
12 msg.Answer = []dns.RR{
13 &dns.CNAME{Hdr: dns.RR_Header{Name: "cache.example.", Rrtype: dns.TypeCNAME, Class: dns.ClassINET}, Target: "edge.example."},
14 &dns.A{Hdr: dns.RR_Header{Name: "edge.example.", Rrtype: dns.TypeA, Class: dns.ClassINET}, A: net.ParseIP("1.1.1.1")},
15 &dns.A{Hdr: dns.RR_Header{Name: "edge.example.", Rrtype: dns.TypeA, Class: dns.ClassINET}, A: net.ParseIP("10.0.0.1")},
16 &dns.AAAA{Hdr: dns.RR_Header{Name: "edge.example.", Rrtype: dns.TypeAAAA, Class: dns.ClassINET}, AAAA: net.ParseIP("2606:4700:4700::1111")},
17 &dns.AAAA{Hdr: dns.RR_Header{Name: "edge.example.", Rrtype: dns.TypeAAAA, Class: dns.ClassINET}, AAAA: net.ParseIP("fd7a:115c:a1e0::53")},
18 }
19 msg.Extra = []dns.RR{
20 &dns.A{Hdr: dns.RR_Header{Name: "private.example.", Rrtype: dns.TypeA, Class: dns.ClassINET}, A: net.ParseIP("192.168.1.2")},
21 &dns.A{Hdr: dns.RR_Header{Name: "public.example.", Rrtype: dns.TypeA, Class: dns.ClassINET}, A: net.ParseIP("8.8.8.8")},
22 }
23
24 filterDNSResponse(msg)
25
26 if len(msg.Answer) != 3 {
27 t.Fatalf("filtered answer len = %d, want 3: %#v", len(msg.Answer), msg.Answer)
28 }
29 if _, ok := msg.Answer[0].(*dns.CNAME); !ok {
30 t.Fatalf("answer[0] = %T, want CNAME", msg.Answer[0])
31 }
32 if a, ok := msg.Answer[1].(*dns.A); !ok || !a.A.Equal(net.ParseIP("1.1.1.1")) {
33 t.Fatalf("answer[1] = %#v, want public A", msg.Answer[1])
34 }
35 if aaaa, ok := msg.Answer[2].(*dns.AAAA); !ok || !aaaa.AAAA.Equal(net.ParseIP("2606:4700:4700::1111")) {
36 t.Fatalf("answer[2] = %#v, want public AAAA", msg.Answer[2])
37 }
38 if len(msg.Extra) != 1 {
39 t.Fatalf("filtered extra len = %d, want 1: %#v", len(msg.Extra), msg.Extra)
40 }
41}
42
43func TestFilterDNSResponseFiltersSVCBAddressHints(t *testing.T) {
44 msg := new(dns.Msg)
45 msg.Answer = []dns.RR{
46 &dns.HTTPS{
47 SVCB: dns.SVCB{
48 Hdr: dns.RR_Header{Name: "svc.example.", Rrtype: dns.TypeHTTPS, Class: dns.ClassINET},
49 Priority: 1,
50 Target: ".",
51 Value: []dns.SVCBKeyValue{
52 &dns.SVCBIPv4Hint{Hint: []net.IP{net.ParseIP("10.0.0.1"), net.ParseIP("8.8.8.8")}},
53 &dns.SVCBIPv6Hint{Hint: []net.IP{net.ParseIP("fd7a:115c:a1e0::53"), net.ParseIP("2001:4860:4860::8888")}},
54 },
55 },
56 },
57 }
58
59 filterDNSResponse(msg)
60
61 https := msg.Answer[0].(*dns.HTTPS)
62 if len(https.Value) != 2 {
63 t.Fatalf("https values len = %d, want 2", len(https.Value))
64 }
65 ipv4 := https.Value[0].(*dns.SVCBIPv4Hint)
66 if len(ipv4.Hint) != 1 || !ipv4.Hint[0].Equal(net.ParseIP("8.8.8.8")) {
67 t.Fatalf("ipv4 hints = %v, want [8.8.8.8]", ipv4.Hint)
68 }
69 ipv6 := https.Value[1].(*dns.SVCBIPv6Hint)
70 if len(ipv6.Hint) != 1 || !ipv6.Hint[0].Equal(net.ParseIP("2001:4860:4860::8888")) {
71 t.Fatalf("ipv6 hints = %v, want [2001:4860:4860::8888]", ipv6.Hint)
72 }
73}