Add force AAAA SOA feature
This commit is contained in:
@@ -382,6 +382,7 @@ Note: Merlin firmware is derived from ASUS firmware and can theoretically be use
|
|||||||
|server-tcp|Upstream TCP DNS server|None|[IP][:port], Repeatable| server-tcp 8.8.8.8:53
|
|server-tcp|Upstream TCP DNS server|None|[IP][:port], Repeatable| server-tcp 8.8.8.8:53
|
||||||
|address|Domain IP address|None|address /domain/ip| address /www.example.com/1.2.3.4
|
|address|Domain IP address|None|address /domain/ip| address /www.example.com/1.2.3.4
|
||||||
|bogus-nxdomain|bogus IP address|None|[IP],Repeatable| bogus-nxdomain 1.2.3.4
|
|bogus-nxdomain|bogus IP address|None|[IP],Repeatable| bogus-nxdomain 1.2.3.4
|
||||||
|
|force-AAAA-SOA|force AAAA query return SOA|no|[yes\|no]|force-AAAA-SOA yes
|
||||||
|
|
||||||
## [Donate](#Donate)
|
## [Donate](#Donate)
|
||||||
|
|
||||||
|
|||||||
@@ -382,6 +382,7 @@ rtt min/avg/max/mdev = 5.954/6.133/6.313/0.195 ms
|
|||||||
|server-tcp|上游TCP DNS|无|[IP][:port],可重复| server-tcp 8.8.8.8:53
|
|server-tcp|上游TCP DNS|无|[IP][:port],可重复| server-tcp 8.8.8.8:53
|
||||||
|address|指定域名IP地址|无|address /domain/ip| address /www.example.com/1.2.3.4
|
|address|指定域名IP地址|无|address /domain/ip| address /www.example.com/1.2.3.4
|
||||||
|bogus-nxdomain|假冒IP地址过滤|无|[ip],可重复| bogus-nxdomain 1.2.3.4
|
|bogus-nxdomain|假冒IP地址过滤|无|[ip],可重复| bogus-nxdomain 1.2.3.4
|
||||||
|
|force-AAAA-SOA|强制AAAA地址返回SOA|no|[yes\|no]|force-AAAA-SOA yes
|
||||||
|
|
||||||
## [Donate](#Donate)
|
## [Donate](#Donate)
|
||||||
|
|
||||||
|
|||||||
14
src/conf.c
14
src/conf.c
@@ -29,6 +29,7 @@ art_tree dns_conf_address;
|
|||||||
int dns_conf_rr_ttl;
|
int dns_conf_rr_ttl;
|
||||||
int dns_conf_rr_ttl_min;
|
int dns_conf_rr_ttl_min;
|
||||||
int dns_conf_rr_ttl_max;
|
int dns_conf_rr_ttl_max;
|
||||||
|
int dns_conf_force_AAAA_SOA;
|
||||||
|
|
||||||
int load_conf_file(const char *file);
|
int load_conf_file(const char *file);
|
||||||
|
|
||||||
@@ -224,6 +225,18 @@ int config_cache_prefetch_domain(char *value)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int config_force_AAAA_SOA(char *value)
|
||||||
|
{
|
||||||
|
/* read dns cache size */
|
||||||
|
if (strncmp("yes", value, sizeof("yes")) == 0 || strncmp("YES", value, sizeof("YES")) == 0) {
|
||||||
|
dns_conf_force_AAAA_SOA = 1;
|
||||||
|
} else if (strncmp("no", value, sizeof("no")) == 0 || strncmp("NO", value, sizeof("NO")) == 0) {
|
||||||
|
dns_conf_force_AAAA_SOA = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int config_log_level(char *value)
|
int config_log_level(char *value)
|
||||||
{
|
{
|
||||||
/* read log level and set */
|
/* read log level and set */
|
||||||
@@ -467,6 +480,7 @@ struct config_item config_item[] = {
|
|||||||
{"rr-ttl", config_rr_ttl},
|
{"rr-ttl", config_rr_ttl},
|
||||||
{"rr-ttl-min", config_rr_ttl_min},
|
{"rr-ttl-min", config_rr_ttl_min},
|
||||||
{"rr-ttl-max", config_rr_ttl_max},
|
{"rr-ttl-max", config_rr_ttl_max},
|
||||||
|
{"force-AAAA-SOA", config_force_AAAA_SOA},
|
||||||
{"bogus-nxdomain", conf_bogus_nxdomain},
|
{"bogus-nxdomain", conf_bogus_nxdomain},
|
||||||
{"conf-file", config_addtional_file},
|
{"conf-file", config_addtional_file},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ extern art_tree dns_conf_address;
|
|||||||
extern int dns_conf_rr_ttl;
|
extern int dns_conf_rr_ttl;
|
||||||
extern int dns_conf_rr_ttl_min;
|
extern int dns_conf_rr_ttl_min;
|
||||||
extern int dns_conf_rr_ttl_max;
|
extern int dns_conf_rr_ttl_max;
|
||||||
|
extern int dns_conf_force_AAAA_SOA;
|
||||||
|
|
||||||
int dns_bogus_nxdomain_exists(unsigned char *ip, dns_type_t addr_type);
|
int dns_bogus_nxdomain_exists(unsigned char *ip, dns_type_t addr_type);
|
||||||
|
|
||||||
|
|||||||
@@ -541,10 +541,11 @@ static int _dns_server_process_answer(struct dns_request *request, char *domain,
|
|||||||
int j = 0;
|
int j = 0;
|
||||||
struct dns_rrs *rrs = NULL;
|
struct dns_rrs *rrs = NULL;
|
||||||
|
|
||||||
if (packet->head.rcode != DNS_RC_NOERROR) {
|
if (packet->head.rcode != DNS_RC_NOERROR && packet->head.rcode != DNS_RC_NXDOMAIN) {
|
||||||
if (request->rcode == DNS_RC_SERVFAIL) {
|
if (request->rcode == DNS_RC_SERVFAIL) {
|
||||||
request->rcode = packet->head.rcode;
|
request->rcode = packet->head.rcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
tlog(TLOG_DEBUG, "inquery failed, %s, rcode = %d, id = %d\n", domain, packet->head.rcode, packet->head.id);
|
tlog(TLOG_DEBUG, "inquery failed, %s, rcode = %d, id = %d\n", domain, packet->head.rcode, packet->head.id);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -793,6 +794,27 @@ errout:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int _dns_server_reply_SOA(int rcode, struct dns_request *request, struct dns_packet *packet)
|
||||||
|
{
|
||||||
|
struct dns_soa *soa;
|
||||||
|
|
||||||
|
request->rcode = rcode;
|
||||||
|
request->has_soa = 1;
|
||||||
|
|
||||||
|
soa = &request->soa;
|
||||||
|
|
||||||
|
strcpy(soa->mname, "a.gtld-servers.net");
|
||||||
|
strcpy(soa->rname, "nstld.verisign-grs.com");
|
||||||
|
soa->serial = 1800;
|
||||||
|
soa->refresh = 1800;
|
||||||
|
soa->retry = 900;
|
||||||
|
soa->expire = 604800;
|
||||||
|
soa->minimum = 86400;
|
||||||
|
_dns_reply(request);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void _dns_server_log_rule(char *domain, unsigned char *rule_key, int rule_key_len)
|
static void _dns_server_log_rule(char *domain, unsigned char *rule_key, int rule_key_len)
|
||||||
{
|
{
|
||||||
char rule_name[DNS_MAX_CNAME_LEN];
|
char rule_name[DNS_MAX_CNAME_LEN];
|
||||||
@@ -997,6 +1019,11 @@ static int _dns_server_recv(unsigned char *inpacket, int inpacket_len, struct so
|
|||||||
case DNS_T_A:
|
case DNS_T_A:
|
||||||
break;
|
break;
|
||||||
case DNS_T_AAAA:
|
case DNS_T_AAAA:
|
||||||
|
if (dns_conf_force_AAAA_SOA == 1) {
|
||||||
|
_dns_server_reply_SOA(DNS_RC_NOERROR, request, packet);
|
||||||
|
free(request);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
tlog(TLOG_DEBUG, "unsupport qtype: %d, domain: %s", qtype, request->domain);
|
tlog(TLOG_DEBUG, "unsupport qtype: %d, domain: %s", qtype, request->domain);
|
||||||
|
|||||||
Reference in New Issue
Block a user