Support listen multi ip addresses, and support server flags

This commit is contained in:
Nick Peng
2019-08-03 00:23:01 +08:00
parent 81468a3c4f
commit b1eafb6491
4 changed files with 485 additions and 249 deletions

View File

@@ -8,14 +8,25 @@
# conf-file [file]
# conf-file blacklist-ip.conf
# dns server bind ip and port, default dns server port is 53.
# bind [IP]:port, udp server
# bind-tcp [IP]:port, tcp server
# dns server bind ip and port, default dns server port is 53, support binding multi ip and port
# bind udp server
# bind [IP]:[port] [-group [group]] [-no-rule-addr] [-no-rule-nameserver] [-no-rule-ipset] [-no-speed-check] [-no-cache]
# bind tcp server
# bind-tcp [IP]:[port] [-group [group]] [-no-rule-addr] [-no-rule-nameserver] [-no-rule-ipset] [-no-speed-check] [-no-cache]
# option:
# -group: set domain request to use the appropriate server group.
# -no-rule-addr: skip address rule.
# -no-rule-nameserver: skip nameserver rule.
# -no-rule-ipset: skip ipset rule.
# -no-speed-check: do not check speed.
# -no-cache: skip cache.
# example:
# IPV4: :53
# IPV6 [::]:53
# bind-tcp [::]:53
# IPV4:
# bind :53
# bind :6053 -group office -no-speed-check
# IPV6:
# bind [::]:53
# bind-tcp [::]:53
bind [::]:53
# tcp connection idle timeout

View File

