From bc68d5979ccf4beb2721e1e466539da550236f68 Mon Sep 17 00:00:00 2001 From: Nick Peng Date: Sun, 22 May 2022 10:09:58 +0800 Subject: [PATCH] Support force not CNAME records --- src/dns_conf.c | 3 ++- src/dns_conf.h | 2 ++ src/dns_server.c | 14 +++++++++++--- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/dns_conf.c b/src/dns_conf.c index bb548ed..c936f80 100644 --- a/src/dns_conf.c +++ b/src/dns_conf.c @@ -111,7 +111,7 @@ int dns_conf_rr_ttl_reply_max; int dns_conf_rr_ttl_min = 600; int dns_conf_rr_ttl_max; int dns_conf_force_AAAA_SOA; - +int dns_conf_force_no_cname; int dns_conf_ipset_timeout_enable; /* ECS */ @@ -1872,6 +1872,7 @@ static struct config_item _config_item[] = { CONF_INT("rr-ttl-reply-max", &dns_conf_rr_ttl_reply_max, 0, CONF_INT_MAX), CONF_INT("max-reply-ip-num", &dns_conf_max_reply_ip_num, 1, CONF_INT_MAX), CONF_YESNO("force-AAAA-SOA", &dns_conf_force_AAAA_SOA), + CONF_YESNO("force-no-CNAME", &dns_conf_force_no_cname), CONF_CUSTOM("force-qtype-SOA", _config_qtype_soa, NULL), CONF_CUSTOM("blacklist-ip", _config_blacklist_ip, NULL), CONF_CUSTOM("whitelist-ip", _conf_whitelist_ip, NULL), diff --git a/src/dns_conf.h b/src/dns_conf.h index 8224bc9..9ff8bc9 100644 --- a/src/dns_conf.h +++ b/src/dns_conf.h @@ -299,6 +299,8 @@ extern int dns_conf_rr_ttl_max; extern int dns_conf_force_AAAA_SOA; extern int dns_conf_ipset_timeout_enable; +extern int dns_conf_force_no_cname; + extern struct dns_edns_client_subnet dns_conf_ipv4_ecs; extern struct dns_edns_client_subnet dns_conf_ipv6_ecs; diff --git a/src/dns_server.c b/src/dns_server.c index 607d9d3..d3ec5a6 100644 --- a/src/dns_server.c +++ b/src/dns_server.c @@ -1372,13 +1372,17 @@ static int _dns_ip_address_check_add(struct dns_request *request, char *cname, u tlog(TLOG_ERROR, "malloc failed"); return -1; } + memset(addr_map, 0, sizeof(*addr_map)); addr_map->addr_type = addr_type; addr_map->hitnum = 1; addr_map->recv_tick = get_tick_count(); addr_map->ping_ttl = -1; memcpy(addr_map->addr, addr, addr_len); - safe_strncpy(addr_map->cname, cname, DNS_MAX_CNAME_LEN); + if (dns_conf_force_no_cname == 0) { + safe_strncpy(addr_map->cname, cname, DNS_MAX_CNAME_LEN); + } + hash_add(request->ip_map, &addr_map->node, key); pthread_mutex_unlock(&request->ip_map_lock); @@ -1969,7 +1973,7 @@ static int _dns_server_process_answer_A(struct dns_rrs *rrs, struct dns_request request->has_ipv4 = 1; memcpy(request->ipv4_addr, addr, DNS_RR_A_LEN); request->ttl_v4 = _dns_server_get_conf_ttl(ttl); - if (cname[0] != 0 && request->has_cname == 0) { + if (cname[0] != 0 && request->has_cname == 0 && dns_conf_force_no_cname == 0) { request->has_cname = 1; safe_strncpy(request->cname, cname, DNS_MAX_CNAME_LEN); } @@ -2045,7 +2049,7 @@ static int _dns_server_process_answer_AAAA(struct dns_rrs *rrs, struct dns_reque request->has_ipv6 = 1; memcpy(request->ipv6_addr, addr, DNS_RR_AAAA_LEN); request->ttl_v6 = _dns_server_get_conf_ttl(ttl); - if (cname[0] != 0 && request->has_cname == 0) { + if (cname[0] != 0 && request->has_cname == 0 && dns_conf_force_no_cname == 0) { request->has_cname = 1; safe_strncpy(request->cname, cname, DNS_MAX_CNAME_LEN); } @@ -2317,6 +2321,10 @@ static int _dns_server_get_answer(struct dns_server_post_context *context) } break; case DNS_T_CNAME: { char cname[DNS_MAX_CNAME_LEN]; + if (dns_conf_force_no_cname) { + continue; + } + dns_get_CNAME(rrs, name, DNS_MAX_CNAME_LEN, &ttl, cname, DNS_MAX_CNAME_LEN); tlog(TLOG_DEBUG, "name:%s ttl: %d cname: %s\n", name, ttl, cname); safe_strncpy(request->cname, cname, DNS_MAX_CNAME_LEN);