dns_server.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898
  1. /*************************************************************************
  2. *
  3. * Copyright (C) 2018 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 "dns_server.h"
  19. #include "atomic.h"
  20. #include "conf.h"
  21. #include "dns.h"
  22. #include "dns_client.h"
  23. #include "fast_ping.h"
  24. #include "hashtable.h"
  25. #include "list.h"
  26. #include "tlog.h"
  27. #include "util.h"
  28. #include <arpa/inet.h>
  29. #include <errno.h>
  30. #include <fcntl.h>
  31. #include <ifaddrs.h>
  32. #include <linux/filter.h>
  33. #include <netdb.h>
  34. #include <netinet/icmp6.h>
  35. #include <netinet/ip.h>
  36. #include <netinet/ip6.h>
  37. #include <netinet/ip_icmp.h>
  38. #include <pthread.h>
  39. #include <stdio.h>
  40. #include <stdlib.h>
  41. #include <string.h>
  42. #include <sys/epoll.h>
  43. #include <sys/socket.h>
  44. #include <sys/stat.h>
  45. #include <sys/time.h>
  46. #include <sys/types.h>
  47. #include <unistd.h>
  48. #define DNS_MAX_EVENTS 256
  49. struct dns_server {
  50. int run;
  51. int epoll_fd;
  52. int fd;
  53. pthread_mutex_t map_lock;
  54. DECLARE_HASHTABLE(hostmap, 6);
  55. };
  56. struct dns_ip_address {
  57. struct hlist_node node;
  58. dns_type_t addr_type;
  59. union {
  60. unsigned char ipv4_addr[DNS_RR_A_LEN];
  61. unsigned char ipv6_addr[DNS_RR_AAAA_LEN];
  62. unsigned char addr[0];
  63. };
  64. };
  65. struct dns_request {
  66. atomic_t refcnt;
  67. struct hlist_node map;
  68. char domain[DNS_MAX_CNAME_LEN];
  69. struct dns_head head;
  70. unsigned long send_tick;
  71. unsigned short qtype;
  72. unsigned short id;
  73. unsigned short rcode;
  74. unsigned short ss_family;
  75. socklen_t addr_len;
  76. union {
  77. struct sockaddr_in in;
  78. struct sockaddr_in6 in6;
  79. struct sockaddr addr;
  80. };
  81. int has_ptr;
  82. int has_cname;
  83. char alias[DNS_MAX_CNAME_LEN];
  84. int has_ipv4;
  85. int ttl_v4;
  86. unsigned char ipv4_addr[DNS_RR_A_LEN];
  87. int has_ipv6;
  88. int ttl_v6;
  89. unsigned char ipv6_addr[DNS_RR_AAAA_LEN];
  90. struct dns_soa soa;
  91. int has_soa;
  92. atomic_t notified;
  93. int passthrough;
  94. DECLARE_HASHTABLE(ip_map, 4);
  95. };
  96. static struct dns_server server;
  97. void _dns_server_period_run() {}
  98. static int _dns_server_forward_request(unsigned char *inpacket, int inpacket_len)
  99. {
  100. tlog(TLOG_ERROR, "forward request.\n");
  101. return -1;
  102. }
  103. static int _dns_recv_addr(struct dns_request *request, struct sockaddr_storage *from, socklen_t from_len)
  104. {
  105. switch (from->ss_family) {
  106. case AF_INET:
  107. memcpy(&request->in, from, from_len);
  108. request->addr_len = from_len;
  109. break;
  110. case AF_INET6:
  111. memcpy(&request->in6, from, from_len);
  112. request->addr_len = from_len;
  113. break;
  114. default:
  115. return -1;
  116. break;
  117. }
  118. return 0;
  119. }
  120. static int _dns_add_rrs(struct dns_packet *packet, struct dns_request *request)
  121. {
  122. int ret = 0;
  123. char *domain = request->domain;
  124. if (request->has_ptr) {
  125. char hostname[DNS_MAX_CNAME_LEN];
  126. if (getdomainname(hostname, DNS_MAX_CNAME_LEN) != 0) {
  127. if (gethostname(hostname, DNS_MAX_CNAME_LEN) != 0) {
  128. return -1;
  129. }
  130. }
  131. if (strncmp(hostname, "(none)", DNS_MAX_CNAME_LEN) == 0) {
  132. if (gethostname(hostname, DNS_MAX_CNAME_LEN) != 0) {
  133. return -1;
  134. }
  135. }
  136. ret = dns_add_PTR(packet, DNS_RRS_AN, request->domain, 30, hostname);
  137. }
  138. if (request->has_cname) {
  139. ret |= dns_add_CNAME(packet, DNS_RRS_AN, request->domain, 30, request->alias);
  140. domain = request->alias;
  141. }
  142. if (request->has_ipv4 && request->qtype == DNS_T_A) {
  143. ret |= dns_add_A(packet, DNS_RRS_AN, domain, 30, request->ipv4_addr);
  144. }
  145. if (request->has_ipv6 && request->qtype == DNS_T_AAAA) {
  146. if (request->has_ipv4) {
  147. ret |= dns_add_A(packet, DNS_RRS_AN, domain, 30, request->ipv4_addr);
  148. }
  149. ret |= dns_add_AAAA(packet, DNS_RRS_AN, domain, 30, request->ipv6_addr);
  150. }
  151. if (request->has_soa) {
  152. ret |= dns_add_SOA(packet, DNS_RRS_NS, domain, 0, &request->soa);
  153. }
  154. return ret;
  155. }
  156. static int _dns_reply_inpacket(struct dns_request *request, unsigned char *inpacket, int inpacket_len)
  157. {
  158. int send_len = 0;
  159. unsigned short *id = (unsigned short *)inpacket;
  160. *id = htons(request->id);
  161. send_len = sendto(server.fd, inpacket, inpacket_len, 0, &request->addr, request->addr_len);
  162. if (send_len != inpacket_len) {
  163. tlog(TLOG_ERROR, "send failed.");
  164. return -1;
  165. }
  166. return 0;
  167. }
  168. static int _dns_reply(struct dns_request *request)
  169. {
  170. unsigned char inpacket[DNS_IN_PACKSIZE];
  171. unsigned char packet_buff[DNS_PACKSIZE];
  172. struct dns_packet *packet = (struct dns_packet *)packet_buff;
  173. struct dns_head head;
  174. int ret = 0;
  175. int encode_len = 0;
  176. memset(&head, 0, sizeof(head));
  177. head.id = request->id;
  178. head.qr = DNS_QR_ANSWER;
  179. head.opcode = DNS_OP_QUERY;
  180. head.rd = 1;
  181. head.ra = 0;
  182. head.aa = 0;
  183. head.tc = 0;
  184. head.rcode = request->rcode;
  185. ret = dns_packet_init(packet, DNS_PACKSIZE, &head);
  186. if (ret != 0) {
  187. return -1;
  188. }
  189. ret = dns_add_domain(packet, request->domain, request->qtype, DNS_C_IN);
  190. if (ret != 0) {
  191. return -1;
  192. }
  193. ret = _dns_add_rrs(packet, request);
  194. if (ret != 0) {
  195. return -1;
  196. }
  197. encode_len = dns_encode(inpacket, DNS_IN_PACKSIZE, packet);
  198. if (encode_len <= 0) {
  199. return -1;
  200. }
  201. return _dns_reply_inpacket(request, inpacket, encode_len);
  202. }
  203. int _dns_server_request_complete(struct dns_request *request)
  204. {
  205. int ret = -1;
  206. if (atomic_inc_return(&request->notified) != 1) {
  207. return 0;
  208. }
  209. if (request->passthrough) {
  210. return 0;
  211. }
  212. if (request->qtype == DNS_T_A) {
  213. tlog(TLOG_INFO, "result: %s, rcode: %d, %d.%d.%d.%d\n", request->domain, request->rcode, request->ipv4_addr[0], request->ipv4_addr[1],
  214. request->ipv4_addr[2], request->ipv4_addr[3]);
  215. } else if (request->qtype == DNS_T_AAAA) {
  216. tlog(TLOG_INFO, "result :%s, rcode: %d, %x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x", request->domain, request->rcode, request->ipv6_addr[0],
  217. request->ipv6_addr[1], request->ipv6_addr[2], request->ipv6_addr[3], request->ipv6_addr[4], request->ipv6_addr[5], request->ipv6_addr[6],
  218. request->ipv6_addr[7], request->ipv6_addr[8], request->ipv6_addr[9], request->ipv6_addr[10], request->ipv6_addr[11], request->ipv6_addr[12],
  219. request->ipv6_addr[13], request->ipv6_addr[14], request->ipv6_addr[15]);
  220. }
  221. _dns_reply(request);
  222. return ret;
  223. }
  224. void _dns_server_request_release(struct dns_request *request)
  225. {
  226. struct dns_ip_address *addr_map;
  227. struct hlist_node *tmp;
  228. int bucket = 0;
  229. int refcnt = atomic_dec_return(&request->refcnt);
  230. if (refcnt) {
  231. if (refcnt < 0) {
  232. tlog(TLOG_ERROR, "BUG: refcnt is %d", refcnt);
  233. abort();
  234. }
  235. return;
  236. }
  237. _dns_server_request_complete(request);
  238. hash_for_each_safe(request->ip_map, bucket, tmp, addr_map, node)
  239. {
  240. hash_del(&addr_map->node);
  241. free(addr_map);
  242. }
  243. memset(request, 0, sizeof(*request));
  244. free(request);
  245. }
  246. void _dns_server_request_get(struct dns_request *request)
  247. {
  248. atomic_inc(&request->refcnt);
  249. }
  250. void _dns_server_ping_result(struct ping_host_struct *ping_host, const char *host, FAST_PING_RESULT result, struct sockaddr *addr, socklen_t addr_len,
  251. int seqno, struct timeval *tv, void *userptr)
  252. {
  253. struct dns_request *request = userptr;
  254. int may_complete = 0;
  255. if (request == NULL) {
  256. return;
  257. }
  258. if (result == PING_RESULT_END) {
  259. _dns_server_request_release(request);
  260. return;
  261. }
  262. unsigned int rtt = tv->tv_sec * 10000 + tv->tv_usec / 100;
  263. switch (addr->sa_family) {
  264. case AF_INET: {
  265. struct sockaddr_in *addr_in;
  266. addr_in = (struct sockaddr_in *)addr;
  267. if (request->ttl_v4 > rtt) {
  268. request->ttl_v4 = rtt;
  269. request->has_ipv4 = 1;
  270. memcpy(request->ipv4_addr, &addr_in->sin_addr.s_addr, 4);
  271. }
  272. } break;
  273. case AF_INET6: {
  274. struct sockaddr_in6 *addr_in6;
  275. addr_in6 = (struct sockaddr_in6 *)addr;
  276. if (IN6_IS_ADDR_V4MAPPED(&addr_in6->sin6_addr)) {
  277. if (request->ttl_v4 > rtt) {
  278. request->ttl_v4 = rtt;
  279. request->has_ipv4 = 1;
  280. memcpy(request->ipv4_addr, addr_in6->sin6_addr.s6_addr + 12, 4);
  281. }
  282. } else {
  283. if (request->ttl_v6 > rtt) {
  284. request->ttl_v6 = rtt;
  285. request->has_ipv6 = 1;
  286. memcpy(request->ipv6_addr, addr_in6->sin6_addr.s6_addr, 16);
  287. }
  288. }
  289. } break;
  290. default:
  291. break;
  292. }
  293. if (result == PING_RESULT_RESPONSE) {
  294. tlog(TLOG_DEBUG, "from %15s: seq=%d time=%d\n", host, seqno, rtt);
  295. } else {
  296. tlog(TLOG_DEBUG, "from %15s: seq=%d timeout\n", host, seqno);
  297. }
  298. if (rtt < 100) {
  299. may_complete = 1;
  300. } else if (rtt < (get_tick_count() - request->send_tick) * 10) {
  301. may_complete = 1;
  302. }
  303. if (may_complete) {
  304. _dns_server_request_complete(request);
  305. }
  306. }
  307. int _dns_ip_address_check_add(struct dns_request *request, unsigned char *addr, dns_type_t addr_type)
  308. {
  309. int key = 0;
  310. struct dns_ip_address *addr_map = NULL;
  311. int addr_len = 0;
  312. if (addr_type == DNS_T_A) {
  313. addr_len = DNS_RR_A_LEN;
  314. } else if (addr_type == DNS_T_AAAA) {
  315. addr_len = DNS_RR_AAAA_LEN;
  316. } else {
  317. return -1;
  318. }
  319. key = jhash(addr, addr_len, 0);
  320. hash_for_each_possible(request->ip_map, addr_map, node, key)
  321. {
  322. if (addr_type == DNS_T_A) {
  323. if (memcmp(addr_map->ipv4_addr, addr, addr_len) == 0) {
  324. return -1;
  325. }
  326. } else if (addr_type == DNS_T_AAAA) {
  327. if (memcmp(addr_map->ipv6_addr, addr, addr_len) == 0) {
  328. return -1;
  329. }
  330. }
  331. }
  332. addr_map = malloc(sizeof(*addr_map));
  333. if (addr_map == NULL) {
  334. tlog(TLOG_ERROR, "malloc failed");
  335. return -1;
  336. }
  337. addr_map->addr_type = addr_type;
  338. memcpy(addr_map->addr, addr, addr_len);
  339. hash_add(request->ip_map, &addr_map->node, key);
  340. return 0;
  341. }
  342. static int _dns_server_process_answer(struct dns_request *request, char *domain, struct dns_packet *packet)
  343. {
  344. int ttl;
  345. char name[DNS_MAX_CNAME_LEN] = {0};
  346. char ip[DNS_MAX_CNAME_LEN] = {0};
  347. int rr_count;
  348. int i = 0;
  349. int j = 0;
  350. struct dns_rrs *rrs = NULL;
  351. if (packet->head.rcode != DNS_RC_NOERROR) {
  352. if (request->rcode == DNS_RC_SERVFAIL) {
  353. request->rcode = packet->head.rcode;
  354. }
  355. tlog(TLOG_DEBUG, "inquery failed, %s, rcode = %d, id = %d\n", domain, packet->head.rcode, packet->head.id);
  356. return -1;
  357. }
  358. request->rcode = packet->head.rcode;
  359. for (j = 1; j < DNS_RRS_END; j++) {
  360. rrs = dns_get_rrs_start(packet, j, &rr_count);
  361. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(packet, rrs)) {
  362. switch (rrs->type) {
  363. case DNS_T_A: {
  364. unsigned char addr[4];
  365. _dns_server_request_get(request);
  366. dns_get_A(rrs, name, DNS_MAX_CNAME_LEN, &ttl, addr);
  367. if (addr[0] == 127) {
  368. _dns_server_request_release(request);
  369. break;
  370. }
  371. if (request->has_ipv4 == 0) {
  372. memcpy(request->ipv4_addr, addr, DNS_RR_A_LEN);
  373. request->has_ipv4 = 1;
  374. }
  375. if (_dns_ip_address_check_add(request, addr, DNS_T_A) != 0) {
  376. _dns_server_request_release(request);
  377. break;
  378. }
  379. tlog(TLOG_DEBUG, "domain: %s TTL:%d IP: %d.%d.%d.%d", name, ttl, addr[0], addr[1], addr[2], addr[3]);
  380. sprintf(ip, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
  381. if (strncmp(name, domain, DNS_MAX_CNAME_LEN) == 0 || strncmp(request->alias, name, DNS_MAX_CNAME_LEN) == 0) {
  382. if (fast_ping_start(ip, 1, 0, 1000, _dns_server_ping_result, request) == NULL) {
  383. _dns_server_request_release(request);
  384. }
  385. }
  386. } break;
  387. case DNS_T_AAAA: {
  388. unsigned char addr[16];
  389. _dns_server_request_get(request);
  390. dns_get_AAAA(rrs, name, DNS_MAX_CNAME_LEN, &ttl, addr);
  391. if (request->has_ipv6 == 0) {
  392. memcpy(request->ipv6_addr, addr, DNS_RR_AAAA_LEN);
  393. request->has_ipv6 = 1;
  394. }
  395. if (_dns_ip_address_check_add(request, addr, DNS_T_AAAA) != 0) {
  396. _dns_server_request_release(request);
  397. break;
  398. }
  399. tlog(TLOG_DEBUG, "domain: %s TTL: %d IP: %x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x", name, ttl, addr[0], addr[1], addr[2], addr[3], addr[4],
  400. addr[5], addr[6], addr[7], addr[8], addr[9], addr[10], addr[11], addr[12], addr[13], addr[14], addr[15]);
  401. sprintf(name, "%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], addr[6], addr[7], addr[8],
  402. addr[9], addr[10], addr[11], addr[12], addr[13], addr[14], addr[15]);
  403. if (fast_ping_start(name, 1, 0, 1000, _dns_server_ping_result, request) == NULL) {
  404. _dns_server_request_release(request);
  405. }
  406. } break;
  407. case DNS_T_NS: {
  408. char cname[128];
  409. dns_get_CNAME(rrs, name, 128, &ttl, cname, 128);
  410. tlog(TLOG_DEBUG, "NS: %s %d : %s\n", name, ttl, cname);
  411. } break;
  412. case DNS_T_CNAME: {
  413. char cname[128];
  414. dns_get_CNAME(rrs, name, 128, &ttl, cname, 128);
  415. tlog(TLOG_DEBUG, "%s %d : %s\n", name, ttl, cname);
  416. strncpy(request->alias, cname, DNS_MAX_CNAME_LEN);
  417. request->has_cname = 1;
  418. } break;
  419. case DNS_T_SOA: {
  420. request->has_soa = 1;
  421. dns_get_SOA(rrs, name, 128, &ttl, &request->soa);
  422. tlog(TLOG_INFO, "SOA: mname: %s, rname: %s, serial: %d, refresh: %d, retry: %d, expire: %d, minimum: %d", request->soa.mname,
  423. request->soa.rname, request->soa.serial, request->soa.refresh, request->soa.retry, request->soa.expire, request->soa.minimum);
  424. }
  425. default:
  426. tlog(TLOG_INFO, "%s, qtype: %d", name, rrs->type);
  427. break;
  428. }
  429. }
  430. }
  431. return 0;
  432. }
  433. static int dns_server_resolve_callback(char *domain, dns_result_type rtype, struct dns_packet *packet, unsigned char *inpacket, int inpacket_len,
  434. void *user_ptr)
  435. {
  436. struct dns_request *request = user_ptr;
  437. if (request == NULL) {
  438. return -1;
  439. }
  440. if (rtype == DNS_QUERY_RESULT) {
  441. if (request->passthrough) {
  442. _dns_reply_inpacket(request, inpacket, inpacket_len);
  443. return -1;
  444. }
  445. _dns_server_process_answer(request, domain, packet);
  446. return 0;
  447. } else if (rtype == DNS_QUERY_ERR) {
  448. tlog(TLOG_ERROR, "request faield, %s", domain);
  449. return -1;
  450. } else {
  451. _dns_server_request_release(request);
  452. }
  453. return 0;
  454. }
  455. static int _dns_server_process_ptr(struct dns_request *request, struct dns_packet *packet)
  456. {
  457. struct ifaddrs *ifaddr = NULL;
  458. struct ifaddrs *ifa = NULL;
  459. unsigned char *addr;
  460. char reverse_addr[128] = {0};
  461. int found = 0;
  462. if (getifaddrs(&ifaddr) == -1) {
  463. return -1;
  464. }
  465. for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
  466. if (ifa->ifa_addr == NULL) {
  467. continue;
  468. }
  469. switch (ifa->ifa_addr->sa_family) {
  470. case AF_INET: {
  471. struct sockaddr_in *addr_in;
  472. addr_in = (struct sockaddr_in *)ifa->ifa_addr;
  473. addr = (unsigned char *)&(addr_in->sin_addr.s_addr);
  474. snprintf(reverse_addr, sizeof(reverse_addr), "%d.%d.%d.%d.in-addr.arpa", addr[3], addr[2], addr[1], addr[0]);
  475. } break;
  476. case AF_INET6: {
  477. struct sockaddr_in6 *addr_in6;
  478. addr_in6 = (struct sockaddr_in6 *)ifa->ifa_addr;
  479. if (IN6_IS_ADDR_V4MAPPED(&addr_in6->sin6_addr)) {
  480. addr = addr_in6->sin6_addr.s6_addr + 12;
  481. snprintf(reverse_addr, sizeof(reverse_addr), "%d.%d.%d.%d.in-addr.arpa", addr[3], addr[2], addr[1], addr[0]);
  482. } else {
  483. addr = addr_in6->sin6_addr.s6_addr;
  484. snprintf(reverse_addr, sizeof(reverse_addr),
  485. "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.ip6.arpa", addr[15] & 0xF,
  486. (addr[15] >> 4) & 0xF, addr[14] & 0xF, (addr[14] >> 4) & 0xF, addr[13] & 0xF, (addr[13] >> 4) & 0xF, addr[12] & 0xF,
  487. (addr[12] >> 4) & 0xF, addr[11] & 0xF, (addr[11] >> 4) & 0xF, addr[10] & 0xF, (addr[10] >> 4) & 0xF, addr[9] & 0xF,
  488. (addr[9] >> 4) & 0xF, addr[8] & 0xF, (addr[8] >> 4) & 0xF, addr[7] & 0xF, (addr[7] >> 4) & 0xF, addr[6] & 0xF, (addr[6] >> 4) & 0xF,
  489. addr[5] & 0xF, (addr[5] >> 4) & 0xF, addr[4] & 0xF, (addr[4] >> 4) & 0xF, addr[3] & 0xF, (addr[3] >> 4) & 0xF, addr[2] & 0xF,
  490. (addr[2] >> 4) & 0xF, addr[1] & 0xF, (addr[1] >> 4) & 0xF, addr[0] & 0xF, (addr[0] >> 4) & 0xF);
  491. }
  492. } break;
  493. default:
  494. continue;
  495. break;
  496. }
  497. if (strstr(request->domain, reverse_addr) != NULL) {
  498. found = 1;
  499. break;
  500. }
  501. }
  502. if (found == 0) {
  503. goto errout;
  504. }
  505. request->rcode = DNS_RC_NOERROR;
  506. request->has_ptr = 1;
  507. _dns_reply(request);
  508. freeifaddrs(ifaddr);
  509. return 0;
  510. errout:
  511. if (ifaddr) {
  512. freeifaddrs(ifaddr);
  513. }
  514. return -1;
  515. }
  516. static int _dns_server_recv(unsigned char *inpacket, int inpacket_len, struct sockaddr_storage *from, socklen_t from_len)
  517. {
  518. int decode_len;
  519. int ret = -1;
  520. unsigned char packet_buff[DNS_PACKSIZE];
  521. char name[DNS_MAX_CNAME_LEN];
  522. struct dns_packet *packet = (struct dns_packet *)packet_buff;
  523. struct dns_request *request = NULL;
  524. struct dns_rrs *rrs;
  525. int rr_count = 0;
  526. int i = 0;
  527. int qclass;
  528. int qtype;
  529. decode_len = dns_decode(packet, DNS_PACKSIZE, inpacket, inpacket_len);
  530. if (decode_len < 0) {
  531. tlog(TLOG_ERROR, "decode failed.\n");
  532. goto errout;
  533. }
  534. if (packet->head.qr != DNS_QR_QUERY) {
  535. goto errout;
  536. }
  537. request = malloc(sizeof(*request));
  538. memset(request, 0, sizeof(*request));
  539. request->ttl_v4 = -1;
  540. request->ttl_v6 = -1;
  541. request->rcode = DNS_RC_SERVFAIL;
  542. if (request == NULL) {
  543. tlog(TLOG_ERROR, "malloc failed.\n");
  544. goto errout;
  545. }
  546. if (_dns_recv_addr(request, from, from_len) != 0) {
  547. goto errout;
  548. }
  549. request->id = packet->head.id;
  550. memcpy(&request->head, &packet->head, sizeof(struct dns_head));
  551. hash_init(request->ip_map);
  552. rrs = dns_get_rrs_start(packet, DNS_RRS_QD, &rr_count);
  553. if (rr_count > 1) {
  554. goto errout;
  555. }
  556. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(packet, rrs)) {
  557. ret = dns_get_domain(rrs, request->domain, sizeof(request->domain), &qtype, &qclass);
  558. if (ret != 0) {
  559. goto errout;
  560. }
  561. request->qtype = qtype;
  562. }
  563. switch (qtype) {
  564. case DNS_T_PTR:
  565. ret = _dns_server_process_ptr(request, packet);
  566. if (ret == 0) {
  567. free(request);
  568. return ret;
  569. } else {
  570. request->passthrough = 1;
  571. }
  572. break;
  573. case DNS_T_A:
  574. break;
  575. case DNS_T_AAAA:
  576. break;
  577. default:
  578. tlog(TLOG_DEBUG, "unsupport qtype: %d, domain: %s", qtype, request->domain);
  579. request->passthrough = 1;
  580. break;
  581. }
  582. tlog(TLOG_INFO, "query server %s from %s, qtype = %d\n", request->domain, gethost_by_addr(name, (struct sockaddr *)from, from_len), qtype);
  583. _dns_server_request_get(request);
  584. request->send_tick = get_tick_count();
  585. dns_client_query(request->domain, qtype, dns_server_resolve_callback, request);
  586. return 0;
  587. errout:
  588. if (request) {
  589. ret = _dns_server_forward_request(inpacket, inpacket_len);
  590. free(request);
  591. }
  592. return ret;
  593. }
  594. static int _dns_server_process(unsigned long now)
  595. {
  596. int len;
  597. unsigned char inpacket[DNS_IN_PACKSIZE];
  598. struct sockaddr_storage from;
  599. socklen_t from_len = sizeof(from);
  600. len = recvfrom(server.fd, inpacket, sizeof(inpacket), 0, (struct sockaddr *)&from, (socklen_t *)&from_len);
  601. if (len < 0) {
  602. tlog(TLOG_ERROR, "recvfrom failed, %s\n", strerror(errno));
  603. return -1;
  604. }
  605. return _dns_server_recv(inpacket, len, &from, from_len);
  606. }
  607. int dns_server_run(void)
  608. {
  609. struct epoll_event events[DNS_MAX_EVENTS + 1];
  610. int num;
  611. int i;
  612. unsigned long now = {0};
  613. int sleep = 1000;
  614. int sleep_time = 0;
  615. unsigned long expect_time = 0;
  616. sleep_time = sleep;
  617. now = get_tick_count() - sleep;
  618. expect_time = now + sleep;
  619. while (server.run) {
  620. now = get_tick_count();
  621. if (now >= expect_time) {
  622. _dns_server_period_run();
  623. sleep_time = sleep - (now - expect_time);
  624. if (sleep_time < 0) {
  625. sleep_time = 0;
  626. }
  627. expect_time += sleep;
  628. }
  629. num = epoll_wait(server.epoll_fd, events, DNS_MAX_EVENTS, sleep_time);
  630. if (num < 0) {
  631. usleep(100000);
  632. continue;
  633. }
  634. if (num == 0) {
  635. continue;
  636. }
  637. for (i = 0; i < num; i++) {
  638. struct epoll_event *event = &events[i];
  639. if (event->data.fd != server.fd) {
  640. tlog(TLOG_ERROR, "invalid fd\n");
  641. continue;
  642. }
  643. if (_dns_server_process(now) != 0) {
  644. tlog(TLOG_ERROR, "dns server process failed.");
  645. }
  646. }
  647. }
  648. close(server.epoll_fd);
  649. server.epoll_fd = -1;
  650. return 0;
  651. }
  652. static struct addrinfo *_dns_server_getaddr(const char *host, const char *port, int type, int protocol)
  653. {
  654. struct addrinfo hints;
  655. struct addrinfo *result = NULL;
  656. memset(&hints, 0, sizeof(hints));
  657. hints.ai_family = AF_UNSPEC;
  658. hints.ai_socktype = type;
  659. hints.ai_protocol = protocol;
  660. hints.ai_flags = AI_PASSIVE;
  661. if (getaddrinfo(host, port, &hints, &result) != 0) {
  662. tlog(TLOG_ERROR, "get addr info failed. %s\n", strerror(errno));
  663. goto errout;
  664. }
  665. return result;
  666. errout:
  667. if (result) {
  668. freeaddrinfo(result);
  669. }
  670. return NULL;
  671. }
  672. int dns_server_start(void)
  673. {
  674. struct epoll_event event;
  675. event.events = EPOLLIN;
  676. event.data.fd = server.fd;
  677. if (epoll_ctl(server.epoll_fd, EPOLL_CTL_ADD, server.fd, &event) != 0) {
  678. tlog(TLOG_ERROR, "epoll ctl failed.");
  679. return -1;
  680. }
  681. return 0;
  682. }
  683. int dns_server_socket(void)
  684. {
  685. int fd = -1;
  686. struct addrinfo *gai = NULL;
  687. char port_str[8];
  688. snprintf(port_str, sizeof(port_str), "%d", dns_conf_port);
  689. gai = _dns_server_getaddr(NULL, port_str, SOCK_DGRAM, 0);
  690. if (gai == NULL) {
  691. tlog(TLOG_ERROR, "get address failed.\n");
  692. goto errout;
  693. }
  694. fd = socket(gai->ai_family, gai->ai_socktype, gai->ai_protocol);
  695. if (fd < 0) {
  696. tlog(TLOG_ERROR, "create socket failed.\n");
  697. goto errout;
  698. }
  699. if (bind(fd, gai->ai_addr, gai->ai_addrlen) != 0) {
  700. tlog(TLOG_ERROR, "bind failed.\n");
  701. goto errout;
  702. }
  703. server.fd = fd;
  704. freeaddrinfo(gai);
  705. return fd;
  706. errout:
  707. if (fd > 0) {
  708. close(fd);
  709. }
  710. if (gai) {
  711. freeaddrinfo(gai);
  712. }
  713. return -1;
  714. }
  715. int dns_server_init(void)
  716. {
  717. pthread_attr_t attr;
  718. int epollfd = -1;
  719. int fd = -1;
  720. if (server.epoll_fd > 0) {
  721. return -1;
  722. }
  723. memset(&server, 0, sizeof(server));
  724. pthread_attr_init(&attr);
  725. epollfd = epoll_create1(EPOLL_CLOEXEC);
  726. if (epollfd < 0) {
  727. tlog(TLOG_ERROR, "create epoll failed, %s\n", strerror(errno));
  728. goto errout;
  729. }
  730. fd = dns_server_socket();
  731. if (fd < 0) {
  732. tlog(TLOG_ERROR, "create server socket failed.\n");
  733. goto errout;
  734. }
  735. pthread_mutex_init(&server.map_lock, 0);
  736. hash_init(server.hostmap);
  737. server.epoll_fd = epollfd;
  738. server.fd = fd;
  739. server.run = 1;
  740. if (dns_server_start() != 0) {
  741. tlog(TLOG_ERROR, "start service failed.\n");
  742. goto errout;
  743. }
  744. return 0;
  745. errout:
  746. server.run = 0;
  747. if (fd > 0) {
  748. close(fd);
  749. }
  750. if (epollfd) {
  751. close(epollfd);
  752. }
  753. pthread_mutex_destroy(&server.map_lock);
  754. return -1;
  755. }
  756. void dns_server_exit(void)
  757. {
  758. server.run = 0;
  759. if (server.fd > 0) {
  760. close(server.fd);
  761. server.fd = -1;
  762. }
  763. pthread_mutex_destroy(&server.map_lock);
  764. }