test-edns.cc 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. /*************************************************************************
  2. *
  3. * Copyright (C) 2018-2024 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 "client.h"
  19. #include "dns.h"
  20. #include "include/utils.h"
  21. #include "server.h"
  22. #include "util.h"
  23. #include "gtest/gtest.h"
  24. #include <fstream>
  25. class EDNS : public ::testing::Test
  26. {
  27. protected:
  28. virtual void SetUp() {}
  29. virtual void TearDown() {}
  30. };
  31. TEST_F(EDNS, client)
  32. {
  33. smartdns::MockServer server_upstream;
  34. smartdns::Server server;
  35. struct dns_opt_ecs ecs;
  36. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  37. int rr_count = 0;
  38. int i = 0;
  39. int ret = 0;
  40. struct dns_rrs *rrs = NULL;
  41. rrs = dns_get_rrs_start(request->packet, DNS_RRS_OPT, &rr_count);
  42. if (rr_count > 0) {
  43. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(request->packet, rrs)) {
  44. switch (rrs->type) {
  45. case DNS_OPT_T_ECS: {
  46. memset(&ecs, 0, sizeof(ecs));
  47. ret = dns_get_OPT_ECS(rrs, &ecs);
  48. if (ret != 0) {
  49. continue;
  50. }
  51. dns_add_OPT_ECS(request->response_packet, &ecs);
  52. } break;
  53. default:
  54. break;
  55. }
  56. }
  57. }
  58. if (request->qtype == DNS_T_A) {
  59. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 700);
  60. return smartdns::SERVER_REQUEST_OK;
  61. } else if (request->qtype == DNS_T_AAAA) {
  62. smartdns::MockServer::AddIP(request, request->domain.c_str(), "64:ff9b::102:304", 700);
  63. return smartdns::SERVER_REQUEST_OK;
  64. }
  65. return smartdns::SERVER_REQUEST_SOA;
  66. });
  67. server.Start(R"""(bind [::]:60053
  68. server 127.0.0.1:61053
  69. speed-check-mode none
  70. )""");
  71. smartdns::Client client;
  72. ASSERT_TRUE(client.Query("a.com A +subnet=2.2.2.2/24", 60053));
  73. std::cout << client.GetResult() << std::endl;
  74. ASSERT_EQ(client.GetAnswerNum(), 1);
  75. EXPECT_EQ(client.GetStatus(), "NOERROR");
  76. ASSERT_EQ(client.GetOpt().size(), 2);
  77. EXPECT_EQ(client.GetOpt()[1], "CLIENT-SUBNET: 2.2.2.0/24/0");
  78. EXPECT_EQ(ecs.family, 1);
  79. EXPECT_EQ(ecs.source_prefix, 24);
  80. EXPECT_EQ(ecs.scope_prefix, 0);
  81. unsigned char edns_addr[4] = {2, 2, 2, 0};
  82. EXPECT_EQ(memcmp(ecs.addr, &edns_addr, 4), 0);
  83. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  84. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 700);
  85. EXPECT_EQ(client.GetAnswer()[0].GetType(), "A");
  86. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  87. }
  88. TEST_F(EDNS, server)
  89. {
  90. smartdns::MockServer server_upstream;
  91. smartdns::Server server;
  92. struct dns_opt_ecs ecs;
  93. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  94. int rr_count = 0;
  95. int i = 0;
  96. int ret = 0;
  97. struct dns_rrs *rrs = NULL;
  98. rrs = dns_get_rrs_start(request->packet, DNS_RRS_OPT, &rr_count);
  99. if (rr_count > 0) {
  100. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(request->packet, rrs)) {
  101. switch (rrs->type) {
  102. case DNS_OPT_T_ECS: {
  103. memset(&ecs, 0, sizeof(ecs));
  104. ret = dns_get_OPT_ECS(rrs, &ecs);
  105. if (ret != 0) {
  106. continue;
  107. }
  108. dns_add_OPT_ECS(request->response_packet, &ecs);
  109. } break;
  110. default:
  111. break;
  112. }
  113. }
  114. }
  115. if (request->qtype == DNS_T_A) {
  116. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 700);
  117. return smartdns::SERVER_REQUEST_OK;
  118. } else if (request->qtype == DNS_T_AAAA) {
  119. smartdns::MockServer::AddIP(request, request->domain.c_str(), "64:ff9b::102:304", 700);
  120. return smartdns::SERVER_REQUEST_OK;
  121. }
  122. return smartdns::SERVER_REQUEST_SOA;
  123. });
  124. server.Start(R"""(bind [::]:60053
  125. server 127.0.0.1:61053 -subnet=2.2.2.0/24
  126. speed-check-mode none
  127. )""");
  128. smartdns::Client client;
  129. ASSERT_TRUE(client.Query("a.com A", 60053));
  130. std::cout << client.GetResult() << std::endl;
  131. ASSERT_EQ(client.GetAnswerNum(), 1);
  132. EXPECT_EQ(client.GetStatus(), "NOERROR");
  133. EXPECT_EQ(ecs.family, 1);
  134. EXPECT_EQ(ecs.source_prefix, 24);
  135. EXPECT_EQ(ecs.scope_prefix, 0);
  136. unsigned char edns_addr[4] = {2, 2, 2, 0};
  137. EXPECT_EQ(memcmp(ecs.addr, &edns_addr, 4), 0);
  138. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  139. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 700);
  140. EXPECT_EQ(client.GetAnswer()[0].GetType(), "A");
  141. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  142. }
  143. TEST_F(EDNS, server_v6)
  144. {
  145. smartdns::MockServer server_upstream;
  146. smartdns::Server server;
  147. struct dns_opt_ecs ecs;
  148. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  149. int rr_count = 0;
  150. int i = 0;
  151. int ret = 0;
  152. struct dns_rrs *rrs = NULL;
  153. rrs = dns_get_rrs_start(request->packet, DNS_RRS_OPT, &rr_count);
  154. if (rr_count > 0) {
  155. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(request->packet, rrs)) {
  156. switch (rrs->type) {
  157. case DNS_OPT_T_ECS: {
  158. memset(&ecs, 0, sizeof(ecs));
  159. ret = dns_get_OPT_ECS(rrs, &ecs);
  160. if (ret != 0) {
  161. continue;
  162. }
  163. dns_add_OPT_ECS(request->response_packet, &ecs);
  164. } break;
  165. default:
  166. break;
  167. }
  168. }
  169. }
  170. if (request->qtype == DNS_T_A) {
  171. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 700);
  172. return smartdns::SERVER_REQUEST_OK;
  173. } else if (request->qtype == DNS_T_AAAA) {
  174. smartdns::MockServer::AddIP(request, request->domain.c_str(), "64:ff9b::102:304", 700);
  175. return smartdns::SERVER_REQUEST_OK;
  176. }
  177. return smartdns::SERVER_REQUEST_SOA;
  178. });
  179. server.Start(R"""(bind [::]:60053
  180. server 127.0.0.1:61053 -subnet=64:ff9b::/96
  181. speed-check-mode none
  182. )""");
  183. smartdns::Client client;
  184. ASSERT_TRUE(client.Query("a.com A", 60053));
  185. std::cout << client.GetResult() << std::endl;
  186. ASSERT_EQ(client.GetAnswerNum(), 1);
  187. EXPECT_EQ(client.GetStatus(), "NOERROR");
  188. EXPECT_EQ(ecs.family, 2);
  189. EXPECT_EQ(ecs.source_prefix, 96);
  190. EXPECT_EQ(ecs.scope_prefix, 0);
  191. unsigned char edns_addr[16] = {00, 0x64, 0xff, 0x9b, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  192. EXPECT_EQ(memcmp(ecs.addr, &edns_addr, 16), 0);
  193. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  194. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 700);
  195. EXPECT_EQ(client.GetAnswer()[0].GetType(), "A");
  196. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  197. }
  198. TEST_F(EDNS, edns_client_subnet)
  199. {
  200. smartdns::MockServer server_upstream;
  201. smartdns::Server server;
  202. struct dns_opt_ecs ecs;
  203. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  204. int rr_count = 0;
  205. int i = 0;
  206. int ret = 0;
  207. struct dns_rrs *rrs = NULL;
  208. rrs = dns_get_rrs_start(request->packet, DNS_RRS_OPT, &rr_count);
  209. if (rr_count > 0) {
  210. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(request->packet, rrs)) {
  211. switch (rrs->type) {
  212. case DNS_OPT_T_ECS: {
  213. memset(&ecs, 0, sizeof(ecs));
  214. ret = dns_get_OPT_ECS(rrs, &ecs);
  215. if (ret != 0) {
  216. continue;
  217. }
  218. dns_add_OPT_ECS(request->response_packet, &ecs);
  219. } break;
  220. default:
  221. break;
  222. }
  223. }
  224. }
  225. if (request->qtype == DNS_T_A) {
  226. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 700);
  227. return smartdns::SERVER_REQUEST_OK;
  228. } else if (request->qtype == DNS_T_AAAA) {
  229. smartdns::MockServer::AddIP(request, request->domain.c_str(), "64:ff9b::102:304", 700);
  230. return smartdns::SERVER_REQUEST_OK;
  231. }
  232. return smartdns::SERVER_REQUEST_SOA;
  233. });
  234. server.Start(R"""(bind [::]:60053
  235. server 127.0.0.1:61053
  236. speed-check-mode none
  237. edns-client-subnet 2.2.2.2/24
  238. )""");
  239. smartdns::Client client;
  240. ASSERT_TRUE(client.Query("a.com A", 60053));
  241. std::cout << client.GetResult() << std::endl;
  242. ASSERT_EQ(client.GetAnswerNum(), 1);
  243. EXPECT_EQ(client.GetStatus(), "NOERROR");
  244. EXPECT_EQ(ecs.family, 1);
  245. EXPECT_EQ(ecs.source_prefix, 24);
  246. EXPECT_EQ(ecs.scope_prefix, 0);
  247. unsigned char edns_addr[4] = {2, 2, 2, 0};
  248. EXPECT_EQ(memcmp(ecs.addr, &edns_addr, 4), 0);
  249. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  250. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 700);
  251. EXPECT_EQ(client.GetAnswer()[0].GetType(), "A");
  252. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  253. }
  254. TEST_F(EDNS, edns_client_subnet_v6)
  255. {
  256. smartdns::MockServer server_upstream;
  257. smartdns::Server server;
  258. struct dns_opt_ecs ecs;
  259. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  260. int rr_count = 0;
  261. int i = 0;
  262. int ret = 0;
  263. struct dns_rrs *rrs = NULL;
  264. rrs = dns_get_rrs_start(request->packet, DNS_RRS_OPT, &rr_count);
  265. if (rr_count > 0) {
  266. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(request->packet, rrs)) {
  267. switch (rrs->type) {
  268. case DNS_OPT_T_ECS: {
  269. memset(&ecs, 0, sizeof(ecs));
  270. ret = dns_get_OPT_ECS(rrs, &ecs);
  271. if (ret != 0) {
  272. continue;
  273. }
  274. dns_add_OPT_ECS(request->response_packet, &ecs);
  275. } break;
  276. default:
  277. break;
  278. }
  279. }
  280. }
  281. if (request->qtype == DNS_T_A) {
  282. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 700);
  283. return smartdns::SERVER_REQUEST_OK;
  284. } else if (request->qtype == DNS_T_AAAA) {
  285. smartdns::MockServer::AddIP(request, request->domain.c_str(), "64:ff9b::102:304", 700);
  286. return smartdns::SERVER_REQUEST_OK;
  287. }
  288. return smartdns::SERVER_REQUEST_SOA;
  289. });
  290. server.Start(R"""(bind [::]:60053
  291. server 127.0.0.1:61053
  292. speed-check-mode none
  293. edns-client-subnet 64:ff9b::/96
  294. )""");
  295. smartdns::Client client;
  296. ASSERT_TRUE(client.Query("a.com A", 60053));
  297. std::cout << client.GetResult() << std::endl;
  298. ASSERT_EQ(client.GetAnswerNum(), 1);
  299. EXPECT_EQ(client.GetStatus(), "NOERROR");
  300. EXPECT_EQ(ecs.family, 2);
  301. EXPECT_EQ(ecs.source_prefix, 96);
  302. EXPECT_EQ(ecs.scope_prefix, 0);
  303. unsigned char edns_addr[16] = {00, 0x64, 0xff, 0x9b, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  304. EXPECT_EQ(memcmp(ecs.addr, &edns_addr, 16), 0);
  305. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  306. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 700);
  307. EXPECT_EQ(client.GetAnswer()[0].GetType(), "A");
  308. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  309. }