dns_conf: add bootstrap-dns option for server.

This commit is contained in:
Nick Peng
2023-03-08 22:44:31 +08:00
parent f14cf9105d
commit 905a43ac67
7 changed files with 203 additions and 61 deletions

View File

@@ -447,7 +447,8 @@ errout:
}
/* check whether server exists */
static int _dns_client_server_exist(const char *server_ip, int port, dns_server_type_t server_type, struct client_dns_server_flags *flags)
static int _dns_client_server_exist(const char *server_ip, int port, dns_server_type_t server_type,
struct client_dns_server_flags *flags)
{
struct dns_server_info *server_info = NULL;
struct dns_server_info *tmp = NULL;
@@ -458,7 +459,7 @@ static int _dns_client_server_exist(const char *server_ip, int port, dns_server_
continue;
}
if (memcmp(&server_info->flags, flags, sizeof(*flags)) == 0) {
if (memcmp(&server_info->flags, flags, sizeof(*flags)) != 0) {
continue;
}
@@ -489,7 +490,8 @@ static void _dns_client_server_update_ttl(struct ping_host_struct *ping_host, co
}
/* get server control block by ip and port, type */
static struct dns_server_info *_dns_client_get_server(char *server_ip, int port, dns_server_type_t server_type)
static struct dns_server_info *_dns_client_get_server(char *server_ip, int port, dns_server_type_t server_type,
struct client_dns_server_flags *flags)
{
struct dns_server_info *server_info = NULL;
struct dns_server_info *tmp = NULL;
@@ -510,6 +512,10 @@ static struct dns_server_info *_dns_client_get_server(char *server_ip, int port,
continue;
}
if (memcmp(&server_info->flags, flags, sizeof(*flags)) != 0) {
continue;
}
pthread_mutex_unlock(&client.server_list_lock);
server_info_return = server_info;
break;
@@ -596,7 +602,7 @@ errout:
}
static int _dns_client_add_to_pending_group(const char *group_name, char *server_ip, int port,
dns_server_type_t server_type)
dns_server_type_t server_type, struct client_dns_server_flags *flags)
{
struct dns_server_pending *item = NULL;
struct dns_server_pending *tmp = NULL;
@@ -610,6 +616,10 @@ static int _dns_client_add_to_pending_group(const char *group_name, char *server
pthread_mutex_lock(&pending_server_mutex);
list_for_each_entry_safe(item, tmp, &pending_servers, list)
{
if (memcmp(&item->flags, flags, sizeof(*flags)) != 0) {
continue;
}
if (strncmp(item->host, server_ip, DNS_HOSTNAME_LEN) == 0 && item->port == port && item->type == server_type) {
pending = item;
break;
@@ -644,7 +654,8 @@ errout:
/* add server to group */
static int _dns_client_add_to_group_pending(const char *group_name, char *server_ip, int port,
dns_server_type_t server_type, int is_pending)
dns_server_type_t server_type, struct client_dns_server_flags *flags,
int is_pending)
{
struct dns_server_info *server_info = NULL;
@@ -652,21 +663,22 @@ static int _dns_client_add_to_group_pending(const char *group_name, char *server
return -1;
}
server_info = _dns_client_get_server(server_ip, port, server_type);
server_info = _dns_client_get_server(server_ip, port, server_type, flags);
if (server_info == NULL) {
if (is_pending == 0) {
tlog(TLOG_ERROR, "add server %s:%d to group %s failed", server_ip, port, group_name);
return -1;
}
return _dns_client_add_to_pending_group(group_name, server_ip, port, server_type);
return _dns_client_add_to_pending_group(group_name, server_ip, port, server_type, flags);
}
return _dns_client_add_to_group(group_name, server_info);
}
int dns_client_add_to_group(const char *group_name, char *server_ip, int port, dns_server_type_t server_type)
int dns_client_add_to_group(const char *group_name, char *server_ip, int port, dns_server_type_t server_type,
struct client_dns_server_flags *flags)
{
return _dns_client_add_to_group_pending(group_name, server_ip, port, server_type, 1);
return _dns_client_add_to_group_pending(group_name, server_ip, port, server_type, flags, 1);
}
/* free group member */
@@ -709,12 +721,13 @@ static int _dns_client_remove_server_from_groups(struct dns_server_info *server_
return 0;
}
int dns_client_remove_from_group(const char *group_name, char *server_ip, int port, dns_server_type_t server_type)
int dns_client_remove_from_group(const char *group_name, char *server_ip, int port, dns_server_type_t server_type,
struct client_dns_server_flags *flags)
{
struct dns_server_info *server_info = NULL;
struct dns_server_group *group = NULL;
server_info = _dns_client_get_server(server_ip, port, server_type);
server_info = _dns_client_get_server(server_ip, port, server_type, flags);
if (server_info == NULL) {
return -1;
}
@@ -3680,7 +3693,8 @@ static int _dns_client_add_pendings(struct dns_server_pending *pending, char *ip
list_for_each_entry_safe(group, tmp, &pending->group_list, list)
{
if (_dns_client_add_to_group_pending(group->group_name, ip, pending->port, pending->type, 0) != 0) {
if (_dns_client_add_to_group_pending(group->group_name, ip, pending->port, pending->type, &pending->flags, 0) !=
0) {
tlog(TLOG_WARN, "add server to group failed, skip add.");
}

View File

@@ -133,9 +133,11 @@ int dns_client_remove_server(char *server_ip, int port, dns_server_type_t server
int dns_client_add_group(const char *group_name);
int dns_client_add_to_group(const char *group_name, char *server_ip, int port, dns_server_type_t server_type);
int dns_client_add_to_group(const char *group_name, char *server_ip, int port, dns_server_type_t server_type,
struct client_dns_server_flags *flags);
int dns_client_remove_from_group(const char *group_name, char *server_ip, int port, dns_server_type_t server_type);
int dns_client_remove_from_group(const char *group_name, char *server_ip, int port, dns_server_type_t server_type,
struct client_dns_server_flags *flags);
int dns_client_remove_group(const char *group_name);

View File

@@ -96,6 +96,7 @@ struct dns_servers dns_conf_servers[DNS_MAX_SERVERS];
char dns_conf_server_name[DNS_MAX_SERVER_NAME_LEN];
int dns_conf_server_num;
int dns_conf_resolv_hostname = 1;
char dns_conf_exist_bootstrap_dns;
struct dns_domain_check_orders dns_conf_check_orders = {
.orders =
@@ -164,6 +165,8 @@ struct dns_edns_client_subnet dns_conf_ipv6_ecs;
char dns_conf_sni_proxy_ip[DNS_MAX_IPLEN];
static int _conf_domain_rule_nameserver(char *domain, const char *group_name);
static void *_new_dns_rule(enum domain_rule domain_rule)
{
struct dns_rule *rule;
@@ -467,6 +470,7 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de
unsigned int server_flag = 0;
unsigned char *spki = NULL;
int drop_packet_latency_ms = 0;
int is_bootstrap_dns = 0;
int ttl = 0;
/* clang-format off */
@@ -487,6 +491,7 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de
{"proxy", required_argument, NULL, 'P'}, /* proxy server */
{"exclude-default-group", no_argument, NULL, 'E'}, /* exclude this from default group */
{"set-mark", required_argument, NULL, 254}, /* set mark */
{"bootstrap-dns", no_argument, NULL, 255}, /* set as bootstrap dns */
{NULL, no_argument, NULL, 0}
};
/* clang-format on */
@@ -618,6 +623,10 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de
server->set_mark = atoll(optarg);
break;
}
case 255: {
is_bootstrap_dns = 1;
break;
}
default:
break;
}
@@ -633,6 +642,12 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de
dns_conf_server_num++;
tlog(TLOG_DEBUG, "add server %s, flag: %X, ttl: %d", ip, result_flag, ttl);
if (is_bootstrap_dns) {
server->server_flag |= SERVER_FLAG_EXCLUDE_DEFAULT;
_dns_conf_get_group_set("bootstrap-dns", server);
dns_conf_exist_bootstrap_dns = 1;
}
return 0;
errout:
@@ -643,6 +658,26 @@ errout:
return -1;
}
static int _config_update_bootstrap_dns_rule(void)
{
struct dns_servers *server = NULL;
if (dns_conf_exist_bootstrap_dns == 0) {
return 0;
}
for (int i = 0; i < dns_conf_server_num; i++) {
server = &dns_conf_servers[i];
if (check_is_ipaddr(server->server) == 0) {
continue;
}
_conf_domain_rule_nameserver(server->server, "bootstrap-dns");
}
return 0;
}
static int _config_domain_rule_free(struct dns_domain_rule *domain_rule)
{
int i = 0;
@@ -3297,6 +3332,7 @@ errout:
return -1;
}
static int _dns_conf_load_post(void)
{
_config_setup_smartdns_domain();
@@ -3322,6 +3358,8 @@ static int _dns_conf_load_post(void)
_config_domain_set_name_table_destroy();
_config_update_bootstrap_dns_rule();
return 0;
}

View File

@@ -224,6 +224,47 @@ static int _smartdns_load_from_resolv(void)
return ret;
}
static int _smartdns_prepare_server_flags(struct client_dns_server_flags *flags, struct dns_servers *server)
{
memset(flags, 0, sizeof(*flags));
switch (server->type) {
case DNS_SERVER_UDP: {
struct client_dns_server_flag_udp *flag_udp = &flags->udp;
flag_udp->ttl = server->ttl;
} break;
case DNS_SERVER_HTTPS: {
struct client_dns_server_flag_https *flag_http = &flags->https;
flag_http->spi_len = dns_client_spki_decode(server->spki, (unsigned char *)flag_http->spki);
safe_strncpy(flag_http->hostname, server->hostname, sizeof(flag_http->hostname));
safe_strncpy(flag_http->path, server->path, sizeof(flag_http->path));
safe_strncpy(flag_http->httphost, server->httphost, sizeof(flag_http->httphost));
safe_strncpy(flag_http->tls_host_verify, server->tls_host_verify, sizeof(flag_http->tls_host_verify));
flag_http->skip_check_cert = server->skip_check_cert;
} break;
case DNS_SERVER_TLS: {
struct client_dns_server_flag_tls *flag_tls = &flags->tls;
flag_tls->spi_len = dns_client_spki_decode(server->spki, (unsigned char *)flag_tls->spki);
safe_strncpy(flag_tls->hostname, server->hostname, sizeof(flag_tls->hostname));
safe_strncpy(flag_tls->tls_host_verify, server->tls_host_verify, sizeof(flag_tls->tls_host_verify));
flag_tls->skip_check_cert = server->skip_check_cert;
} break;
case DNS_SERVER_TCP:
break;
default:
return -1;
break;
}
flags->type = server->type;
flags->server_flag = server->server_flag;
flags->result_flag = server->result_flag;
flags->set_mark = server->set_mark;
flags->drop_packet_latency_ms = server->drop_packet_latency_ms;
safe_strncpy(flags->proxyname, server->proxyname, sizeof(flags->proxyname));
return 0;
}
static int _smartdns_add_servers(void)
{
unsigned long i = 0;
@@ -234,44 +275,12 @@ static int _smartdns_add_servers(void)
struct client_dns_server_flags flags;
for (i = 0; i < (unsigned int)dns_conf_server_num; i++) {
memset(&flags, 0, sizeof(flags));
switch (dns_conf_servers[i].type) {
case DNS_SERVER_UDP: {
struct client_dns_server_flag_udp *flag_udp = &flags.udp;
flag_udp->ttl = dns_conf_servers[i].ttl;
} break;
case DNS_SERVER_HTTPS: {
struct client_dns_server_flag_https *flag_http = &flags.https;
flag_http->spi_len = dns_client_spki_decode(dns_conf_servers[i].spki, (unsigned char *)flag_http->spki);
safe_strncpy(flag_http->hostname, dns_conf_servers[i].hostname, sizeof(flag_http->hostname));
safe_strncpy(flag_http->path, dns_conf_servers[i].path, sizeof(flag_http->path));
safe_strncpy(flag_http->httphost, dns_conf_servers[i].httphost, sizeof(flag_http->httphost));
safe_strncpy(flag_http->tls_host_verify, dns_conf_servers[i].tls_host_verify,
sizeof(flag_http->tls_host_verify));
flag_http->skip_check_cert = dns_conf_servers[i].skip_check_cert;
} break;
case DNS_SERVER_TLS: {
struct client_dns_server_flag_tls *flag_tls = &flags.tls;
flag_tls->spi_len = dns_client_spki_decode(dns_conf_servers[i].spki, (unsigned char *)flag_tls->spki);
safe_strncpy(flag_tls->hostname, dns_conf_servers[i].hostname, sizeof(flag_tls->hostname));
safe_strncpy(flag_tls->tls_host_verify, dns_conf_servers[i].tls_host_verify,
sizeof(flag_tls->tls_host_verify));
flag_tls->skip_check_cert = dns_conf_servers[i].skip_check_cert;
} break;
case DNS_SERVER_TCP:
break;
default:
if (_smartdns_prepare_server_flags(&flags, &dns_conf_servers[i]) != 0) {
tlog(TLOG_ERROR, "prepare server flags failed, %s:%d", dns_conf_servers[i].server,
dns_conf_servers[i].port);
return -1;
break;
}
flags.type = dns_conf_servers[i].type;
flags.server_flag = dns_conf_servers[i].server_flag;
flags.result_flag = dns_conf_servers[i].result_flag;
flags.set_mark = dns_conf_servers[i].set_mark;
flags.drop_packet_latency_ms = dns_conf_servers[i].drop_packet_latency_ms;
safe_strncpy(flags.proxyname, dns_conf_servers[i].proxyname, sizeof(flags.proxyname));
ret = dns_client_add_server(dns_conf_servers[i].server, dns_conf_servers[i].port, dns_conf_servers[i].type,
&flags);
if (ret != 0) {
@@ -293,7 +302,14 @@ static int _smartdns_add_servers(void)
if (server == NULL) {
continue;
}
ret = dns_client_add_to_group(group->group_name, server->server, server->port, server->type);
if (_smartdns_prepare_server_flags(&flags, server) != 0) {
tlog(TLOG_ERROR, "prepare server flags failed, %s:%d", server->server,
server->port);
return -1;
}
ret = dns_client_add_to_group(group->group_name, server->server, server->port, server->type, &flags);
if (ret != 0) {
tlog(TLOG_ERROR, "add server %s to group %s failed", server->server, group->group_name);
return -1;