domain-rule: Exceptions are allowed when enable force-AAAA-SOA

This commit is contained in:
Nick Peng
2023-03-27 22:41:32 +08:00
parent 2dbde718a7
commit fa5e519368
4 changed files with 97 additions and 16 deletions

View File

@@ -106,7 +106,9 @@ bind [::]:53
# force specific qtype return soa # force specific qtype return soa
# force-qtype-SOA [qtypeid |...] # force-qtype-SOA [qtypeid |...]
# force-qtype-SOA [qtypeid,...]
# force-qtype-SOA 65 28 # force-qtype-SOA 65 28
# force-qtype-SOA 65,28
force-qtype-SOA 65 force-qtype-SOA 65
# Enable IPV4, IPV6 dual stack IP optimization selection strategy # Enable IPV4, IPV6 dual stack IP optimization selection strategy

View File

@@ -2227,19 +2227,23 @@ static int _config_qtype_soa(void *data, int argc, char *argv[])
} }
for (i = 1; i < argc; i++) { for (i = 1; i < argc; i++) {
soa_list = malloc(sizeof(*soa_list)); char sub_arg[1024];
if (soa_list == NULL) { safe_strncpy(sub_arg, argv[i], sizeof(sub_arg));
tlog(TLOG_ERROR, "cannot malloc memory"); for (char *tok = strtok(sub_arg, ","); tok; tok = strtok(NULL, ",")) {
return -1; soa_list = malloc(sizeof(*soa_list));
} if (soa_list == NULL) {
tlog(TLOG_ERROR, "cannot malloc memory");
return -1;
}
memset(soa_list, 0, sizeof(*soa_list)); memset(soa_list, 0, sizeof(*soa_list));
soa_list->qtypeid = atol(argv[i]); soa_list->qtypeid = atol(tok);
if (soa_list->qtypeid == DNS_T_AAAA) { if (soa_list->qtypeid == DNS_T_AAAA) {
dns_conf_force_AAAA_SOA = 1; dns_conf_force_AAAA_SOA = 1;
}
uint32_t key = hash_32_generic(soa_list->qtypeid, 32);
hash_add(dns_qtype_soa_table.qtype, &soa_list->node, key);
} }
uint32_t key = hash_32_generic(soa_list->qtypeid, 32);
hash_add(dns_qtype_soa_table.qtype, &soa_list->node, key);
} }
return 0; return 0;

View File

@@ -3961,7 +3961,7 @@ static int _dns_server_pre_process_rule_flags(struct dns_request *request)
if (flags & DOMAIN_FLAG_ADDR_IGN) { if (flags & DOMAIN_FLAG_ADDR_IGN) {
/* ignore this domain */ /* ignore this domain */
goto out; goto skip_soa_out;
} }
/* return specific type of address */ /* return specific type of address */
@@ -3969,7 +3969,7 @@ static int _dns_server_pre_process_rule_flags(struct dns_request *request)
case DNS_T_A: case DNS_T_A:
if (flags & DOMAIN_FLAG_ADDR_IPV4_IGN) { if (flags & DOMAIN_FLAG_ADDR_IPV4_IGN) {
/* ignore this domain for A request */ /* ignore this domain for A request */
goto out; goto skip_soa_out;
} }
if (_dns_server_is_return_soa(request)) { if (_dns_server_is_return_soa(request)) {
@@ -3983,7 +3983,7 @@ static int _dns_server_pre_process_rule_flags(struct dns_request *request)
case DNS_T_AAAA: case DNS_T_AAAA:
if (flags & DOMAIN_FLAG_ADDR_IPV6_IGN) { if (flags & DOMAIN_FLAG_ADDR_IPV6_IGN) {
/* ignore this domain for A request */ /* ignore this domain for A request */
goto out; goto skip_soa_out;
} }
if (_dns_server_is_return_soa(request)) { if (_dns_server_is_return_soa(request)) {
@@ -4007,7 +4007,8 @@ static int _dns_server_pre_process_rule_flags(struct dns_request *request)
if (_dns_server_is_return_soa(request)) { if (_dns_server_is_return_soa(request)) {
goto soa; goto soa;
} }
skip_soa_out:
request->skip_qtype_soa = 1;
out: out:
return -1; return -1;

View File

@@ -52,7 +52,7 @@ server 127.0.0.1:61053
log-num 0 log-num 0
log-console yes log-console yes
log-level debug log-level debug
force-qtype-SOA 28 65 force-qtype-SOA 28,65
cache-persist no)"""); cache-persist no)""");
smartdns::Client client; smartdns::Client client;
ASSERT_TRUE(client.Query("a.com AAAA", 60053)); ASSERT_TRUE(client.Query("a.com AAAA", 60053));
@@ -77,6 +77,80 @@ cache-persist no)""");
EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com"); EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
} }
TEST_F(QtypeSOA, AAAA_Except)
{
smartdns::MockServer server_upstream;
smartdns::Server server;
server_upstream.Start("udp://0.0.0.0:61053", [](struct smartdns::ServerRequestContext *request) {
if (request->qtype == DNS_T_A) {
smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
return smartdns::SERVER_REQUEST_OK;
} else if (request->qtype == DNS_T_AAAA) {
smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::1");
return smartdns::SERVER_REQUEST_OK;
}
return smartdns::SERVER_REQUEST_SOA;
});
server.Start(R"""(bind [::]:60053
server 127.0.0.1:61053
log-num 0
log-console yes
log-level debug
dualstack-ip-selection no
force-qtype-SOA 28
address /a.com/-
cache-persist no)""");
smartdns::Client client;
ASSERT_TRUE(client.Query("a.com AAAA", 60053));
std::cout << client.GetResult() << std::endl;
ASSERT_EQ(client.GetAnswerNum(), 1);
EXPECT_EQ(client.GetStatus(), "NOERROR");
EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
EXPECT_EQ(client.GetAnswer()[0].GetType(), "AAAA");
EXPECT_EQ(client.GetAnswer()[0].GetData(), "2001:db8::1");
}
TEST_F(QtypeSOA, force_AAAA_SOA_Except)
{
smartdns::MockServer server_upstream;
smartdns::Server server;
server_upstream.Start("udp://0.0.0.0:61053", [](struct smartdns::ServerRequestContext *request) {
if (request->qtype == DNS_T_A) {
smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
return smartdns::SERVER_REQUEST_OK;
} else if (request->qtype == DNS_T_AAAA) {
smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::1");
return smartdns::SERVER_REQUEST_OK;
}
return smartdns::SERVER_REQUEST_SOA;
});
server.Start(R"""(bind [::]:60053
server 127.0.0.1:61053
log-num 0
log-console yes
log-level debug
dualstack-ip-selection no
force-AAAA-SOA yes
address /a.com/-
cache-persist no)""");
smartdns::Client client;
ASSERT_TRUE(client.Query("a.com AAAA", 60053));
std::cout << client.GetResult() << std::endl;
ASSERT_EQ(client.GetAnswerNum(), 1);
EXPECT_EQ(client.GetStatus(), "NOERROR");
EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
EXPECT_EQ(client.GetAnswer()[0].GetType(), "AAAA");
EXPECT_EQ(client.GetAnswer()[0].GetData(), "2001:db8::1");
}
TEST_F(QtypeSOA, force_AAAA_SOA) TEST_F(QtypeSOA, force_AAAA_SOA)
{ {
smartdns::MockServer server_upstream; smartdns::MockServer server_upstream;