@@ -23,8 +23,8 @@ static struct dns_ipset_table dns_ipset_table;
struct dns_group_table dns_group_table;
/* server ip/port */
char dns_conf_server_ip[DNS_MAX_IPLEN];
char dns_conf_server_tcp_ip[DNS_MAX_IPLEN];
struct dns_bind_ip dns_conf_bind_ip[DNS_MAX_BIND_IP];
int dns_conf_bind_ip_num = 0;
int dns_conf_tcp_idle_time = 120;
/* cache */
@@ -788,6 +788,109 @@ static int _config_speed_check_mode(void *data, int argc, char *argv[])
return 0;
}
static int _config_bind_ip(int argc, char *argv[], DNS_BIND_TYPE type)
{
int index = dns_conf_bind_ip_num;
struct dns_bind_ip *bind_ip;
char *ip = NULL;
int opt = 0;
char group_name[DNS_GROUP_NAME_LEN];
const char *group = NULL;
unsigned int server_flag = 0;
/* clang-format off */
static struct option long_options[] = {
{"group", required_argument, NULL, 'g'}, /* add to group */
{"no-rule-addr", no_argument, NULL, 'A'},
{"no-rule-nameserver", no_argument, NULL, 'N'},
{"no-rule-ipset", no_argument, NULL, 'I'},
{"no-rule-sni-proxy", no_argument, NULL, 'P'},
{"no-speed-check", no_argument, NULL, 'S'},
{"no-cache", no_argument, NULL, 'C'},
{NULL, no_argument, NULL, 0}
};
/* clang-format on */
if (argc <= 1) {
tlog(TLOG_ERROR, "invalid parameter.");
goto errout;
}
if (index >= DNS_MAX_SERVERS) {
tlog(TLOG_WARN, "exceeds max server number, %s", ip);
return 0;
}
bind_ip = &dns_conf_bind_ip[index];
bind_ip->type = type;
bind_ip->flags = 0;
ip = argv[1];
safe_strncpy(bind_ip->ip, ip, DNS_MAX_IPLEN);
/* process extra options */
optind = 1;
while (1) {
opt = getopt_long_only(argc, argv, "", long_options, NULL);
if (opt == -1) {
break;
}
switch (opt) {
case 'g': {
safe_strncpy(group_name, optarg, DNS_GROUP_NAME_LEN);
group = _dns_conf_get_group_name(group_name);
break;
}
case 'A': {
server_flag |= BIND_FLAG_NO_RULE_ADDR;
break;
}
case 'N': {
server_flag |= BIND_FLAG_NO_RULE_NAMESERVER;
break;
}
case 'I': {
server_flag |= BIND_FLAG_NO_RULE_IPSET;
break;
}
case 'P': {
server_flag |= BIND_FLAG_NO_RULE_SNIPROXY;
break;
}
case 'S': {
server_flag |= BIND_FLAG_NO_SPEED_CHECK;
break;
}
case 'C': {
server_flag |= BIND_FLAG_NO_CACHE;
break;
}
default:
break;
}
}
/* add new server */
bind_ip->flags = server_flag;
bind_ip->group = group;
dns_conf_bind_ip_num++;
tlog(TLOG_DEBUG, "bind ip %s, type:%d, flag: %X", ip, type, server_flag);
return 0;
errout:
return -1;
}
static int _config_bind_ip_udp(void *data, int argc, char *argv[])
{
return _config_bind_ip(argc, argv, DNS_BIND_TYPE_UDP);
}
static int _config_bind_ip_tcp(void *data, int argc, char *argv[])
{
return _config_bind_ip(argc, argv, DNS_BIND_TYPE_TCP);
}
static int _config_server_udp(void *data, int argc, char *argv[])
{
return _config_server(argc, argv, DNS_SERVER_UDP, DEFAULT_DNS_PORT);
@@ -1075,8 +1178,8 @@ static int _config_log_level(void *data, int argc, char *argv[])
static struct config_item _config_item[] = {
CONF_STRING("server-name", (char *)dns_conf_server_name, DNS_MAX_SERVER_NAME_LEN),
CONF_STRING("bind", dns_conf_server_ip, DNS_MAX_IPLEN),
CONF_STRING("bind-tcp", dns_conf_server_tcp_ip, DNS_MAX_IPLEN),
CONF_CUSTOM("bind", _config_bind_ip_udp, NULL),
CONF_CUSTOM("bind-tcp", _config_bind_ip_tcp, NULL),
CONF_CUSTOM("server", _config_server_udp, NULL),
CONF_CUSTOM("server-tcp", _config_server_tcp, NULL),
CONF_CUSTOM("server-tls", _config_server_tls, NULL),

View File

@@ -10,6 +10,7 @@
#include "list.h"
#include "radix.h"
#define DNS_MAX_BIND_IP 16
#define DNS_MAX_SERVERS 64
#define DNS_MAX_SERVER_NAME_LEN 128
#define DNS_MAX_IPSET_NAMELEN 32
@@ -36,6 +37,12 @@ enum domain_rule {
DOMAIN_RULE_MAX,
};
typedef enum {
DNS_BIND_TYPE_UDP,
DNS_BIND_TYPE_TCP,
DNS_BIND_TYPE_TLS,
} DNS_BIND_TYPE;
#define DOMAIN_CHECK_NONE 0
#define DOMAIN_CHECK_ICMP 1
#define DOMAIN_CHECK_TCP 2
@@ -52,6 +59,13 @@ enum domain_rule {
#define SERVER_FLAG_EXCLUDE_DEFAULT (1 << 0)
#define BIND_FLAG_NO_RULE_ADDR (1 << 0)
#define BIND_FLAG_NO_RULE_NAMESERVER (1 << 1)
#define BIND_FLAG_NO_RULE_IPSET (1 << 2)
#define BIND_FLAG_NO_RULE_SNIPROXY (1 << 3)
#define BIND_FLAG_NO_SPEED_CHECK (1 << 4)
#define BIND_FLAG_NO_CACHE (1 << 5)
struct dns_rule_flags {
unsigned int flags;
};
@@ -147,8 +161,16 @@ struct dns_conf_address_rule {
radix_tree_t *ipv6;
};
extern char dns_conf_server_ip[DNS_MAX_IPLEN];
extern char dns_conf_server_tcp_ip[DNS_MAX_IPLEN];
struct dns_bind_ip
{
DNS_BIND_TYPE type;
uint32_t flags;
char ip[DNS_MAX_IPLEN];
const char *group;
};
extern struct dns_bind_ip dns_conf_bind_ip[DNS_MAX_BIND_IP];
extern int dns_conf_bind_ip_num;
extern int dns_conf_tcp_idle_time;
extern int dns_conf_cachesize;

File diff suppressed because it is too large Load Diff