dns_server: cache ptr record
This commit is contained in:
150
src/dns_server.c
150
src/dns_server.c
@@ -953,7 +953,7 @@ static int _dns_add_rrs(struct dns_server_post_context *context)
|
|||||||
char *domain = request->domain;
|
char *domain = request->domain;
|
||||||
if (request->has_ptr) {
|
if (request->has_ptr) {
|
||||||
/* add PTR record */
|
/* add PTR record */
|
||||||
ret = dns_add_PTR(context->packet, DNS_RRS_AN, request->domain, 30, request->ptr_hostname);
|
ret = dns_add_PTR(context->packet, DNS_RRS_AN, request->domain, request->ip_ttl, request->ptr_hostname);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add CNAME record */
|
/* add CNAME record */
|
||||||
@@ -1258,6 +1258,22 @@ static inline int _dns_server_expired_cache_ttl(struct dns_cache *cache)
|
|||||||
return cache->info.insert_time + cache->info.ttl + dns_conf_serve_expired_ttl - time(NULL);
|
return cache->info.insert_time + cache->info.ttl + dns_conf_serve_expired_ttl - time(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int _dns_cache_is_specify_packet(int qtype)
|
||||||
|
{
|
||||||
|
switch (qtype) {
|
||||||
|
case DNS_T_PTR:
|
||||||
|
case DNS_T_HTTPS:
|
||||||
|
case DNS_T_TXT:
|
||||||
|
case DNS_T_SRV:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int _dns_server_get_cache_timeout(struct dns_request *request, struct dns_cache_key *cache_key, int ttl)
|
static int _dns_server_get_cache_timeout(struct dns_request *request, struct dns_cache_key *cache_key, int ttl)
|
||||||
{
|
{
|
||||||
int timeout = 0;
|
int timeout = 0;
|
||||||
@@ -1266,7 +1282,7 @@ static int _dns_server_get_cache_timeout(struct dns_request *request, struct dns
|
|||||||
return ttl + 1;
|
return ttl + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dns_conf_prefetch) {
|
if (dns_conf_prefetch && _dns_cache_is_specify_packet(request->qtype) != 0) {
|
||||||
if (dns_conf_serve_expired) {
|
if (dns_conf_serve_expired) {
|
||||||
timeout = dns_conf_serve_expired_prefetch_time;
|
timeout = dns_conf_serve_expired_prefetch_time;
|
||||||
if (timeout == 0) {
|
if (timeout == 0) {
|
||||||
@@ -1514,15 +1530,15 @@ static int _dns_cache_packet(struct dns_server_post_context *context)
|
|||||||
cache_key.query_flag = request->server_flags;
|
cache_key.query_flag = request->server_flags;
|
||||||
|
|
||||||
if (request->prefetch) {
|
if (request->prefetch) {
|
||||||
if (dns_cache_replace(&cache_key, request->rcode, context->reply_ttl, -1,
|
if (dns_cache_replace(&cache_key, request->rcode, request->ip_ttl, -1,
|
||||||
_dns_server_get_cache_timeout(request, &cache_key, context->reply_ttl),
|
_dns_server_get_cache_timeout(request, &cache_key, request->ip_ttl),
|
||||||
!request->prefetch_expired_domain, cache_packet) != 0) {
|
!request->prefetch_expired_domain, cache_packet) != 0) {
|
||||||
goto errout;
|
goto errout;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* insert result to cache */
|
/* insert result to cache */
|
||||||
if (dns_cache_insert(&cache_key, request->rcode, context->reply_ttl, -1,
|
if (dns_cache_insert(&cache_key, request->rcode, request->ip_ttl, -1,
|
||||||
_dns_server_get_cache_timeout(request, NULL, context->reply_ttl), cache_packet) != 0) {
|
_dns_server_get_cache_timeout(request, NULL, request->ip_ttl), cache_packet) != 0) {
|
||||||
goto errout;
|
goto errout;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1585,15 +1601,8 @@ static int _dns_result_callback(struct dns_server_post_context *context)
|
|||||||
|
|
||||||
static int _dns_cache_specify_packet(struct dns_server_post_context *context)
|
static int _dns_cache_specify_packet(struct dns_server_post_context *context)
|
||||||
{
|
{
|
||||||
switch (context->qtype) {
|
if (_dns_cache_is_specify_packet(context->qtype) != 0) {
|
||||||
case DNS_T_PTR:
|
|
||||||
case DNS_T_HTTPS:
|
|
||||||
case DNS_T_TXT:
|
|
||||||
case DNS_T_SRV:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return _dns_cache_packet(context);
|
return _dns_cache_packet(context);
|
||||||
@@ -3969,6 +3978,50 @@ errout:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int _dns_server_get_local_ttl(struct dns_request *request)
|
||||||
|
{
|
||||||
|
struct dns_ttl_rule *ttl_rule;
|
||||||
|
|
||||||
|
/* get domain rule flag */
|
||||||
|
ttl_rule = _dns_server_get_dns_rule(request, DOMAIN_RULE_TTL);
|
||||||
|
if (ttl_rule != NULL) {
|
||||||
|
if (ttl_rule->ttl > 0) {
|
||||||
|
return ttl_rule->ttl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dns_conf_local_ttl > 0) {
|
||||||
|
return dns_conf_local_ttl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dns_conf_rr_ttl > 0) {
|
||||||
|
return dns_conf_rr_ttl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dns_conf_rr_ttl_min > 0) {
|
||||||
|
return dns_conf_rr_ttl_min;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DNS_SERVER_ADDR_TTL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int _dns_server_process_private_ptr(struct dns_request *request)
|
||||||
|
{
|
||||||
|
int a, b, c, d;
|
||||||
|
int ret = sscanf(request->domain, "%d.%d.%d.%d.in-addr.arpa", &a, &b, &c, &d);
|
||||||
|
if (ret != 4) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d == 10 || (d == 172 && c >= 16 && c <= 31) || (d == 192 && c == 168)) {
|
||||||
|
request->has_soa = 1;
|
||||||
|
_dns_server_setup_soa(request);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
static int _dns_server_process_ptr(struct dns_request *request)
|
static int _dns_server_process_ptr(struct dns_request *request)
|
||||||
{
|
{
|
||||||
if (_dns_server_process_ptrs(request) == 0) {
|
if (_dns_server_process_ptrs(request) == 0) {
|
||||||
@@ -3979,14 +4032,20 @@ static int _dns_server_process_ptr(struct dns_request *request)
|
|||||||
goto reply_exit;
|
goto reply_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_dns_server_process_private_ptr(request) == 0) {
|
||||||
|
goto reply_exit;
|
||||||
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
reply_exit:
|
reply_exit:
|
||||||
request->rcode = DNS_RC_NOERROR;
|
request->rcode = DNS_RC_NOERROR;
|
||||||
|
request->ip_ttl = _dns_server_get_local_ttl(request);
|
||||||
struct dns_server_post_context context;
|
struct dns_server_post_context context;
|
||||||
_dns_server_post_context_init(&context, request);
|
_dns_server_post_context_init(&context, request);
|
||||||
context.do_reply = 1;
|
context.do_reply = 1;
|
||||||
context.do_audit = 0;
|
context.do_audit = 0;
|
||||||
|
context.do_cache = 1;
|
||||||
_dns_request_post(&context);
|
_dns_request_post(&context);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -4275,33 +4334,6 @@ soa:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _dns_server_get_local_ttl(struct dns_request *request)
|
|
||||||
{
|
|
||||||
struct dns_ttl_rule *ttl_rule;
|
|
||||||
|
|
||||||
/* get domain rule flag */
|
|
||||||
ttl_rule = _dns_server_get_dns_rule(request, DOMAIN_RULE_TTL);
|
|
||||||
if (ttl_rule != NULL) {
|
|
||||||
if (ttl_rule->ttl > 0) {
|
|
||||||
return ttl_rule->ttl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dns_conf_local_ttl > 0) {
|
|
||||||
return dns_conf_local_ttl;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dns_conf_rr_ttl > 0) {
|
|
||||||
return dns_conf_rr_ttl;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dns_conf_rr_ttl_min > 0) {
|
|
||||||
return dns_conf_rr_ttl_min;
|
|
||||||
}
|
|
||||||
|
|
||||||
return DNS_SERVER_ADDR_TTL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _dns_server_address_generate_order(int orders[], int order_num, int max_order_count)
|
static int _dns_server_address_generate_order(int orders[], int order_num, int max_order_count)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@@ -4918,6 +4950,10 @@ static int _dns_server_process_cache(struct dns_request *request)
|
|||||||
goto reply_cache;
|
goto reply_cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (request->qtype != DNS_T_A && request->qtype != DNS_T_AAAA) {
|
||||||
|
goto reply_cache;
|
||||||
|
}
|
||||||
|
|
||||||
if (request->dualstack_selection) {
|
if (request->dualstack_selection) {
|
||||||
int dualstack_qtype = 0;
|
int dualstack_qtype = 0;
|
||||||
if (request->qtype == DNS_T_A) {
|
if (request->qtype == DNS_T_A) {
|
||||||
@@ -4925,7 +4961,7 @@ static int _dns_server_process_cache(struct dns_request *request)
|
|||||||
} else if (request->qtype == DNS_T_AAAA) {
|
} else if (request->qtype == DNS_T_AAAA) {
|
||||||
dualstack_qtype = DNS_T_A;
|
dualstack_qtype = DNS_T_A;
|
||||||
} else {
|
} else {
|
||||||
goto out;
|
goto reply_cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
cache_key.qtype = dualstack_qtype;
|
cache_key.qtype = dualstack_qtype;
|
||||||
@@ -5114,20 +5150,26 @@ static int _dns_server_process_smartdns_domain(struct dns_request *request)
|
|||||||
return _dns_server_reply_request_eth_ip(request);
|
return _dns_server_reply_request_eth_ip(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int _dns_server_process_ptr_query(struct dns_request *request)
|
||||||
|
{
|
||||||
|
if (request->qtype != DNS_T_PTR) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_dns_server_process_ptr(request) == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
request->passthrough = 1;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
static int _dns_server_process_special_query(struct dns_request *request)
|
static int _dns_server_process_special_query(struct dns_request *request)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
switch (request->qtype) {
|
switch (request->qtype) {
|
||||||
case DNS_T_PTR:
|
case DNS_T_PTR:
|
||||||
/* return PTR record */
|
|
||||||
ret = _dns_server_process_ptr(request);
|
|
||||||
if (ret == 0) {
|
|
||||||
goto clean_exit;
|
|
||||||
} else {
|
|
||||||
/* pass to upstream server */
|
|
||||||
request->passthrough = 1;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case DNS_T_SVCB:
|
case DNS_T_SVCB:
|
||||||
ret = _dns_server_process_srv(request);
|
ret = _dns_server_process_srv(request);
|
||||||
@@ -5141,7 +5183,6 @@ static int _dns_server_process_special_query(struct dns_request *request)
|
|||||||
case DNS_T_A:
|
case DNS_T_A:
|
||||||
break;
|
break;
|
||||||
case DNS_T_AAAA:
|
case DNS_T_AAAA:
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
tlog(TLOG_DEBUG, "unsupported qtype: %d, domain: %s", request->qtype, request->domain);
|
tlog(TLOG_DEBUG, "unsupported qtype: %d, domain: %s", request->qtype, request->domain);
|
||||||
@@ -5400,6 +5441,11 @@ static int _dns_server_do_query(struct dns_request *request, int skip_notify_eve
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* process ptr */
|
||||||
|
if (_dns_server_process_ptr_query(request) == 0) {
|
||||||
|
goto clean_exit;
|
||||||
|
}
|
||||||
|
|
||||||
ret = _dns_server_set_to_pending_list(request);
|
ret = _dns_server_set_to_pending_list(request);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
goto clean_exit;
|
goto clean_exit;
|
||||||
@@ -6467,7 +6513,7 @@ static int _dns_server_cache_expired(struct dns_cache *dns_cache)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dns_conf_prefetch == 1) {
|
if (dns_conf_prefetch == 1 && _dns_cache_is_specify_packet(dns_cache->info.qtype) != 0) {
|
||||||
if (dns_conf_serve_expired == 1) {
|
if (dns_conf_serve_expired == 1) {
|
||||||
return _dns_server_prefetch_expired_domain(dns_cache);
|
return _dns_server_prefetch_expired_domain(dns_cache);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user