dns_conf: add bootstrap-dns option for server.
This commit is contained in:
@@ -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.");
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user