Преглед изворни кода

dns_server: fix nameserver issue for private PTR query.

Nick Peng пре 7 месеци
родитељ
комит
1a86c758bc
2 измењених фајлова са 77 додато и 0 уклоњено
  1. 6 0
      src/dns_server.c
  2. 71 0
      test/cases/test-ptr.cc

+ 6 - 0
src/dns_server.c

@@ -5085,6 +5085,7 @@ static int _dns_server_process_local_ptr(struct dns_request *request)
 	prefix_t prefix;
 	radix_node_t *node = NULL;
 	struct local_addr_cache_item *addr_cache_item = NULL;
+	struct dns_nameserver_rule *ptr_nameserver_rule;
 
 	if (_dns_server_parser_addr_from_apra(request->domain, ptr_addr, &ptr_addr_len, sizeof(ptr_addr)) != 0) {
 		/* Determine if the smartdns service is in effect. */
@@ -5124,6 +5125,11 @@ static int _dns_server_process_local_ptr(struct dns_request *request)
 	}
 
 out:
+	ptr_nameserver_rule = _dns_server_get_dns_rule(request, DOMAIN_RULE_NAMESERVER);
+	if (ptr_nameserver_rule != NULL && ptr_nameserver_rule->group_name[0] != 0) {
+		goto errout;
+	}
+
 	if (found == 0 && _dns_server_is_private_address(ptr_addr, ptr_addr_len) == 0) {
 		request->has_soa = 1;
 		_dns_server_setup_soa(request);

+ 71 - 0
test/cases/test-ptr.cc

@@ -155,3 +155,74 @@ dualstack-ip-selection no
 	EXPECT_EQ(client.GetAnswer()[0].GetType(), "PTR");
 	EXPECT_EQ(client.GetAnswer()[0].GetData(), "my-server.");
 }
+
+
+TEST_F(Ptr, private_soa)
+{
+	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;
+		}
+
+		if (request->qtype == DNS_T_PTR) {
+			dns_add_PTR(request->response_packet, DNS_RRS_AN, request->domain.c_str(), 30, "my-hostname");
+			request->response_packet->head.rcode = DNS_RC_NOERROR;
+			return smartdns::SERVER_REQUEST_OK;
+		}
+
+		return smartdns::SERVER_REQUEST_SOA;
+	});
+
+	server.Start(R"""(bind [::]:60053
+server 127.0.0.1:61053
+dualstack-ip-selection no
+)""");
+	smartdns::Client client;
+	ASSERT_TRUE(client.Query("4.3.168.192.in-addr.arpa PTR", 60053));
+	std::cout << client.GetResult() << std::endl;
+	ASSERT_EQ(client.GetAnswerNum(), 0);
+	EXPECT_EQ(client.GetStatus(), "NOERROR");
+	EXPECT_EQ(client.GetAuthority()[0].GetName(), "4.3.168.192.in-addr.arpa");
+	EXPECT_EQ(client.GetAuthority()[0].GetTTL(), 600);
+	EXPECT_EQ(client.GetAuthority()[0].GetType(), "SOA");
+}
+
+TEST_F(Ptr, private_nameserver)
+{
+	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;
+		}
+
+		if (request->qtype == DNS_T_PTR) {
+			dns_add_PTR(request->response_packet, DNS_RRS_AN, request->domain.c_str(), 30, "my-hostname");
+			request->response_packet->head.rcode = DNS_RC_NOERROR;
+			return smartdns::SERVER_REQUEST_OK;
+		}
+
+		return smartdns::SERVER_REQUEST_SOA;
+	});
+
+	server.Start(R"""(bind [::]:60053
+server 127.0.0.1:61053 -group test-server
+nameserver /168.192.in-addr.arpa/test-server
+dualstack-ip-selection no
+)""");
+	smartdns::Client client;
+	ASSERT_TRUE(client.Query("4.3.168.192.in-addr.arpa PTR", 60053));
+	std::cout << client.GetResult() << std::endl;
+	ASSERT_EQ(client.GetAnswerNum(), 1);
+	EXPECT_EQ(client.GetStatus(), "NOERROR");
+	EXPECT_EQ(client.GetAnswer()[0].GetName(), "4.3.168.192.in-addr.arpa");
+	EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
+	EXPECT_EQ(client.GetAnswer()[0].GetType(), "PTR");
+	EXPECT_EQ(client.GetAnswer()[0].GetData(), "my-hostname.");
+}