Support listen multi ip addresses, and support server flags
This commit is contained in:
@@ -8,14 +8,25 @@
|
|||||||
# conf-file [file]
|
# conf-file [file]
|
||||||
# conf-file blacklist-ip.conf
|
# conf-file blacklist-ip.conf
|
||||||
|
|
||||||
# dns server bind ip and port, default dns server port is 53.
|
# dns server bind ip and port, default dns server port is 53, support binding multi ip and port
|
||||||
# bind [IP]:port, udp server
|
# bind udp server
|
||||||
# bind-tcp [IP]:port, tcp 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:
|
# example:
|
||||||
# IPV4: :53
|
# IPV4:
|
||||||
# IPV6 [::]:53
|
# bind :53
|
||||||
# bind-tcp [::]:53
|
# bind :6053 -group office -no-speed-check
|
||||||
|
# IPV6:
|
||||||
|
# bind [::]:53
|
||||||
|
# bind-tcp [::]:53
|
||||||
bind [::]:53
|
bind [::]:53
|
||||||
|
|
||||||
# tcp connection idle timeout
|
# tcp connection idle timeout
|
||||||
|
|||||||
111
src/dns_conf.c
111
src/dns_conf.c
@@ -23,8 +23,8 @@ static struct dns_ipset_table dns_ipset_table;
|
|||||||
struct dns_group_table dns_group_table;
|
struct dns_group_table dns_group_table;
|
||||||
|
|
||||||
/* server ip/port */
|
/* server ip/port */
|
||||||
char dns_conf_server_ip[DNS_MAX_IPLEN];
|
struct dns_bind_ip dns_conf_bind_ip[DNS_MAX_BIND_IP];
|
||||||
char dns_conf_server_tcp_ip[DNS_MAX_IPLEN];
|
int dns_conf_bind_ip_num = 0;
|
||||||
int dns_conf_tcp_idle_time = 120;
|
int dns_conf_tcp_idle_time = 120;
|
||||||
|
|
||||||
/* cache */
|
/* cache */
|
||||||
@@ -788,6 +788,109 @@ static int _config_speed_check_mode(void *data, int argc, char *argv[])
|
|||||||
return 0;
|
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[])
|
static int _config_server_udp(void *data, int argc, char *argv[])
|
||||||
{
|
{
|
||||||
return _config_server(argc, argv, DNS_SERVER_UDP, DEFAULT_DNS_PORT);
|
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[] = {
|
static struct config_item _config_item[] = {
|
||||||
CONF_STRING("server-name", (char *)dns_conf_server_name, DNS_MAX_SERVER_NAME_LEN),
|
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_CUSTOM("bind", _config_bind_ip_udp, NULL),
|
||||||
CONF_STRING("bind-tcp", dns_conf_server_tcp_ip, DNS_MAX_IPLEN),
|
CONF_CUSTOM("bind-tcp", _config_bind_ip_tcp, NULL),
|
||||||
CONF_CUSTOM("server", _config_server_udp, NULL),
|
CONF_CUSTOM("server", _config_server_udp, NULL),
|
||||||
CONF_CUSTOM("server-tcp", _config_server_tcp, NULL),
|
CONF_CUSTOM("server-tcp", _config_server_tcp, NULL),
|
||||||
CONF_CUSTOM("server-tls", _config_server_tls, NULL),
|
CONF_CUSTOM("server-tls", _config_server_tls, NULL),
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include "list.h"
|
#include "list.h"
|
||||||
#include "radix.h"
|
#include "radix.h"
|
||||||
|
|
||||||
|
#define DNS_MAX_BIND_IP 16
|
||||||
#define DNS_MAX_SERVERS 64
|
#define DNS_MAX_SERVERS 64
|
||||||
#define DNS_MAX_SERVER_NAME_LEN 128
|
#define DNS_MAX_SERVER_NAME_LEN 128
|
||||||
#define DNS_MAX_IPSET_NAMELEN 32
|
#define DNS_MAX_IPSET_NAMELEN 32
|
||||||
@@ -36,6 +37,12 @@ enum domain_rule {
|
|||||||
DOMAIN_RULE_MAX,
|
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_NONE 0
|
||||||
#define DOMAIN_CHECK_ICMP 1
|
#define DOMAIN_CHECK_ICMP 1
|
||||||
#define DOMAIN_CHECK_TCP 2
|
#define DOMAIN_CHECK_TCP 2
|
||||||
@@ -52,6 +59,13 @@ enum domain_rule {
|
|||||||
|
|
||||||
#define SERVER_FLAG_EXCLUDE_DEFAULT (1 << 0)
|
#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 {
|
struct dns_rule_flags {
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
};
|
};
|
||||||
@@ -147,8 +161,16 @@ struct dns_conf_address_rule {
|
|||||||
radix_tree_t *ipv6;
|
radix_tree_t *ipv6;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern char dns_conf_server_ip[DNS_MAX_IPLEN];
|
struct dns_bind_ip
|
||||||
extern char dns_conf_server_tcp_ip[DNS_MAX_IPLEN];
|
{
|
||||||
|
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_tcp_idle_time;
|
||||||
extern int dns_conf_cachesize;
|
extern int dns_conf_cachesize;
|
||||||
|
|||||||
572
src/dns_server.c
572
src/dns_server.c
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user