context.c 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064
  1. /*************************************************************************
  2. *
  3. * Copyright (C) 2018-2025 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. #include "context.h"
  19. #include "address.h"
  20. #include "audit.h"
  21. #include "cache.h"
  22. #include "dns_server.h"
  23. #include "ip_rule.h"
  24. #include "ipset_nftset.h"
  25. #include "request.h"
  26. #include "request_pending.h"
  27. #include "rules.h"
  28. #include "soa.h"
  29. void _dns_server_post_context_init(struct dns_server_post_context *context, struct dns_request *request)
  30. {
  31. memset(context, 0, sizeof(*context));
  32. context->packet = (struct dns_packet *)(context->packet_buff);
  33. context->packet_maxlen = sizeof(context->packet_buff);
  34. context->inpacket = (unsigned char *)(context->inpacket_buff);
  35. context->inpacket_maxlen = sizeof(context->inpacket_buff);
  36. context->qtype = request->qtype;
  37. context->request = request;
  38. }
  39. static void _dns_server_context_add_ip(struct dns_server_post_context *context, const unsigned char *ip_addr)
  40. {
  41. if (context->ip_num < MAX_IP_NUM) {
  42. context->ip_addr[context->ip_num] = ip_addr;
  43. }
  44. context->ip_num++;
  45. }
  46. void _dns_server_post_context_init_from(struct dns_server_post_context *context, struct dns_request *request,
  47. struct dns_packet *packet, unsigned char *inpacket, int inpacket_len)
  48. {
  49. memset(context, 0, sizeof(*context));
  50. context->packet = packet;
  51. context->packet_maxlen = sizeof(context->packet_buff);
  52. context->inpacket = inpacket;
  53. context->inpacket_len = inpacket_len;
  54. context->inpacket_maxlen = sizeof(context->inpacket);
  55. context->qtype = request->qtype;
  56. context->request = request;
  57. }
  58. static void _dns_rrs_result_log(struct dns_server_post_context *context, struct dns_ip_address *addr_map)
  59. {
  60. struct dns_request *request = context->request;
  61. if (context->do_log_result == 0 || addr_map == NULL) {
  62. return;
  63. }
  64. if (addr_map->addr_type == DNS_T_A) {
  65. tlog(TLOG_INFO, "result: %s, id: %d, index: %d, rtt: %.1f ms, %d.%d.%d.%d", request->domain, request->id,
  66. context->ip_num, ((float)addr_map->ping_time) / 10, addr_map->ip_addr[0], addr_map->ip_addr[1],
  67. addr_map->ip_addr[2], addr_map->ip_addr[3]);
  68. } else if (addr_map->addr_type == DNS_T_AAAA) {
  69. tlog(TLOG_INFO,
  70. "result: %s, id: %d, index: %d, rtt: %.1f ms, "
  71. "%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x",
  72. request->domain, request->id, context->ip_num, ((float)addr_map->ping_time) / 10, addr_map->ip_addr[0],
  73. addr_map->ip_addr[1], addr_map->ip_addr[2], addr_map->ip_addr[3], addr_map->ip_addr[4],
  74. addr_map->ip_addr[5], addr_map->ip_addr[6], addr_map->ip_addr[7], addr_map->ip_addr[8],
  75. addr_map->ip_addr[9], addr_map->ip_addr[10], addr_map->ip_addr[11], addr_map->ip_addr[12],
  76. addr_map->ip_addr[13], addr_map->ip_addr[14], addr_map->ip_addr[15]);
  77. }
  78. }
  79. static int _dns_rrs_add_all_best_ip(struct dns_server_post_context *context)
  80. {
  81. struct dns_ip_address *addr_map = NULL;
  82. struct dns_ip_address *added_ip_addr = NULL;
  83. struct hlist_node *tmp = NULL;
  84. struct dns_request *request = context->request;
  85. unsigned long bucket = 0;
  86. char *domain = NULL;
  87. int ret = 0;
  88. int ignore_speed = 0;
  89. int maxhit = 0;
  90. if (context->select_all_best_ip == 0 || context->ip_num >= request->conf->dns_max_reply_ip_num) {
  91. return 0;
  92. }
  93. domain = request->domain;
  94. /* add CNAME record */
  95. if (request->has_cname) {
  96. domain = request->cname;
  97. }
  98. /* add fasted ip address at first place of dns RR */
  99. if (request->has_ip) {
  100. added_ip_addr = _dns_ip_address_get(request, request->ip_addr, request->qtype);
  101. _dns_rrs_result_log(context, added_ip_addr);
  102. }
  103. if (request->passthrough == 2) {
  104. ignore_speed = 1;
  105. }
  106. while (true) {
  107. pthread_mutex_lock(&request->ip_map_lock);
  108. hash_for_each_safe(request->ip_map, bucket, tmp, addr_map, node)
  109. {
  110. if (context->ip_num >= request->conf->dns_max_reply_ip_num) {
  111. break;
  112. }
  113. if (context->qtype != addr_map->addr_type) {
  114. continue;
  115. }
  116. if (addr_map == added_ip_addr) {
  117. continue;
  118. }
  119. if (addr_map->hitnum > maxhit) {
  120. maxhit = addr_map->hitnum;
  121. }
  122. if (addr_map->ping_time < 0 && ignore_speed == 0) {
  123. continue;
  124. }
  125. if (addr_map->hitnum < maxhit && ignore_speed == 1) {
  126. continue;
  127. }
  128. /* if ping time is larger than 5ms, check again. */
  129. if (addr_map->ping_time - request->ping_time >= 50) {
  130. int ttl_range = request->ping_time + request->ping_time / 10 + 5;
  131. if ((ttl_range < addr_map->ping_time) && addr_map->ping_time >= 100 && ignore_speed == 0) {
  132. continue;
  133. }
  134. }
  135. _dns_server_context_add_ip(context, addr_map->ip_addr);
  136. if (addr_map->addr_type == DNS_T_A) {
  137. ret |= dns_add_A(context->packet, DNS_RRS_AN, domain, request->ip_ttl, addr_map->ip_addr);
  138. } else if (addr_map->addr_type == DNS_T_AAAA) {
  139. ret |= dns_add_AAAA(context->packet, DNS_RRS_AN, domain, request->ip_ttl, addr_map->ip_addr);
  140. }
  141. _dns_rrs_result_log(context, addr_map);
  142. }
  143. pthread_mutex_unlock(&request->ip_map_lock);
  144. if (context->ip_num <= 0 && ignore_speed == 0) {
  145. ignore_speed = 1;
  146. } else {
  147. break;
  148. }
  149. }
  150. return ret;
  151. }
  152. static int _dns_server_add_srv(struct dns_server_post_context *context)
  153. {
  154. struct dns_request *request = context->request;
  155. struct dns_srv_records *srv_records = request->srv_records;
  156. struct dns_srv_record *srv_record = NULL;
  157. int ret = 0;
  158. if (srv_records == NULL) {
  159. return 0;
  160. }
  161. list_for_each_entry(srv_record, &srv_records->list, list)
  162. {
  163. ret = dns_add_SRV(context->packet, DNS_RRS_AN, request->domain, request->ip_ttl, srv_record->priority,
  164. srv_record->weight, srv_record->port, srv_record->host);
  165. if (ret != 0) {
  166. return -1;
  167. }
  168. }
  169. return 0;
  170. }
  171. static int _dns_add_rrs_ip_hint(struct dns_server_post_context *context, struct dns_rr_nested *param, dns_type_t qtype)
  172. {
  173. typedef int (*addfunc)(struct dns_rr_nested *svcparam, unsigned char *addr[], int addr_num);
  174. struct dns_request *request = context->request;
  175. struct dns_ip_address *addr_map = NULL;
  176. unsigned long bucket = 0;
  177. struct hlist_node *tmp = NULL;
  178. int ret = 0;
  179. int all_ips = 0;
  180. int addr_num = 0;
  181. addfunc add_func = NULL;
  182. unsigned char *addr[8];
  183. int addr_buffer_size = sizeof(addr) / sizeof(addr[0]);
  184. if (qtype == DNS_T_A) {
  185. add_func = dns_HTTPS_add_ipv4hint;
  186. } else if (qtype == DNS_T_AAAA) {
  187. add_func = dns_HTTPS_add_ipv6hint;
  188. } else {
  189. return 0; // Unsupported type
  190. }
  191. if (request->passthrough == 2) {
  192. all_ips = 1;
  193. }
  194. if (request->has_ip == 0) {
  195. return 0;
  196. }
  197. if (all_ips == 0) {
  198. if (request->ip_addr_type == (int)qtype) {
  199. addr[0] = request->ip_addr;
  200. ret = add_func(param, addr, 1);
  201. return ret;
  202. }
  203. return 0;
  204. }
  205. ret = 0;
  206. pthread_mutex_lock(&request->ip_map_lock);
  207. hash_for_each_safe(request->ip_map, bucket, tmp, addr_map, node)
  208. {
  209. if (addr_map->addr_type == qtype) {
  210. addr[addr_num] = addr_map->ip_addr;
  211. addr_num++;
  212. if (addr_num >= addr_buffer_size) {
  213. break;
  214. }
  215. }
  216. }
  217. pthread_mutex_unlock(&request->ip_map_lock);
  218. if (addr_num > 0) {
  219. ret = add_func(param, addr, addr_num);
  220. }
  221. return ret;
  222. }
  223. static int _dns_add_rrs_HTTPS(struct dns_server_post_context *context)
  224. {
  225. struct dns_request *request = context->request;
  226. struct dns_request_https *https_svcb = request->https_svcb;
  227. int ret = 0;
  228. struct dns_rr_nested param;
  229. if (https_svcb == NULL || request->qtype != DNS_T_HTTPS) {
  230. return 0;
  231. }
  232. ret = dns_add_HTTPS_start(&param, context->packet, DNS_RRS_AN, https_svcb->domain, https_svcb->ttl,
  233. https_svcb->priority, https_svcb->target);
  234. if (ret != 0) {
  235. return ret;
  236. }
  237. if (https_svcb->alpn[0] != '\0' && https_svcb->alpn_len > 0) {
  238. ret = dns_HTTPS_add_alpn(&param, https_svcb->alpn, https_svcb->alpn_len);
  239. if (ret != 0) {
  240. return ret;
  241. }
  242. }
  243. if (https_svcb->port != 0) {
  244. ret = dns_HTTPS_add_port(&param, https_svcb->port);
  245. if (ret != 0) {
  246. return ret;
  247. }
  248. }
  249. ret = _dns_add_rrs_ip_hint(context, &param, DNS_T_A);
  250. if (ret != 0) {
  251. return ret;
  252. }
  253. if (https_svcb->ech_len > 0) {
  254. ret = dns_HTTPS_add_ech(&param, https_svcb->ech, https_svcb->ech_len);
  255. if (ret != 0) {
  256. return ret;
  257. }
  258. }
  259. ret = _dns_add_rrs_ip_hint(context, &param, DNS_T_AAAA);
  260. if (ret != 0) {
  261. return ret;
  262. }
  263. dns_add_HTTPS_end(&param);
  264. return 0;
  265. }
  266. static int _dns_add_rrs(struct dns_server_post_context *context)
  267. {
  268. struct dns_request *request = context->request;
  269. int ret = 0;
  270. int has_soa = request->has_soa;
  271. char *domain = request->domain;
  272. if (request->has_ptr) {
  273. /* add PTR record */
  274. ret = dns_add_PTR(context->packet, DNS_RRS_AN, request->domain, request->ip_ttl, request->ptr_hostname);
  275. }
  276. /* add CNAME record */
  277. if (request->has_cname && context->do_force_soa == 0) {
  278. ret |= dns_add_CNAME(context->packet, DNS_RRS_AN, request->domain, request->ttl_cname, request->cname);
  279. domain = request->cname;
  280. }
  281. if (request->https_svcb != NULL) {
  282. ret = _dns_add_rrs_HTTPS(context);
  283. }
  284. /* add A record */
  285. if (request->has_ip && context->do_force_soa == 0) {
  286. _dns_server_context_add_ip(context, request->ip_addr);
  287. if (context->qtype == DNS_T_A) {
  288. ret |= dns_add_A(context->packet, DNS_RRS_AN, domain, request->ip_ttl, request->ip_addr);
  289. tlog(TLOG_DEBUG, "result: %s, rtt: %.1f ms, %d.%d.%d.%d", request->domain, ((float)request->ping_time) / 10,
  290. request->ip_addr[0], request->ip_addr[1], request->ip_addr[2], request->ip_addr[3]);
  291. }
  292. /* add AAAA record */
  293. if (context->qtype == DNS_T_AAAA) {
  294. ret |= dns_add_AAAA(context->packet, DNS_RRS_AN, domain, request->ip_ttl, request->ip_addr);
  295. tlog(TLOG_DEBUG,
  296. "result: %s, rtt: %.1f ms, "
  297. "%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x",
  298. request->domain, ((float)request->ping_time) / 10, request->ip_addr[0], request->ip_addr[1],
  299. request->ip_addr[2], request->ip_addr[3], request->ip_addr[4], request->ip_addr[5],
  300. request->ip_addr[6], request->ip_addr[7], request->ip_addr[8], request->ip_addr[9],
  301. request->ip_addr[10], request->ip_addr[11], request->ip_addr[12], request->ip_addr[13],
  302. request->ip_addr[14], request->ip_addr[15]);
  303. }
  304. }
  305. if (context->do_force_soa == 0) {
  306. ret |= _dns_rrs_add_all_best_ip(context);
  307. }
  308. if (context->qtype == DNS_T_A || context->qtype == DNS_T_AAAA) {
  309. if (context->ip_num > 0) {
  310. has_soa = 0;
  311. }
  312. }
  313. /* add SOA record */
  314. if (has_soa) {
  315. ret |= dns_add_SOA(context->packet, DNS_RRS_NS, domain, request->ip_ttl, &request->soa);
  316. tlog(TLOG_DEBUG, "result: %s, qtype: %d, return SOA", request->domain, context->qtype);
  317. } else if (context->do_force_soa == 1) {
  318. _dns_server_setup_soa(request);
  319. ret |= dns_add_SOA(context->packet, DNS_RRS_NS, domain, request->ip_ttl, &request->soa);
  320. }
  321. if (request->has_ecs) {
  322. ret |= dns_add_OPT_ECS(context->packet, &request->ecs);
  323. }
  324. if (request->srv_records != NULL) {
  325. ret |= _dns_server_add_srv(context);
  326. }
  327. if (request->rcode != DNS_RC_NOERROR) {
  328. tlog(TLOG_INFO, "result: %s, qtype: %d, rtcode: %d, id: %d", domain, context->qtype, request->rcode,
  329. request->id);
  330. }
  331. return ret;
  332. }
  333. static int _dns_setup_dns_packet(struct dns_server_post_context *context)
  334. {
  335. struct dns_head head;
  336. struct dns_request *request = context->request;
  337. int ret = 0;
  338. memset(&head, 0, sizeof(head));
  339. head.id = request->id;
  340. head.qr = DNS_QR_ANSWER;
  341. head.opcode = DNS_OP_QUERY;
  342. head.rd = 1;
  343. head.ra = 1;
  344. head.aa = 0;
  345. head.tc = 0;
  346. head.rcode = request->rcode;
  347. /* init a new DNS packet */
  348. ret = dns_packet_init(context->packet, context->packet_maxlen, &head);
  349. if (ret != 0) {
  350. return -1;
  351. }
  352. if (request->domain[0] == '\0') {
  353. return 0;
  354. }
  355. /* add request domain */
  356. ret = dns_add_domain(context->packet, request->domain, context->qtype, request->qclass);
  357. if (ret != 0) {
  358. return -1;
  359. }
  360. /* add RECORDs */
  361. ret = _dns_add_rrs(context);
  362. if (ret != 0) {
  363. return -1;
  364. }
  365. return 0;
  366. }
  367. static int _dns_setup_dns_raw_packet(struct dns_server_post_context *context)
  368. {
  369. /* encode to binary data */
  370. int encode_len = dns_encode(context->inpacket, context->inpacket_maxlen, context->packet);
  371. if (encode_len <= 0) {
  372. tlog(TLOG_DEBUG, "encode raw packet failed for %s", context->request->domain);
  373. return -1;
  374. }
  375. context->inpacket_len = encode_len;
  376. return 0;
  377. }
  378. static int _dns_result_callback(struct dns_server_post_context *context)
  379. {
  380. struct dns_result result;
  381. char ip[DNS_MAX_CNAME_LEN];
  382. unsigned int ping_time = -1;
  383. struct dns_request *request = context->request;
  384. if (request->result_callback == NULL) {
  385. return 0;
  386. }
  387. if (atomic_inc_return(&request->do_callback) != 1) {
  388. return 0;
  389. }
  390. ip[0] = 0;
  391. memset(&result, 0, sizeof(result));
  392. ping_time = request->ping_time;
  393. result.domain = request->domain;
  394. result.rtcode = request->rcode;
  395. result.addr_type = request->qtype;
  396. result.ip = ip;
  397. result.has_soa = request->has_soa | context->do_force_soa;
  398. result.ping_time = ping_time;
  399. result.ip_num = 0;
  400. if (request->has_ip != 0 && context->do_force_soa == 0) {
  401. for (int i = 0; i < context->ip_num && i < MAX_IP_NUM; i++) {
  402. result.ip_addr[i] = context->ip_addr[i];
  403. result.ip_num++;
  404. }
  405. if (request->qtype == DNS_T_A) {
  406. snprintf(ip, sizeof(ip), "%d.%d.%d.%d", request->ip_addr[0], request->ip_addr[1], request->ip_addr[2],
  407. request->ip_addr[3]);
  408. } else if (request->qtype == DNS_T_AAAA) {
  409. snprintf(ip, sizeof(ip), "%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x",
  410. request->ip_addr[0], request->ip_addr[1], request->ip_addr[2], request->ip_addr[3],
  411. request->ip_addr[4], request->ip_addr[5], request->ip_addr[6], request->ip_addr[7],
  412. request->ip_addr[8], request->ip_addr[9], request->ip_addr[10], request->ip_addr[11],
  413. request->ip_addr[12], request->ip_addr[13], request->ip_addr[14], request->ip_addr[15]);
  414. }
  415. }
  416. return request->result_callback(&result, request->user_ptr);
  417. }
  418. static int _dns_server_setup_ipset_nftset_packet(struct dns_server_post_context *context)
  419. {
  420. int ttl = 0;
  421. struct dns_request *request = context->request;
  422. char name[DNS_MAX_CNAME_LEN] = {0};
  423. int rr_count = 0;
  424. int timeout_value = 0;
  425. int ipset_timeout_value = 0;
  426. int nftset_timeout_value = 0;
  427. int i = 0;
  428. int j = 0;
  429. struct dns_conf_group *conf;
  430. struct dns_rrs *rrs = NULL;
  431. struct dns_ipset_rule *rule = NULL;
  432. struct dns_ipset_rule *ipset_rule = NULL;
  433. struct dns_ipset_rule *ipset_rule_v4 = NULL;
  434. struct dns_ipset_rule *ipset_rule_v6 = NULL;
  435. struct dns_nftset_rule *nftset_ip = NULL;
  436. struct dns_nftset_rule *nftset_ip6 = NULL;
  437. struct dns_rule_flags *rule_flags = NULL;
  438. int check_no_speed_rule = 0;
  439. if (_dns_server_has_bind_flag(request, BIND_FLAG_NO_RULE_IPSET) == 0) {
  440. return 0;
  441. }
  442. if (context->do_ipset == 0) {
  443. return 0;
  444. }
  445. if (context->ip_num <= 0) {
  446. return 0;
  447. }
  448. if (request->ping_time < 0 && request->has_ip > 0 && request->passthrough == 0) {
  449. check_no_speed_rule = 1;
  450. }
  451. conf = request->conf;
  452. /* check ipset rule */
  453. rule_flags = _dns_server_get_dns_rule(request, DOMAIN_RULE_FLAGS);
  454. if (!rule_flags || (rule_flags->flags & DOMAIN_FLAG_IPSET_IGN) == 0) {
  455. ipset_rule = _dns_server_get_dns_rule(request, DOMAIN_RULE_IPSET);
  456. if (ipset_rule == NULL) {
  457. ipset_rule = _dns_server_get_bind_ipset_nftset_rule(request, DOMAIN_RULE_IPSET);
  458. }
  459. if (ipset_rule == NULL && check_no_speed_rule && conf->ipset_nftset.ipset_no_speed.inet_enable) {
  460. ipset_rule_v4 = &conf->ipset_nftset.ipset_no_speed.inet;
  461. }
  462. }
  463. if (!rule_flags || (rule_flags->flags & DOMAIN_FLAG_IPSET_IPV4_IGN) == 0) {
  464. ipset_rule_v4 = _dns_server_get_dns_rule(request, DOMAIN_RULE_IPSET_IPV4);
  465. if (ipset_rule_v4 == NULL) {
  466. ipset_rule_v4 = _dns_server_get_bind_ipset_nftset_rule(request, DOMAIN_RULE_IPSET_IPV4);
  467. }
  468. if (ipset_rule_v4 == NULL && check_no_speed_rule && conf->ipset_nftset.ipset_no_speed.ipv4_enable) {
  469. ipset_rule_v4 = &conf->ipset_nftset.ipset_no_speed.ipv4;
  470. }
  471. }
  472. if (!rule_flags || (rule_flags->flags & DOMAIN_FLAG_IPSET_IPV6_IGN) == 0) {
  473. ipset_rule_v6 = _dns_server_get_dns_rule(request, DOMAIN_RULE_IPSET_IPV6);
  474. if (ipset_rule_v6 == NULL) {
  475. ipset_rule_v6 = _dns_server_get_bind_ipset_nftset_rule(request, DOMAIN_RULE_IPSET_IPV6);
  476. }
  477. if (ipset_rule_v6 == NULL && check_no_speed_rule && conf->ipset_nftset.ipset_no_speed.ipv6_enable) {
  478. ipset_rule_v6 = &conf->ipset_nftset.ipset_no_speed.ipv6;
  479. }
  480. }
  481. if (!rule_flags || (rule_flags->flags & DOMAIN_FLAG_NFTSET_IP_IGN) == 0) {
  482. nftset_ip = _dns_server_get_dns_rule(request, DOMAIN_RULE_NFTSET_IP);
  483. if (nftset_ip == NULL) {
  484. nftset_ip = _dns_server_get_bind_ipset_nftset_rule(request, DOMAIN_RULE_NFTSET_IP);
  485. }
  486. if (nftset_ip == NULL && check_no_speed_rule && conf->ipset_nftset.nftset_no_speed.ip_enable) {
  487. nftset_ip = &conf->ipset_nftset.nftset_no_speed.ip;
  488. }
  489. }
  490. if (!rule_flags || (rule_flags->flags & DOMAIN_FLAG_NFTSET_IP6_IGN) == 0) {
  491. nftset_ip6 = _dns_server_get_dns_rule(request, DOMAIN_RULE_NFTSET_IP6);
  492. if (nftset_ip6 == NULL) {
  493. nftset_ip6 = _dns_server_get_bind_ipset_nftset_rule(request, DOMAIN_RULE_NFTSET_IP6);
  494. }
  495. if (nftset_ip6 == NULL && check_no_speed_rule && conf->ipset_nftset.nftset_no_speed.ip6_enable) {
  496. nftset_ip6 = &conf->ipset_nftset.nftset_no_speed.ip6;
  497. }
  498. }
  499. if (!(ipset_rule || ipset_rule_v4 || ipset_rule_v6 || nftset_ip || nftset_ip6)) {
  500. return 0;
  501. }
  502. timeout_value = request->ip_ttl * 3;
  503. if (timeout_value == 0) {
  504. timeout_value = _dns_server_get_conf_ttl(request, 0) * 3;
  505. }
  506. if (conf->ipset_nftset.ipset_timeout_enable) {
  507. ipset_timeout_value = timeout_value;
  508. }
  509. if (conf->ipset_nftset.nftset_timeout_enable) {
  510. nftset_timeout_value = timeout_value;
  511. }
  512. for (j = 1; j < DNS_RRS_OPT; j++) {
  513. rrs = dns_get_rrs_start(context->packet, j, &rr_count);
  514. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(context->packet, rrs)) {
  515. switch (rrs->type) {
  516. case DNS_T_A: {
  517. unsigned char addr[4];
  518. if (context->qtype != DNS_T_A) {
  519. break;
  520. }
  521. /* get A result */
  522. dns_get_A(rrs, name, DNS_MAX_CNAME_LEN, &ttl, addr);
  523. rule = ipset_rule_v4 ? ipset_rule_v4 : ipset_rule;
  524. _dns_server_add_ipset_nftset(request, rule, nftset_ip, addr, DNS_RR_A_LEN, ipset_timeout_value,
  525. nftset_timeout_value);
  526. } break;
  527. case DNS_T_AAAA: {
  528. unsigned char addr[16];
  529. if (context->qtype != DNS_T_AAAA) {
  530. /* ignore non-matched query type */
  531. break;
  532. }
  533. dns_get_AAAA(rrs, name, DNS_MAX_CNAME_LEN, &ttl, addr);
  534. rule = ipset_rule_v6 ? ipset_rule_v6 : ipset_rule;
  535. _dns_server_add_ipset_nftset(request, rule, nftset_ip6, addr, DNS_RR_AAAA_LEN, ipset_timeout_value,
  536. nftset_timeout_value);
  537. } break;
  538. case DNS_T_HTTPS: {
  539. char target[DNS_MAX_CNAME_LEN] = {0};
  540. struct dns_https_param *p = NULL;
  541. int priority = 0;
  542. int ret = dns_get_HTTPS_svcparm_start(rrs, &p, name, DNS_MAX_CNAME_LEN, &ttl, &priority, target,
  543. DNS_MAX_CNAME_LEN);
  544. if (ret != 0) {
  545. tlog(TLOG_WARN, "get HTTPS svcparm failed");
  546. return -1;
  547. }
  548. for (; p; p = dns_get_HTTPS_svcparm_next(rrs, p)) {
  549. switch (p->key) {
  550. case DNS_HTTPS_T_IPV4HINT: {
  551. unsigned char *addr;
  552. for (int k = 0; k < p->len / 4; k++) {
  553. addr = p->value + k * 4;
  554. rule = ipset_rule_v4 ? ipset_rule_v4 : ipset_rule;
  555. _dns_server_add_ipset_nftset(request, rule, nftset_ip, addr, DNS_RR_A_LEN,
  556. ipset_timeout_value, nftset_timeout_value);
  557. }
  558. } break;
  559. case DNS_HTTPS_T_IPV6HINT: {
  560. unsigned char *addr;
  561. for (int k = 0; k < p->len / 16; k++) {
  562. addr = p->value + k * 16;
  563. rule = ipset_rule_v6 ? ipset_rule_v6 : ipset_rule;
  564. _dns_server_add_ipset_nftset(request, rule, nftset_ip6, addr, DNS_RR_AAAA_LEN,
  565. ipset_timeout_value, nftset_timeout_value);
  566. }
  567. } break;
  568. default:
  569. break;
  570. }
  571. }
  572. } break;
  573. default:
  574. break;
  575. }
  576. }
  577. }
  578. return 0;
  579. }
  580. static int _dns_result_child_post(struct dns_server_post_context *context)
  581. {
  582. struct dns_request *request = context->request;
  583. struct dns_request *parent_request = request->parent_request;
  584. DNS_CHILD_POST_RESULT child_ret = DNS_CHILD_POST_FAIL;
  585. /* not a child request */
  586. if (parent_request == NULL) {
  587. return 0;
  588. }
  589. if (request->child_callback) {
  590. int is_first_resp = context->no_release_parent;
  591. child_ret = request->child_callback(parent_request, request, is_first_resp);
  592. }
  593. if (context->do_reply == 1 && child_ret == DNS_CHILD_POST_SUCCESS) {
  594. struct dns_server_post_context parent_context;
  595. _dns_server_post_context_init(&parent_context, parent_request);
  596. parent_context.do_cache = context->do_cache;
  597. parent_context.do_ipset = context->do_ipset;
  598. parent_context.do_force_soa = context->do_force_soa;
  599. parent_context.do_audit = context->do_audit;
  600. parent_context.do_reply = context->do_reply;
  601. parent_context.reply_ttl = context->reply_ttl;
  602. parent_context.cache_ttl = context->cache_ttl;
  603. parent_context.skip_notify_count = context->skip_notify_count;
  604. parent_context.select_all_best_ip = 1;
  605. parent_context.no_release_parent = context->no_release_parent;
  606. _dns_request_post(&parent_context);
  607. _dns_server_reply_all_pending_list(parent_request, &parent_context);
  608. }
  609. if (context->no_release_parent == 0) {
  610. tlog(TLOG_DEBUG, "query %s with child %s done", parent_request->domain, request->domain);
  611. request->parent_request = NULL;
  612. parent_request->request_wait--;
  613. _dns_server_request_release(parent_request);
  614. }
  615. if (child_ret == DNS_CHILD_POST_FAIL) {
  616. return -1;
  617. }
  618. return 0;
  619. }
  620. static int _dns_request_update_id_ttl(struct dns_server_post_context *context)
  621. {
  622. int ttl = context->reply_ttl;
  623. struct dns_request *request = context->request;
  624. if (request->conf->dns_rr_ttl_reply_max > 0) {
  625. if (request->ip_ttl > request->conf->dns_rr_ttl_reply_max && ttl == 0) {
  626. ttl = request->ip_ttl;
  627. }
  628. if (ttl > request->conf->dns_rr_ttl_reply_max) {
  629. ttl = request->conf->dns_rr_ttl_reply_max;
  630. }
  631. if (ttl == 0) {
  632. ttl = request->conf->dns_rr_ttl_reply_max;
  633. }
  634. }
  635. if (ttl == 0) {
  636. ttl = request->ip_ttl;
  637. if (ttl == 0) {
  638. ttl = _dns_server_get_conf_ttl(request, ttl);
  639. }
  640. }
  641. struct dns_update_param param;
  642. param.id = request->id;
  643. param.cname_ttl = ttl;
  644. param.ip_ttl = ttl;
  645. if (dns_packet_update(context->inpacket, context->inpacket_len, &param) != 0) {
  646. tlog(TLOG_DEBUG, "update packet info failed.");
  647. }
  648. return 0;
  649. }
  650. int _dns_request_post(struct dns_server_post_context *context)
  651. {
  652. struct dns_request *request = context->request;
  653. char clientip[DNS_MAX_CNAME_LEN] = {0};
  654. int ret = 0;
  655. tlog(TLOG_DEBUG, "reply %s qtype: %d, rcode: %d, reply: %d", request->domain, request->qtype,
  656. context->packet->head.rcode, context->do_reply);
  657. /* init a new DNS packet */
  658. ret = _dns_setup_dns_packet(context);
  659. if (ret != 0) {
  660. tlog(TLOG_ERROR, "setup dns packet failed.");
  661. return -1;
  662. }
  663. ret = _dns_setup_dns_raw_packet(context);
  664. if (ret != 0) {
  665. tlog(TLOG_ERROR, "set dns raw packet failed.");
  666. return -1;
  667. }
  668. /* cache reply packet */
  669. ret = _dns_cache_reply_packet(context);
  670. if (ret != 0) {
  671. tlog(TLOG_WARN, "cache packet for %s failed.", request->domain);
  672. }
  673. /* setup ipset */
  674. _dns_server_setup_ipset_nftset_packet(context);
  675. /* reply child request */
  676. _dns_result_child_post(context);
  677. if (context->do_reply == 0) {
  678. return 0;
  679. }
  680. if (context->skip_notify_count == 0) {
  681. if (atomic_inc_return(&request->notified) != 1) {
  682. tlog(TLOG_DEBUG, "skip reply %s %d", request->domain, request->qtype);
  683. return 0;
  684. }
  685. }
  686. /* log audit log */
  687. _dns_server_audit_log(context);
  688. /* reply API callback */
  689. _dns_result_callback(context);
  690. if (request->conn == NULL) {
  691. return 0;
  692. }
  693. ret = _dns_request_update_id_ttl(context);
  694. if (ret != 0) {
  695. tlog(TLOG_ERROR, "update packet ttl failed.");
  696. return -1;
  697. }
  698. tlog(TLOG_INFO, "result: %s, client: %s, qtype: %d, id: %d, group: %s, time: %lums", request->domain,
  699. get_host_by_addr(clientip, sizeof(clientip), (struct sockaddr *)&request->addr), request->qtype, request->id,
  700. request->dns_group_name[0] != '\0' ? request->dns_group_name : DNS_SERVER_GROUP_DEFAULT,
  701. get_tick_count() - request->send_tick);
  702. ret = _dns_reply_inpacket(request, context->inpacket, context->inpacket_len);
  703. if (ret != 0) {
  704. tlog(TLOG_DEBUG, "reply raw packet to client failed.");
  705. return -1;
  706. }
  707. return 0;
  708. }
  709. int _dns_server_get_answer(struct dns_server_post_context *context)
  710. {
  711. int i = 0;
  712. int j = 0;
  713. int ttl = 0;
  714. struct dns_rrs *rrs = NULL;
  715. int rr_count = 0;
  716. struct dns_request *request = context->request;
  717. struct dns_packet *packet = context->packet;
  718. for (j = 1; j < DNS_RRS_OPT; j++) {
  719. rrs = dns_get_rrs_start(packet, j, &rr_count);
  720. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(packet, rrs)) {
  721. switch (rrs->type) {
  722. case DNS_T_A: {
  723. unsigned char addr[4];
  724. char name[DNS_MAX_CNAME_LEN] = {0};
  725. struct dns_ip_address *addr_map = NULL;
  726. if (request->qtype != DNS_T_A) {
  727. continue;
  728. }
  729. /* get A result */
  730. dns_get_A(rrs, name, DNS_MAX_CNAME_LEN, &ttl, addr);
  731. if (strncasecmp(name, request->domain, DNS_MAX_CNAME_LEN - 1) != 0 &&
  732. strncasecmp(name, request->cname, DNS_MAX_CNAME_LEN - 1) != 0) {
  733. continue;
  734. }
  735. if (context->no_check_add_ip == 0 &&
  736. _dns_ip_address_check_add(request, name, addr, DNS_T_A, request->ping_time, &addr_map) != 0) {
  737. continue;
  738. }
  739. if (addr_map != NULL) {
  740. _dns_server_context_add_ip(context, addr_map->ip_addr);
  741. }
  742. if (request->has_ip == 1) {
  743. continue;
  744. }
  745. memcpy(request->ip_addr, addr, DNS_RR_A_LEN);
  746. /* add this ip to request */
  747. request->ip_ttl = _dns_server_get_conf_ttl(request, ttl);
  748. request->has_ip = 1;
  749. request->rcode = packet->head.rcode;
  750. } break;
  751. case DNS_T_AAAA: {
  752. unsigned char addr[16];
  753. char name[DNS_MAX_CNAME_LEN] = {0};
  754. struct dns_ip_address *addr_map = NULL;
  755. if (request->qtype != DNS_T_AAAA) {
  756. /* ignore non-matched query type */
  757. continue;
  758. }
  759. dns_get_AAAA(rrs, name, DNS_MAX_CNAME_LEN, &ttl, addr);
  760. if (strncasecmp(name, request->domain, DNS_MAX_CNAME_LEN - 1) != 0 &&
  761. strncasecmp(name, request->cname, DNS_MAX_CNAME_LEN - 1) != 0) {
  762. continue;
  763. }
  764. if (context->no_check_add_ip == 0 &&
  765. _dns_ip_address_check_add(request, name, addr, DNS_T_AAAA, request->ping_time, &addr_map) != 0) {
  766. continue;
  767. }
  768. if (addr_map != NULL) {
  769. _dns_server_context_add_ip(context, addr_map->ip_addr);
  770. }
  771. if (request->has_ip == 1) {
  772. continue;
  773. }
  774. memcpy(request->ip_addr, addr, DNS_RR_AAAA_LEN);
  775. request->ip_ttl = _dns_server_get_conf_ttl(request, ttl);
  776. request->has_ip = 1;
  777. request->rcode = packet->head.rcode;
  778. } break;
  779. case DNS_T_NS: {
  780. char cname[DNS_MAX_CNAME_LEN];
  781. char name[DNS_MAX_CNAME_LEN] = {0};
  782. dns_get_CNAME(rrs, name, DNS_MAX_CNAME_LEN, &ttl, cname, DNS_MAX_CNAME_LEN);
  783. tlog(TLOG_DEBUG, "NS: %s, ttl: %d, cname: %s\n", name, ttl, cname);
  784. } break;
  785. case DNS_T_CNAME: {
  786. char cname[DNS_MAX_CNAME_LEN];
  787. char name[DNS_MAX_CNAME_LEN] = {0};
  788. if (request->conf->dns_force_no_cname) {
  789. continue;
  790. }
  791. dns_get_CNAME(rrs, name, DNS_MAX_CNAME_LEN, &ttl, cname, DNS_MAX_CNAME_LEN);
  792. tlog(TLOG_DEBUG, "name: %s, ttl: %d, cname: %s\n", name, ttl, cname);
  793. if (strncasecmp(name, request->domain, DNS_MAX_CNAME_LEN - 1) != 0 &&
  794. strncasecmp(name, request->cname, DNS_MAX_CNAME_LEN - 1) != 0) {
  795. continue;
  796. }
  797. safe_strncpy(request->cname, cname, DNS_MAX_CNAME_LEN);
  798. request->ttl_cname = _dns_server_get_conf_ttl(request, ttl);
  799. request->has_cname = 1;
  800. } break;
  801. case DNS_T_SOA: {
  802. char name[DNS_MAX_CNAME_LEN] = {0};
  803. request->has_soa = 1;
  804. if (request->rcode != DNS_RC_NOERROR) {
  805. request->rcode = packet->head.rcode;
  806. }
  807. dns_get_SOA(rrs, name, 128, &ttl, &request->soa);
  808. tlog(TLOG_DEBUG,
  809. "domain: %s, qtype: %d, SOA: mname: %s, rname: %s, serial: %d, refresh: %d, retry: %d, "
  810. "expire: "
  811. "%d, minimum: %d",
  812. request->domain, request->qtype, request->soa.mname, request->soa.rname, request->soa.serial,
  813. request->soa.refresh, request->soa.retry, request->soa.expire, request->soa.minimum);
  814. request->ip_ttl = _dns_server_get_conf_ttl(request, ttl);
  815. } break;
  816. default:
  817. break;
  818. }
  819. }
  820. }
  821. return 0;
  822. }
  823. int _dns_cache_reply_packet(struct dns_server_post_context *context)
  824. {
  825. struct dns_request *request = context->request;
  826. int speed = -1;
  827. if (context->do_cache == 0 || request->no_cache == 1) {
  828. return 0;
  829. }
  830. if (context->packet->head.rcode == DNS_RC_SERVFAIL || context->packet->head.rcode == DNS_RC_NXDOMAIN ||
  831. context->packet->head.rcode == DNS_RC_NOTIMP) {
  832. context->reply_ttl = DNS_SERVER_FAIL_TTL;
  833. /* Do not cache record if cannot connect to remote */
  834. if (request->remote_server_fail == 0 && context->packet->head.rcode == DNS_RC_SERVFAIL) {
  835. /* Try keep old cache if server fail */
  836. _dns_cache_try_keep_old_cache(request);
  837. return 0;
  838. }
  839. if (context->packet->head.rcode == DNS_RC_NOTIMP) {
  840. return 0;
  841. }
  842. return _dns_cache_packet(context);
  843. }
  844. if (context->qtype != DNS_T_AAAA && context->qtype != DNS_T_A && context->qtype != DNS_T_HTTPS) {
  845. return _dns_cache_specify_packet(context);
  846. }
  847. struct dns_cache_data *cache_packet = dns_cache_new_data_packet(context->inpacket, context->inpacket_len);
  848. if (cache_packet == NULL) {
  849. return -1;
  850. }
  851. speed = request->ping_time;
  852. if (context->do_force_soa) {
  853. speed = -1;
  854. }
  855. if (_dns_server_request_update_cache(request, speed, context->qtype, cache_packet, context->cache_ttl) != 0) {
  856. tlog(TLOG_WARN, "update packet cache failed.");
  857. }
  858. _dns_cache_cname_packet(context);
  859. return 0;
  860. }
  861. int _dns_server_reply_passthrough(struct dns_server_post_context *context)
  862. {
  863. struct dns_request *request = context->request;
  864. if (atomic_inc_return(&request->notified) != 1) {
  865. return 0;
  866. }
  867. _dns_server_get_answer(context);
  868. _dns_cache_reply_packet(context);
  869. if (_dns_server_setup_ipset_nftset_packet(context) != 0) {
  870. tlog(TLOG_DEBUG, "setup ipset failed.");
  871. }
  872. _dns_result_callback(context);
  873. _dns_server_audit_log(context);
  874. /* reply child request */
  875. _dns_result_child_post(context);
  876. if (request->conn && context->do_reply == 1) {
  877. char clientip[DNS_MAX_CNAME_LEN] = {0};
  878. /* When passthrough, modify the id to be the id of the client request. */
  879. int ret = _dns_request_update_id_ttl(context);
  880. if (ret != 0) {
  881. tlog(TLOG_ERROR, "update packet ttl failed.");
  882. return -1;
  883. }
  884. _dns_reply_inpacket(request, context->inpacket, context->inpacket_len);
  885. tlog(TLOG_INFO, "result: %s, client: %s, qtype: %d, id: %d, group: %s, time: %lums", request->domain,
  886. get_host_by_addr(clientip, sizeof(clientip), (struct sockaddr *)&request->addr), request->qtype,
  887. request->id, request->dns_group_name[0] != '\0' ? request->dns_group_name : DNS_SERVER_GROUP_DEFAULT,
  888. get_tick_count() - request->send_tick);
  889. }
  890. return _dns_server_reply_all_pending_list(request, context);
  891. }