dns_conf.h 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. /*************************************************************************
  2. *
  3. * Copyright (C) 2018-2020 Ruilin Peng (Nick) <[email protected]>.
  4. *
  5. * smartdns is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * smartdns is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. #ifndef _DNS_CONF
  19. #define _DNS_CONF
  20. #include "art.h"
  21. #include "conf.h"
  22. #include "dns.h"
  23. #include "dns_client.h"
  24. #include "hash.h"
  25. #include "hashtable.h"
  26. #include "list.h"
  27. #include "radix.h"
  28. #ifdef __cpluscplus
  29. extern "C" {
  30. #endif
  31. #define DNS_MAX_BIND_IP 16
  32. #define DNS_MAX_SERVERS 64
  33. #define DNS_MAX_SERVER_NAME_LEN 128
  34. #define DNS_MAX_PTR_LEN 128
  35. #define DNS_MAX_IPSET_NAMELEN 32
  36. #define DNS_GROUP_NAME_LEN 32
  37. #define DNS_NAX_GROUP_NUMBER 16
  38. #define DNS_MAX_IPLEN 64
  39. #define DNS_MAX_SPKI_LEN 64
  40. #define DNS_MAX_URL_LEN 256
  41. #define DNS_MAX_PATH 1024
  42. #define DEFAULT_DNS_PORT 53
  43. #define DEFAULT_DNS_TLS_PORT 853
  44. #define DEFAULT_DNS_HTTPS_PORT 443
  45. #define DNS_MAX_CONF_CNAME_LEN 256
  46. #define SMARTDNS_CONF_FILE "/etc/smartdns/smartdns.conf"
  47. #define SMARTDNS_LOG_FILE "/var/log/smartdns.log"
  48. #define SMARTDNS_AUDIT_FILE "/var/log/smartdns-audit.log"
  49. #define SMARTDNS_CACHE_FILE "/tmp/smartdns.cache"
  50. enum domain_rule {
  51. DOMAIN_RULE_FLAGS = 0,
  52. DOMAIN_RULE_ADDRESS_IPV4,
  53. DOMAIN_RULE_ADDRESS_IPV6,
  54. DOMAIN_RULE_IPSET,
  55. DOMAIN_RULE_IPSET_IPV4,
  56. DOMAIN_RULE_IPSET_IPV6,
  57. DOMAIN_RULE_NAMESERVER,
  58. DOMAIN_RULE_CHECKSPEED,
  59. DOMAIN_RULE_MAX,
  60. };
  61. typedef enum {
  62. DNS_BIND_TYPE_UDP,
  63. DNS_BIND_TYPE_TCP,
  64. DNS_BIND_TYPE_TLS,
  65. } DNS_BIND_TYPE;
  66. #define DOMAIN_CHECK_NONE 0
  67. #define DOMAIN_CHECK_ICMP 1
  68. #define DOMAIN_CHECK_TCP 2
  69. #define DOMAIN_CHECK_NUM 2
  70. #define DOMAIN_FLAG_ADDR_SOA (1 << 0)
  71. #define DOMAIN_FLAG_ADDR_IPV4_SOA (1 << 1)
  72. #define DOMAIN_FLAG_ADDR_IPV6_SOA (1 << 2)
  73. #define DOMAIN_FLAG_ADDR_IGN (1 << 3)
  74. #define DOMAIN_FLAG_ADDR_IPV4_IGN (1 << 4)
  75. #define DOMAIN_FLAG_ADDR_IPV6_IGN (1 << 5)
  76. #define DOMAIN_FLAG_IPSET_IGN (1 << 6)
  77. #define DOMAIN_FLAG_IPSET_IPV4_IGN (1 << 7)
  78. #define DOMAIN_FLAG_IPSET_IPV6_IGN (1 << 8)
  79. #define DOMAIN_FLAG_NAMESERVER_IGNORE (1 << 9)
  80. #define DOMAIN_FLAG_DUALSTACK_SELECT (1 << 10)
  81. #define SERVER_FLAG_EXCLUDE_DEFAULT (1 << 0)
  82. #define BIND_FLAG_NO_RULE_ADDR (1 << 0)
  83. #define BIND_FLAG_NO_RULE_NAMESERVER (1 << 1)
  84. #define BIND_FLAG_NO_RULE_IPSET (1 << 2)
  85. #define BIND_FLAG_NO_RULE_SNIPROXY (1 << 3)
  86. #define BIND_FLAG_NO_RULE_SOA (1 << 4)
  87. #define BIND_FLAG_NO_SPEED_CHECK (1 << 5)
  88. #define BIND_FLAG_NO_CACHE (1 << 6)
  89. #define BIND_FLAG_NO_DUALSTACK_SELECTION (1 << 7)
  90. #define BIND_FLAG_FORCE_AAAA_SOA (1 << 8)
  91. struct dns_rule_flags {
  92. unsigned int flags;
  93. unsigned int is_flag_set;
  94. };
  95. struct dns_address_IPV4 {
  96. unsigned char ipv4_addr[DNS_RR_A_LEN];
  97. };
  98. struct dns_address_IPV6 {
  99. unsigned char ipv6_addr[DNS_RR_AAAA_LEN];
  100. };
  101. struct dns_ipset_name {
  102. struct hlist_node node;
  103. char ipsetname[DNS_MAX_IPSET_NAMELEN];
  104. };
  105. struct dns_ipset_rule {
  106. const char *ipsetname;
  107. };
  108. struct dns_domain_rule {
  109. void *rules[DOMAIN_RULE_MAX];
  110. };
  111. struct dns_nameserver_rule {
  112. const char *group_name;
  113. };
  114. struct dns_server_groups {
  115. struct hlist_node node;
  116. char group_name[DNS_GROUP_NAME_LEN];
  117. int server_num;
  118. struct dns_servers *servers[DNS_MAX_SERVERS];
  119. };
  120. struct dns_domain_check_order {
  121. char order[DOMAIN_CHECK_NUM];
  122. unsigned short tcp_port;
  123. };
  124. struct dns_group_table {
  125. DECLARE_HASHTABLE(group, 8);
  126. };
  127. extern struct dns_group_table dns_group_table;
  128. struct dns_ptr {
  129. struct hlist_node node;
  130. char ptr_domain[DNS_MAX_PTR_LEN];
  131. char hostname[DNS_MAX_CNAME_LEN];
  132. };
  133. struct dns_ptr_table {
  134. DECLARE_HASHTABLE(ptr, 16);
  135. };
  136. extern struct dns_ptr_table dns_ptr_table;
  137. typedef enum dns_hosts_type {
  138. DNS_HOST_TYPE_HOST = 0,
  139. DNS_HOST_TYPE_DNSMASQ = 1,
  140. } dns_hosts_type;
  141. struct dns_hosts {
  142. struct hlist_node node;
  143. char domain[DNS_MAX_CNAME_LEN];
  144. dns_hosts_type host_type;
  145. int dns_type;
  146. int is_soa;
  147. union {
  148. unsigned char ipv4_addr[DNS_RR_A_LEN];
  149. unsigned char ipv6_addr[DNS_RR_AAAA_LEN];
  150. };
  151. };
  152. struct dns_hosts_table {
  153. DECLARE_HASHTABLE(hosts, 16);
  154. };
  155. extern struct dns_hosts_table dns_hosts_table;
  156. extern int dns_hosts_record_num;
  157. struct dns_servers {
  158. char server[DNS_MAX_IPLEN];
  159. unsigned short port;
  160. unsigned int result_flag;
  161. unsigned int server_flag;
  162. int ttl;
  163. dns_server_type_t type;
  164. char skip_check_cert;
  165. char spki[DNS_MAX_SPKI_LEN];
  166. char hostname[DNS_MAX_CNAME_LEN];
  167. char httphost[DNS_MAX_CNAME_LEN];
  168. char tls_host_verify[DNS_MAX_CNAME_LEN];
  169. char path[DNS_MAX_URL_LEN];
  170. };
  171. /* ip address lists of domain */
  172. struct dns_bogus_ip_address {
  173. struct hlist_node node;
  174. dns_type_t addr_type;
  175. union {
  176. unsigned char ipv4_addr[DNS_RR_A_LEN];
  177. unsigned char ipv6_addr[DNS_RR_AAAA_LEN];
  178. unsigned char addr[0];
  179. };
  180. };
  181. enum address_rule {
  182. ADDRESS_RULE_BLACKLIST = 1,
  183. ADDRESS_RULE_WHITELIST = 2,
  184. ADDRESS_RULE_BOGUS = 3,
  185. ADDRESS_RULE_IP_IGNORE = 4,
  186. };
  187. struct dns_ip_address_rule {
  188. unsigned int blacklist : 1;
  189. unsigned int whitelist : 1;
  190. unsigned int bogus : 1;
  191. unsigned int ip_ignore : 1;
  192. };
  193. struct dns_edns_client_subnet {
  194. int enable;
  195. char ip[DNS_MAX_IPLEN];
  196. int subnet;
  197. };
  198. struct dns_conf_address_rule {
  199. radix_tree_t *ipv4;
  200. radix_tree_t *ipv6;
  201. };
  202. struct dns_bind_ip {
  203. DNS_BIND_TYPE type;
  204. uint32_t flags;
  205. char ip[DNS_MAX_IPLEN];
  206. const char *group;
  207. };
  208. struct dns_qtype_soa_list {
  209. struct hlist_node node;
  210. uint32_t qtypeid;
  211. };
  212. struct dns_qtype_soa_table {
  213. DECLARE_HASHTABLE(qtype, 8);
  214. };
  215. extern struct dns_qtype_soa_table dns_qtype_soa_table;
  216. extern struct dns_bind_ip dns_conf_bind_ip[DNS_MAX_BIND_IP];
  217. extern int dns_conf_bind_ip_num;
  218. extern int dns_conf_tcp_idle_time;
  219. extern int dns_conf_cachesize;
  220. extern int dns_conf_prefetch;
  221. extern int dns_conf_serve_expired;
  222. extern int dns_conf_serve_expired_ttl;
  223. extern int dns_conf_serve_expired_reply_ttl;
  224. extern struct dns_servers dns_conf_servers[DNS_MAX_SERVERS];
  225. extern int dns_conf_server_num;
  226. extern int dns_conf_log_level;
  227. extern char dns_conf_log_file[DNS_MAX_PATH];
  228. extern size_t dns_conf_log_size;
  229. extern int dns_conf_log_num;
  230. extern char dns_conf_ca_file[DNS_MAX_PATH];
  231. extern char dns_conf_ca_path[DNS_MAX_PATH];
  232. extern char dns_conf_cache_file[DNS_MAX_PATH];
  233. extern int dns_conf_cache_persist;
  234. extern struct dns_domain_check_order dns_conf_check_order;
  235. extern struct dns_server_groups dns_conf_server_groups[DNS_NAX_GROUP_NUMBER];
  236. extern int dns_conf_server_group_num;
  237. extern int dns_conf_audit_enable;
  238. extern int dns_conf_audit_log_SOA;
  239. extern char dns_conf_audit_file[DNS_MAX_PATH];
  240. extern size_t dns_conf_audit_size;
  241. extern int dns_conf_audit_num;
  242. extern char dns_conf_server_name[DNS_MAX_SERVER_NAME_LEN];
  243. extern art_tree dns_conf_domain_rule;
  244. extern struct dns_conf_address_rule dns_conf_address_rule;
  245. extern int dns_conf_dualstack_ip_selection;
  246. extern int dns_conf_dualstack_ip_selection_threshold;
  247. extern int dns_conf_rr_ttl;
  248. extern int dns_conf_rr_ttl_reply_max;
  249. extern int dns_conf_rr_ttl_min;
  250. extern int dns_conf_rr_ttl_max;
  251. extern int dns_conf_force_AAAA_SOA;
  252. extern int dns_conf_ipset_timeout_enable;
  253. extern struct dns_edns_client_subnet dns_conf_ipv4_ecs;
  254. extern struct dns_edns_client_subnet dns_conf_ipv6_ecs;
  255. extern char dns_conf_sni_proxy_ip[DNS_MAX_IPLEN];
  256. void dns_server_load_exit(void);
  257. int dns_server_load_conf(const char *file);
  258. int dns_server_check_update_hosts(void);
  259. extern int config_addtional_file(void *data, int argc, char *argv[]);
  260. #ifdef __cpluscplus
  261. }
  262. #endif
  263. #endif // !_DNS_CONF