all: add tests; imp addrproc, docs
This commit is contained in:
@@ -25,8 +25,8 @@ NOTE: Add new changes BELOW THIS COMMENT.
|
|||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- Occasional client information lookup failures leading to DNS resolving getting
|
- Occasional client information lookup failures that could lead to the DNS
|
||||||
stuck ([#6006]).
|
server getting stuck ([#6006]).
|
||||||
- `bufio.Scanner: token too long` errors when trying to add filtering-rule lists
|
- `bufio.Scanner: token too long` errors when trying to add filtering-rule lists
|
||||||
with lines over 1024 bytes long ([#6003]).
|
with lines over 1024 bytes long ([#6003]).
|
||||||
|
|
||||||
|
|||||||
@@ -39,11 +39,29 @@ func TestMain(m *testing.M) {
|
|||||||
testutil.DiscardLogOutput(m)
|
testutil.DiscardLogOutput(m)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// testTimeout is the common timeout for tests.
|
||||||
|
//
|
||||||
|
// TODO(a.garipov): Use more.
|
||||||
|
const testTimeout = 1 * time.Second
|
||||||
|
|
||||||
|
// testQuestionTarget is the common question target for tests.
|
||||||
|
//
|
||||||
|
// TODO(a.garipov): Use more.
|
||||||
|
const testQuestionTarget = "target.example"
|
||||||
|
|
||||||
const (
|
const (
|
||||||
tlsServerName = "testdns.adguard.com"
|
tlsServerName = "testdns.adguard.com"
|
||||||
testMessagesCount = 10
|
testMessagesCount = 10
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// testClientAddr is the common net.Addr for tests.
|
||||||
|
//
|
||||||
|
// TODO(a.garipov): Use more.
|
||||||
|
var testClientAddr net.Addr = &net.TCPAddr{
|
||||||
|
IP: net.IP{1, 2, 3, 4},
|
||||||
|
Port: 12345,
|
||||||
|
}
|
||||||
|
|
||||||
func startDeferStop(t *testing.T, s *Server) {
|
func startDeferStop(t *testing.T, s *Server) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
@@ -53,6 +71,13 @@ func startDeferStop(t *testing.T, s *Server) {
|
|||||||
testutil.CleanupAndRequireSuccess(t, s.Stop)
|
testutil.CleanupAndRequireSuccess(t, s.Stop)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// packageUpstreamVariableMu is used to serialize access to the package-level
|
||||||
|
// variables of package upstream.
|
||||||
|
//
|
||||||
|
// TODO(s.chzhen): Move these parameters to upstream options and remove this
|
||||||
|
// crutch.
|
||||||
|
var packageUpstreamVariableMu = &sync.Mutex{}
|
||||||
|
|
||||||
func createTestServer(
|
func createTestServer(
|
||||||
t *testing.T,
|
t *testing.T,
|
||||||
filterConf *filtering.Config,
|
filterConf *filtering.Config,
|
||||||
@@ -61,6 +86,9 @@ func createTestServer(
|
|||||||
) (s *Server) {
|
) (s *Server) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
|
packageUpstreamVariableMu.Lock()
|
||||||
|
defer packageUpstreamVariableMu.Unlock()
|
||||||
|
|
||||||
rules := `||nxdomain.example.org
|
rules := `||nxdomain.example.org
|
||||||
||NULL.example.org^
|
||NULL.example.org^
|
||||||
127.0.0.1 host.example.org
|
127.0.0.1 host.example.org
|
||||||
@@ -307,11 +335,9 @@ func TestServer(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestServer_timeout(t *testing.T) {
|
func TestServer_timeout(t *testing.T) {
|
||||||
const timeout time.Duration = time.Second
|
|
||||||
|
|
||||||
t.Run("custom", func(t *testing.T) {
|
t.Run("custom", func(t *testing.T) {
|
||||||
srvConf := &ServerConfig{
|
srvConf := &ServerConfig{
|
||||||
UpstreamTimeout: timeout,
|
UpstreamTimeout: testTimeout,
|
||||||
FilteringConfig: FilteringConfig{
|
FilteringConfig: FilteringConfig{
|
||||||
BlockingMode: BlockingModeDefault,
|
BlockingMode: BlockingModeDefault,
|
||||||
EDNSClientSubnet: &EDNSClientSubnet{Enabled: false},
|
EDNSClientSubnet: &EDNSClientSubnet{Enabled: false},
|
||||||
@@ -324,7 +350,7 @@ func TestServer_timeout(t *testing.T) {
|
|||||||
err = s.Prepare(srvConf)
|
err = s.Prepare(srvConf)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
assert.Equal(t, timeout, s.conf.UpstreamTimeout)
|
assert.Equal(t, testTimeout, s.conf.UpstreamTimeout)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("default", func(t *testing.T) {
|
t.Run("default", func(t *testing.T) {
|
||||||
@@ -545,7 +571,7 @@ func TestInvalidRequest(t *testing.T) {
|
|||||||
|
|
||||||
// Send a DNS request without question.
|
// Send a DNS request without question.
|
||||||
_, _, err := (&dns.Client{
|
_, _, err := (&dns.Client{
|
||||||
Timeout: 500 * time.Millisecond,
|
Timeout: testTimeout,
|
||||||
}).Exchange(&req, addr)
|
}).Exchange(&req, addr)
|
||||||
|
|
||||||
assert.NoErrorf(t, err, "got a response to an invalid query")
|
assert.NoErrorf(t, err, "got a response to an invalid query")
|
||||||
|
|||||||
@@ -50,10 +50,10 @@ func (s *Server) beforeRequestHandler(
|
|||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// getClientRequestFilteringSettings looks up client filtering settings using
|
// clientRequestFilteringSettings looks up client filtering settings using the
|
||||||
// the client's IP address and ID, if any, from dctx.
|
// client's IP address and ID, if any, from dctx.
|
||||||
func (s *Server) getClientRequestFilteringSettings(dctx *dnsContext) *filtering.Settings {
|
func (s *Server) clientRequestFilteringSettings(dctx *dnsContext) (setts *filtering.Settings) {
|
||||||
setts := s.dnsFilter.Settings()
|
setts = s.dnsFilter.Settings()
|
||||||
setts.ProtectionEnabled = dctx.protectionEnabled
|
setts.ProtectionEnabled = dctx.protectionEnabled
|
||||||
if s.conf.FilterHandler != nil {
|
if s.conf.FilterHandler != nil {
|
||||||
ip, _ := netutil.IPAndPortFromAddr(dctx.proxyCtx.Addr)
|
ip, _ := netutil.IPAndPortFromAddr(dctx.proxyCtx.Addr)
|
||||||
|
|||||||
@@ -161,6 +161,22 @@ func (s *Server) processRecursion(dctx *dnsContext) (rc resultCode) {
|
|||||||
return resultCodeSuccess
|
return resultCodeSuccess
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// mozillaFQDN is the domain used to signal the Firefox browser to not use its
|
||||||
|
// own DoH server.
|
||||||
|
//
|
||||||
|
// See https://support.mozilla.org/en-US/kb/canary-domain-use-application-dnsnet.
|
||||||
|
const mozillaFQDN = "use-application-dns.net."
|
||||||
|
|
||||||
|
// healthcheckFQDN is a reserved domain-name used for healthchecking.
|
||||||
|
//
|
||||||
|
// [Section 6.2 of RFC 6761] states that DNS Registries/Registrars must not
|
||||||
|
// grant requests to register test names in the normal way to any person or
|
||||||
|
// entity, making domain names under the test. TLD free to use in internal
|
||||||
|
// purposes.
|
||||||
|
//
|
||||||
|
// [Section 6.2 of RFC 6761]: https://www.rfc-editor.org/rfc/rfc6761.html#section-6.2
|
||||||
|
const healthcheckFQDN = "healthcheck.adguardhome.test."
|
||||||
|
|
||||||
// processInitial terminates the following processing for some requests if
|
// processInitial terminates the following processing for some requests if
|
||||||
// needed and enriches dctx with some client-specific information.
|
// needed and enriches dctx with some client-specific information.
|
||||||
//
|
//
|
||||||
@@ -170,6 +186,8 @@ func (s *Server) processInitial(dctx *dnsContext) (rc resultCode) {
|
|||||||
defer log.Debug("dnsforward: finished processing initial")
|
defer log.Debug("dnsforward: finished processing initial")
|
||||||
|
|
||||||
pctx := dctx.proxyCtx
|
pctx := dctx.proxyCtx
|
||||||
|
s.processClientIP(pctx.Addr)
|
||||||
|
|
||||||
q := pctx.Req.Question[0]
|
q := pctx.Req.Question[0]
|
||||||
qt := q.Qtype
|
qt := q.Qtype
|
||||||
if s.conf.AAAADisabled && qt == dns.TypeAAAA {
|
if s.conf.AAAADisabled && qt == dns.TypeAAAA {
|
||||||
@@ -178,26 +196,13 @@ func (s *Server) processInitial(dctx *dnsContext) (rc resultCode) {
|
|||||||
return resultCodeFinish
|
return resultCodeFinish
|
||||||
}
|
}
|
||||||
|
|
||||||
s.processClientIP(pctx.Addr)
|
if (qt == dns.TypeA || qt == dns.TypeAAAA) && q.Name == mozillaFQDN {
|
||||||
|
|
||||||
// Disable Mozilla DoH.
|
|
||||||
//
|
|
||||||
// See https://support.mozilla.org/en-US/kb/canary-domain-use-application-dnsnet.
|
|
||||||
if (qt == dns.TypeA || qt == dns.TypeAAAA) && q.Name == "use-application-dns.net." {
|
|
||||||
pctx.Res = s.genNXDomain(pctx.Req)
|
pctx.Res = s.genNXDomain(pctx.Req)
|
||||||
|
|
||||||
return resultCodeFinish
|
return resultCodeFinish
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle a reserved domain healthcheck.adguardhome.test.
|
if q.Name == healthcheckFQDN {
|
||||||
//
|
|
||||||
// [Section 6.2 of RFC 6761] states that DNS Registries/Registrars must not
|
|
||||||
// grant requests to register test names in the normal way to any person or
|
|
||||||
// entity, making domain names under test. TLD free to use in internal
|
|
||||||
// purposes.
|
|
||||||
//
|
|
||||||
// [Section 6.2 of RFC 6761]: https://www.rfc-editor.org/rfc/rfc6761.html#section-6.2
|
|
||||||
if q.Name == "healthcheck.adguardhome.test." {
|
|
||||||
// Generate a NODATA negative response to make nslookup exit with 0.
|
// Generate a NODATA negative response to make nslookup exit with 0.
|
||||||
pctx.Res = s.makeResponse(pctx.Req)
|
pctx.Res = s.makeResponse(pctx.Req)
|
||||||
|
|
||||||
@@ -212,7 +217,7 @@ func (s *Server) processInitial(dctx *dnsContext) (rc resultCode) {
|
|||||||
|
|
||||||
// Get the client-specific filtering settings.
|
// Get the client-specific filtering settings.
|
||||||
dctx.protectionEnabled, _ = s.UpdatedProtectionStatus()
|
dctx.protectionEnabled, _ = s.UpdatedProtectionStatus()
|
||||||
dctx.setts = s.getClientRequestFilteringSettings(dctx)
|
dctx.setts = s.clientRequestFilteringSettings(dctx)
|
||||||
|
|
||||||
return resultCodeSuccess
|
return resultCodeSuccess
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import (
|
|||||||
"github.com/AdguardTeam/dnsproxy/upstream"
|
"github.com/AdguardTeam/dnsproxy/upstream"
|
||||||
"github.com/AdguardTeam/golibs/netutil"
|
"github.com/AdguardTeam/golibs/netutil"
|
||||||
"github.com/AdguardTeam/golibs/testutil"
|
"github.com/AdguardTeam/golibs/testutil"
|
||||||
|
"github.com/AdguardTeam/urlfilter/rules"
|
||||||
"github.com/miekg/dns"
|
"github.com/miekg/dns"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
@@ -22,6 +23,95 @@ const (
|
|||||||
ddrTestFQDN = ddrTestDomainName + "."
|
ddrTestFQDN = ddrTestDomainName + "."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestServer_ProcessInitial(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
target string
|
||||||
|
wantRCode rules.RCode
|
||||||
|
qType rules.RRType
|
||||||
|
aaaaDisabled bool
|
||||||
|
wantRC resultCode
|
||||||
|
}{{
|
||||||
|
name: "success",
|
||||||
|
target: testQuestionTarget,
|
||||||
|
wantRCode: -1,
|
||||||
|
qType: dns.TypeA,
|
||||||
|
aaaaDisabled: false,
|
||||||
|
wantRC: resultCodeSuccess,
|
||||||
|
}, {
|
||||||
|
name: "aaaa_disabled",
|
||||||
|
target: testQuestionTarget,
|
||||||
|
wantRCode: dns.RcodeSuccess,
|
||||||
|
qType: dns.TypeAAAA,
|
||||||
|
aaaaDisabled: true,
|
||||||
|
wantRC: resultCodeFinish,
|
||||||
|
}, {
|
||||||
|
name: "aaaa_disabled_a",
|
||||||
|
target: testQuestionTarget,
|
||||||
|
wantRCode: -1,
|
||||||
|
qType: dns.TypeA,
|
||||||
|
aaaaDisabled: true,
|
||||||
|
wantRC: resultCodeSuccess,
|
||||||
|
}, {
|
||||||
|
name: "mozilla_canary",
|
||||||
|
target: mozillaFQDN,
|
||||||
|
wantRCode: dns.RcodeNameError,
|
||||||
|
qType: dns.TypeA,
|
||||||
|
aaaaDisabled: false,
|
||||||
|
wantRC: resultCodeFinish,
|
||||||
|
}, {
|
||||||
|
name: "adguardhome_healthcheck",
|
||||||
|
target: healthcheckFQDN,
|
||||||
|
wantRCode: dns.RcodeSuccess,
|
||||||
|
qType: dns.TypeA,
|
||||||
|
aaaaDisabled: false,
|
||||||
|
wantRC: resultCodeFinish,
|
||||||
|
}}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
tc := tc
|
||||||
|
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
clientIPs := make(chan netip.Addr, 1)
|
||||||
|
|
||||||
|
c := ServerConfig{
|
||||||
|
FilteringConfig: FilteringConfig{
|
||||||
|
AAAADisabled: tc.aaaaDisabled,
|
||||||
|
EDNSClientSubnet: &EDNSClientSubnet{Enabled: false},
|
||||||
|
},
|
||||||
|
ClientIPs: clientIPs,
|
||||||
|
}
|
||||||
|
|
||||||
|
s := createTestServer(t, &filtering.Config{}, c, nil)
|
||||||
|
|
||||||
|
dctx := &dnsContext{
|
||||||
|
proxyCtx: &proxy.DNSContext{
|
||||||
|
Req: createTestMessageWithType(tc.target, tc.qType),
|
||||||
|
Addr: testClientAddr,
|
||||||
|
RequestID: 1234,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
gotRC := s.processInitial(dctx)
|
||||||
|
assert.Equal(t, tc.wantRC, gotRC)
|
||||||
|
|
||||||
|
gotAddr, _ := testutil.RequireReceive(t, clientIPs, testTimeout)
|
||||||
|
assert.Equal(t, netutil.NetAddrToAddrPort(testClientAddr).Addr(), gotAddr)
|
||||||
|
|
||||||
|
if tc.wantRCode > 0 {
|
||||||
|
gotResp := dctx.proxyCtx.Res
|
||||||
|
require.NotNil(t, gotResp)
|
||||||
|
|
||||||
|
assert.Equal(t, tc.wantRCode, gotResp.Rcode)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestServer_ProcessDDRQuery(t *testing.T) {
|
func TestServer_ProcessDDRQuery(t *testing.T) {
|
||||||
dohSVCB := &dns.SVCB{
|
dohSVCB := &dns.SVCB{
|
||||||
Priority: 1,
|
Priority: 1,
|
||||||
@@ -64,7 +154,7 @@ func TestServer_ProcessDDRQuery(t *testing.T) {
|
|||||||
}{{
|
}{{
|
||||||
name: "pass_host",
|
name: "pass_host",
|
||||||
wantRes: resultCodeSuccess,
|
wantRes: resultCodeSuccess,
|
||||||
host: "example.net.",
|
host: testQuestionTarget,
|
||||||
qtype: dns.TypeSVCB,
|
qtype: dns.TypeSVCB,
|
||||||
ddrEnabled: true,
|
ddrEnabled: true,
|
||||||
portDoH: 8043,
|
portDoH: 8043,
|
||||||
@@ -234,33 +324,33 @@ func TestServer_ProcessDetermineLocal(t *testing.T) {
|
|||||||
func TestServer_ProcessDHCPHosts_localRestriction(t *testing.T) {
|
func TestServer_ProcessDHCPHosts_localRestriction(t *testing.T) {
|
||||||
knownIP := netip.MustParseAddr("1.2.3.4")
|
knownIP := netip.MustParseAddr("1.2.3.4")
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
|
wantIP netip.Addr
|
||||||
name string
|
name string
|
||||||
host string
|
host string
|
||||||
wantIP netip.Addr
|
|
||||||
wantRes resultCode
|
wantRes resultCode
|
||||||
isLocalCli bool
|
isLocalCli bool
|
||||||
}{{
|
}{{
|
||||||
|
wantIP: knownIP,
|
||||||
name: "local_client_success",
|
name: "local_client_success",
|
||||||
host: "example.lan",
|
host: "example.lan",
|
||||||
wantIP: knownIP,
|
|
||||||
wantRes: resultCodeSuccess,
|
wantRes: resultCodeSuccess,
|
||||||
isLocalCli: true,
|
isLocalCli: true,
|
||||||
}, {
|
}, {
|
||||||
|
wantIP: netip.Addr{},
|
||||||
name: "local_client_unknown_host",
|
name: "local_client_unknown_host",
|
||||||
host: "wronghost.lan",
|
host: "wronghost.lan",
|
||||||
wantIP: netip.Addr{},
|
|
||||||
wantRes: resultCodeSuccess,
|
wantRes: resultCodeSuccess,
|
||||||
isLocalCli: true,
|
isLocalCli: true,
|
||||||
}, {
|
}, {
|
||||||
|
wantIP: netip.Addr{},
|
||||||
name: "external_client_known_host",
|
name: "external_client_known_host",
|
||||||
host: "example.lan",
|
host: "example.lan",
|
||||||
wantIP: netip.Addr{},
|
|
||||||
wantRes: resultCodeFinish,
|
wantRes: resultCodeFinish,
|
||||||
isLocalCli: false,
|
isLocalCli: false,
|
||||||
}, {
|
}, {
|
||||||
|
wantIP: netip.Addr{},
|
||||||
name: "external_client_unknown_host",
|
name: "external_client_unknown_host",
|
||||||
host: "wronghost.lan",
|
host: "wronghost.lan",
|
||||||
wantIP: netip.Addr{},
|
|
||||||
wantRes: resultCodeFinish,
|
wantRes: resultCodeFinish,
|
||||||
isLocalCli: false,
|
isLocalCli: false,
|
||||||
}}
|
}}
|
||||||
@@ -332,52 +422,52 @@ func TestServer_ProcessDHCPHosts(t *testing.T) {
|
|||||||
|
|
||||||
knownIP := netip.MustParseAddr("1.2.3.4")
|
knownIP := netip.MustParseAddr("1.2.3.4")
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
|
wantIP netip.Addr
|
||||||
name string
|
name string
|
||||||
host string
|
host string
|
||||||
suffix string
|
suffix string
|
||||||
wantIP netip.Addr
|
|
||||||
wantRes resultCode
|
wantRes resultCode
|
||||||
qtyp uint16
|
qtyp uint16
|
||||||
}{{
|
}{{
|
||||||
|
wantIP: netip.Addr{},
|
||||||
name: "success_external",
|
name: "success_external",
|
||||||
host: examplecom,
|
host: examplecom,
|
||||||
suffix: defaultLocalDomainSuffix,
|
suffix: defaultLocalDomainSuffix,
|
||||||
wantIP: netip.Addr{},
|
|
||||||
wantRes: resultCodeSuccess,
|
wantRes: resultCodeSuccess,
|
||||||
qtyp: dns.TypeA,
|
qtyp: dns.TypeA,
|
||||||
}, {
|
}, {
|
||||||
|
wantIP: netip.Addr{},
|
||||||
name: "success_external_non_a",
|
name: "success_external_non_a",
|
||||||
host: examplecom,
|
host: examplecom,
|
||||||
suffix: defaultLocalDomainSuffix,
|
suffix: defaultLocalDomainSuffix,
|
||||||
wantIP: netip.Addr{},
|
|
||||||
wantRes: resultCodeSuccess,
|
wantRes: resultCodeSuccess,
|
||||||
qtyp: dns.TypeCNAME,
|
qtyp: dns.TypeCNAME,
|
||||||
}, {
|
}, {
|
||||||
|
wantIP: knownIP,
|
||||||
name: "success_internal",
|
name: "success_internal",
|
||||||
host: examplelan,
|
host: examplelan,
|
||||||
suffix: defaultLocalDomainSuffix,
|
suffix: defaultLocalDomainSuffix,
|
||||||
wantIP: knownIP,
|
|
||||||
wantRes: resultCodeSuccess,
|
wantRes: resultCodeSuccess,
|
||||||
qtyp: dns.TypeA,
|
qtyp: dns.TypeA,
|
||||||
}, {
|
}, {
|
||||||
|
wantIP: netip.Addr{},
|
||||||
name: "success_internal_unknown",
|
name: "success_internal_unknown",
|
||||||
host: "example-new.lan",
|
host: "example-new.lan",
|
||||||
suffix: defaultLocalDomainSuffix,
|
suffix: defaultLocalDomainSuffix,
|
||||||
wantIP: netip.Addr{},
|
|
||||||
wantRes: resultCodeSuccess,
|
wantRes: resultCodeSuccess,
|
||||||
qtyp: dns.TypeA,
|
qtyp: dns.TypeA,
|
||||||
}, {
|
}, {
|
||||||
|
wantIP: netip.Addr{},
|
||||||
name: "success_internal_aaaa",
|
name: "success_internal_aaaa",
|
||||||
host: examplelan,
|
host: examplelan,
|
||||||
suffix: defaultLocalDomainSuffix,
|
suffix: defaultLocalDomainSuffix,
|
||||||
wantIP: netip.Addr{},
|
|
||||||
wantRes: resultCodeSuccess,
|
wantRes: resultCodeSuccess,
|
||||||
qtyp: dns.TypeAAAA,
|
qtyp: dns.TypeAAAA,
|
||||||
}, {
|
}, {
|
||||||
|
wantIP: knownIP,
|
||||||
name: "success_custom_suffix",
|
name: "success_custom_suffix",
|
||||||
host: "example.custom",
|
host: "example.custom",
|
||||||
suffix: "custom",
|
suffix: "custom",
|
||||||
wantIP: knownIP,
|
|
||||||
wantRes: resultCodeSuccess,
|
wantRes: resultCodeSuccess,
|
||||||
qtyp: dns.TypeA,
|
qtyp: dns.TypeA,
|
||||||
}}
|
}}
|
||||||
@@ -560,10 +650,8 @@ func TestServer_ProcessLocalPTR_usingResolvers(t *testing.T) {
|
|||||||
var dnsCtx *dnsContext
|
var dnsCtx *dnsContext
|
||||||
setup := func(use bool) {
|
setup := func(use bool) {
|
||||||
proxyCtx = &proxy.DNSContext{
|
proxyCtx = &proxy.DNSContext{
|
||||||
Addr: &net.TCPAddr{
|
Addr: testClientAddr,
|
||||||
IP: net.IP{127, 0, 0, 1},
|
Req: createTestMessageWithType(reqAddr, dns.TypePTR),
|
||||||
},
|
|
||||||
Req: createTestMessageWithType(reqAddr, dns.TypePTR),
|
|
||||||
}
|
}
|
||||||
dnsCtx = &dnsContext{
|
dnsCtx = &dnsContext{
|
||||||
proxyCtx: proxyCtx,
|
proxyCtx: proxyCtx,
|
||||||
|
|||||||
@@ -42,11 +42,13 @@ func (s *Server) loadUpstreams() (upstreams []string, err error) {
|
|||||||
|
|
||||||
// prepareUpstreamSettings sets upstream DNS server settings.
|
// prepareUpstreamSettings sets upstream DNS server settings.
|
||||||
func (s *Server) prepareUpstreamSettings() (err error) {
|
func (s *Server) prepareUpstreamSettings() (err error) {
|
||||||
// We're setting a customized set of RootCAs. The reason is that Go default
|
// Use a customized set of RootCAs, because Go's default mechanism of
|
||||||
// mechanism of loading TLS roots does not always work properly on some
|
// loading TLS roots does not always work properly on some routers so we're
|
||||||
// routers so we're loading roots manually and pass it here.
|
// loading roots manually and pass it here.
|
||||||
//
|
//
|
||||||
// See [aghtls.SystemRootCAs].
|
// See [aghtls.SystemRootCAs].
|
||||||
|
//
|
||||||
|
// TODO(a.garipov): Investigate if that's true.
|
||||||
upstream.RootCAs = s.conf.TLSv12Roots
|
upstream.RootCAs = s.conf.TLSv12Roots
|
||||||
upstream.CipherSuites = s.conf.TLSCiphers
|
upstream.CipherSuites = s.conf.TLSCiphers
|
||||||
|
|
||||||
@@ -190,7 +192,7 @@ func (s *Server) resolveUpstreamsWithHosts(
|
|||||||
|
|
||||||
// extractUpstreamHost returns the hostname of addr without port with an
|
// extractUpstreamHost returns the hostname of addr without port with an
|
||||||
// assumption that any address passed here has already been successfully parsed
|
// assumption that any address passed here has already been successfully parsed
|
||||||
// by [upstream.AddressToUpstream]. This function eesentially mirrors the logic
|
// by [upstream.AddressToUpstream]. This function essentially mirrors the logic
|
||||||
// of [upstream.AddressToUpstream], see TODO on [replaceUpstreamsWithHosts].
|
// of [upstream.AddressToUpstream], see TODO on [replaceUpstreamsWithHosts].
|
||||||
func extractUpstreamHost(addr string) (host string) {
|
func extractUpstreamHost(addr string) (host string) {
|
||||||
var err error
|
var err error
|
||||||
|
|||||||
@@ -38,7 +38,10 @@ const (
|
|||||||
// newClientAddrProcessor returns a new client address processor. c must not be
|
// newClientAddrProcessor returns a new client address processor. c must not be
|
||||||
// nil.
|
// nil.
|
||||||
func newClientAddrProcessor(c *clientSourcesConfig) (p *clientAddrProcessor) {
|
func newClientAddrProcessor(c *clientSourcesConfig) (p *clientAddrProcessor) {
|
||||||
p = &clientAddrProcessor{}
|
p = &clientAddrProcessor{
|
||||||
|
rdns: &rdns.Empty{},
|
||||||
|
whois: &whois.Empty{},
|
||||||
|
}
|
||||||
|
|
||||||
if c.RDNS {
|
if c.RDNS {
|
||||||
p.rdns = rdns.New(&rdns.Config{
|
p.rdns = rdns.New(&rdns.Config{
|
||||||
@@ -46,8 +49,6 @@ func newClientAddrProcessor(c *clientSourcesConfig) (p *clientAddrProcessor) {
|
|||||||
CacheSize: defaultCacheSize,
|
CacheSize: defaultCacheSize,
|
||||||
CacheTTL: defaultIPTTL,
|
CacheTTL: defaultIPTTL,
|
||||||
})
|
})
|
||||||
} else {
|
|
||||||
p.rdns = rdns.Empty{}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.WHOIS {
|
if c.WHOIS {
|
||||||
@@ -78,15 +79,13 @@ func newClientAddrProcessor(c *clientSourcesConfig) (p *clientAddrProcessor) {
|
|||||||
MaxInfoLen: defaultMaxInfoLen,
|
MaxInfoLen: defaultMaxInfoLen,
|
||||||
CacheTTL: defaultIPTTL,
|
CacheTTL: defaultIPTTL,
|
||||||
})
|
})
|
||||||
} else {
|
|
||||||
p.whois = whois.Empty{}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
// process processes the incoming client IP-address information. It is intended
|
// process processes the incoming client IP-address information. It is intended
|
||||||
// to be used as a goroutine.
|
// to be used as a goroutine. Once clientIPs is closed, process exits.
|
||||||
func (p *clientAddrProcessor) process(clientIPs <-chan netip.Addr) {
|
func (p *clientAddrProcessor) process(clientIPs <-chan netip.Addr) {
|
||||||
defer log.OnPanic("clientAddrProcessor.process")
|
defer log.OnPanic("clientAddrProcessor.process")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user