proxy.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080
  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. #ifndef _GNU_SOURCE
  19. #define _GNU_SOURCE
  20. #endif
  21. #include "smartdns/proxy.h"
  22. #include "smartdns/dns_conf.h"
  23. #include "smartdns/http_parse.h"
  24. #include "smartdns/lib/hashtable.h"
  25. #include "smartdns/lib/list.h"
  26. #include "smartdns/tlog.h"
  27. #include "smartdns/util.h"
  28. #include <arpa/inet.h>
  29. #include <errno.h>
  30. #include <pthread.h>
  31. #include <stdio.h>
  32. #include <sys/epoll.h>
  33. #define PROXY_SOCKS5_VERSION 0x05
  34. #define PROXY_SOCKS5_NO_AUTH 0x00
  35. #define PROXY_SOCKS5_AUTH_USER_PASS 0x02
  36. #define PROXY_SOCKS5_AUTH_NONE 0xFF
  37. #define PROXY_SOCKS5_TYPE_IPV4 0x01
  38. #define PROXY_SOCKS5_TYPE_DOMAIN 0x03
  39. #define PROXY_SOCKS5_TYPE_IPV6 0x04
  40. #define PROXY_SOCKS5_CONNECT_TCP 0x01
  41. #define PROXY_SOCKS5_CONNECT_UDP 0x03
  42. #define PROXY_MAX_EVENTS 64
  43. #define PROXY_BUFFER_SIZE (1024 * 4)
  44. #define PROXY_MAX_HOSTNAME_LEN 256
  45. typedef enum PROXY_CONN_STATE {
  46. PROXY_CONN_INIT = 0,
  47. PROXY_CONN_INIT_ACK = 1,
  48. PROXY_CONN_AUTH = 2,
  49. PROXY_CONN_AUTH_ACK = 3,
  50. PROXY_CONN_CONNECTING = 4,
  51. PROXY_CONN_CONNECTED = 5,
  52. } PROXY_CONN_STATE;
  53. struct proxy_conn_buffer {
  54. int len;
  55. uint8_t buffer[PROXY_BUFFER_SIZE];
  56. };
  57. struct proxy_conn {
  58. proxy_type_t type;
  59. PROXY_CONN_STATE state;
  60. char host[DNS_MAX_CNAME_LEN];
  61. unsigned short port;
  62. int fd;
  63. int udp_fd;
  64. int buffer_len;
  65. int is_udp;
  66. int non_block;
  67. struct sockaddr_storage udp_dest_addr;
  68. socklen_t udp_dest_addrlen;
  69. struct proxy_conn_buffer buffer;
  70. struct proxy_server_info *server_info;
  71. };
  72. /* upstream server groups */
  73. struct proxy_server_info {
  74. struct hlist_node node;
  75. char proxy_name[PROXY_NAME_LEN];
  76. struct sockaddr_storage server_addr;
  77. socklen_t server_addrlen;
  78. struct proxy_info info;
  79. };
  80. struct proxy_struct {
  81. int run;
  82. int epoll_fd;
  83. pthread_t tid;
  84. pthread_mutex_t proxy_lock;
  85. DECLARE_HASHTABLE(proxy_server, 4);
  86. };
  87. static struct proxy_struct proxy;
  88. static int is_proxy_init;
  89. static const char *proxy_socks5_status_code[] = {
  90. "success",
  91. "general SOCKS server failure",
  92. "connection not allowed by ruleset",
  93. "Network unreachable",
  94. "Host unreachable",
  95. "Connection refused",
  96. "TTL expired",
  97. "Command not supported",
  98. "Address type not supported",
  99. };
  100. /* get server group by name */
  101. static struct proxy_server_info *_proxy_get_server_info(const char *proxy_name)
  102. {
  103. unsigned long key;
  104. struct proxy_server_info *server_info = NULL;
  105. struct hlist_node *tmp = NULL;
  106. if (proxy_name == NULL) {
  107. return NULL;
  108. }
  109. key = hash_string(proxy_name);
  110. hash_for_each_possible_safe(proxy.proxy_server, server_info, tmp, node, key)
  111. {
  112. if (strncmp(server_info->proxy_name, proxy_name, DNS_GROUP_NAME_LEN) != 0) {
  113. continue;
  114. }
  115. return server_info;
  116. }
  117. return NULL;
  118. }
  119. static struct addrinfo *_proxy_getaddr(const char *host, int port, int type, int protocol)
  120. {
  121. struct addrinfo hints;
  122. struct addrinfo *result = NULL;
  123. int ret = 0;
  124. char port_str[32];
  125. snprintf(port_str, sizeof(port_str), "%d", port);
  126. memset(&hints, 0, sizeof(hints));
  127. hints.ai_family = AF_UNSPEC;
  128. hints.ai_socktype = type;
  129. hints.ai_protocol = protocol;
  130. ret = getaddrinfo(host, port_str, &hints, &result);
  131. if (ret != 0) {
  132. tlog(TLOG_ERROR, "get addr info failed. %s\n", gai_strerror(ret));
  133. tlog(TLOG_ERROR, "host: %s, port: %d, type: %d, protocol: %d", host, port, type, protocol);
  134. goto errout;
  135. }
  136. return result;
  137. errout:
  138. if (result) {
  139. freeaddrinfo(result);
  140. }
  141. return NULL;
  142. }
  143. int proxy_add(const char *proxy_name, struct proxy_info *info)
  144. {
  145. unsigned long key;
  146. char ip_str[PROXY_MAX_IPLEN];
  147. int port = 0;
  148. struct addrinfo *gai = NULL;
  149. struct proxy_server_info *server_info = _proxy_get_server_info(proxy_name);
  150. if (server_info) {
  151. return -1;
  152. }
  153. server_info = malloc(sizeof(*server_info));
  154. if (server_info == NULL) {
  155. goto errout;
  156. }
  157. memset(server_info, 0, sizeof(*server_info));
  158. memcpy(&server_info->info, info, sizeof(struct proxy_info));
  159. if (parse_ip(info->server, ip_str, &port) != 0) {
  160. goto errout;
  161. }
  162. port = info->port;
  163. gai = _proxy_getaddr(info->server, port, SOCK_STREAM, 0);
  164. if (gai == NULL) {
  165. goto errout;
  166. }
  167. server_info->server_addrlen = gai->ai_addrlen;
  168. memcpy(&server_info->server_addr, gai->ai_addr, gai->ai_addrlen);
  169. safe_strncpy(server_info->proxy_name, proxy_name, PROXY_NAME_LEN);
  170. key = hash_string(server_info->proxy_name);
  171. hash_add(proxy.proxy_server, &server_info->node, key);
  172. freeaddrinfo(gai);
  173. return 0;
  174. errout:
  175. if (server_info) {
  176. free(server_info);
  177. server_info = NULL;
  178. }
  179. if (gai) {
  180. freeaddrinfo(gai);
  181. }
  182. return -1;
  183. }
  184. static int _proxy_remove(struct proxy_server_info *server_info)
  185. {
  186. hash_del(&server_info->node);
  187. free(server_info);
  188. return 0;
  189. }
  190. int proxy_remove(const char *proxy_name)
  191. {
  192. struct proxy_server_info *server_info = _proxy_get_server_info(proxy_name);
  193. if (server_info == NULL) {
  194. return 0;
  195. }
  196. _proxy_remove(server_info);
  197. return 0;
  198. }
  199. static void _proxy_remove_all(void)
  200. {
  201. struct proxy_server_info *server_info = NULL;
  202. struct hlist_node *tmp = NULL;
  203. unsigned int i = 0;
  204. hash_for_each_safe(proxy.proxy_server, i, tmp, server_info, node)
  205. {
  206. _proxy_remove(server_info);
  207. }
  208. }
  209. struct proxy_conn *proxy_conn_new(const char *proxy_name, const char *host, int port, int is_udp, int non_block)
  210. {
  211. struct proxy_conn *proxy_conn = NULL;
  212. struct proxy_server_info *server_info = NULL;
  213. struct addrinfo *gai = NULL;
  214. int fd = -1;
  215. server_info = _proxy_get_server_info(proxy_name);
  216. if (server_info == NULL) {
  217. goto errout;
  218. }
  219. if (is_udp == 1 && server_info->info.type != PROXY_SOCKS5) {
  220. tlog(TLOG_WARN, "only socks5 support udp");
  221. goto errout;
  222. }
  223. fd = socket(server_info->server_addr.ss_family, SOCK_STREAM | SOCK_CLOEXEC, 0);
  224. if (fd < 0) {
  225. goto errout;
  226. }
  227. proxy_conn = malloc(sizeof(*proxy_conn));
  228. if (proxy_conn == NULL) {
  229. goto errout;
  230. }
  231. memset(proxy_conn, 0, sizeof(*proxy_conn));
  232. safe_strncpy(proxy_conn->host, host, DNS_MAX_CNAME_LEN);
  233. proxy_conn->port = port;
  234. proxy_conn->type = server_info->info.type;
  235. proxy_conn->state = PROXY_CONN_INIT;
  236. proxy_conn->server_info = server_info;
  237. proxy_conn->fd = fd;
  238. proxy_conn->udp_fd = -1;
  239. proxy_conn->is_udp = is_udp;
  240. proxy_conn->non_block = non_block;
  241. if (non_block) {
  242. set_fd_nonblock(fd, 1);
  243. }
  244. return proxy_conn;
  245. errout:
  246. if (proxy_conn) {
  247. free(proxy_conn);
  248. proxy_conn = NULL;
  249. }
  250. if (fd >= 0) {
  251. close(fd);
  252. }
  253. if (gai) {
  254. freeaddrinfo(gai);
  255. }
  256. return NULL;
  257. }
  258. void proxy_conn_free(struct proxy_conn *proxy_conn)
  259. {
  260. if (proxy_conn == NULL) {
  261. return;
  262. }
  263. if (proxy_conn->fd >= 0) {
  264. close(proxy_conn->fd);
  265. }
  266. if (proxy_conn->udp_fd >= 0) {
  267. close(proxy_conn->udp_fd);
  268. }
  269. free(proxy_conn);
  270. }
  271. int proxy_conn_connect(struct proxy_conn *proxy_conn)
  272. {
  273. if (proxy_conn == NULL) {
  274. return -1;
  275. }
  276. return connect(proxy_conn->fd, (struct sockaddr *)&proxy_conn->server_info->server_addr,
  277. proxy_conn->server_info->server_addrlen);
  278. }
  279. static int _proxy_handshake_socks5_create_udp_fd(struct proxy_conn *proxy_conn)
  280. {
  281. int ret = 0;
  282. char *gai_host = NULL;
  283. int udp_fd = -1;
  284. struct addrinfo *gai = NULL;
  285. switch (proxy_conn->udp_dest_addr.ss_family) {
  286. case AF_INET:
  287. gai_host = "0.0.0.0";
  288. break;
  289. case AF_INET6:
  290. gai_host = "::";
  291. break;
  292. default:
  293. goto errout;
  294. break;
  295. }
  296. gai = _proxy_getaddr(gai_host, 0, SOCK_DGRAM, 0);
  297. udp_fd = socket(gai->ai_family, gai->ai_socktype | SOCK_CLOEXEC, 0);
  298. if (udp_fd < 0) {
  299. goto errout;
  300. }
  301. ret = bind(udp_fd, gai->ai_addr, gai->ai_addrlen);
  302. if (ret < 0) {
  303. goto errout;
  304. }
  305. if (proxy_conn->non_block) {
  306. set_fd_nonblock(udp_fd, 1);
  307. }
  308. freeaddrinfo(gai);
  309. return udp_fd;
  310. errout:
  311. if (gai) {
  312. freeaddrinfo(gai);
  313. }
  314. return -1;
  315. }
  316. static int _proxy_handshake_socks5_connect_udp(struct proxy_conn *proxy_conn)
  317. {
  318. int udp_fd = -1;
  319. if (proxy_conn->is_udp == 0) {
  320. return 0;
  321. }
  322. if (proxy_conn->udp_fd < 0) {
  323. udp_fd = _proxy_handshake_socks5_create_udp_fd(proxy_conn);
  324. if (udp_fd < 0) {
  325. return -1;
  326. }
  327. proxy_conn->udp_fd = udp_fd;
  328. }
  329. return connect(proxy_conn->udp_fd, (struct sockaddr *)&proxy_conn->udp_dest_addr, proxy_conn->udp_dest_addrlen);
  330. }
  331. static proxy_handshake_state _proxy_handshake_socks5_reply_connect_addr(struct proxy_conn *proxy_conn)
  332. {
  333. char buff[DNS_MAX_CNAME_LEN * 2];
  334. int len = 0;
  335. memset(buff, 0, sizeof(buff));
  336. struct sockaddr_storage addr;
  337. char *ptr = NULL;
  338. socklen_t addr_len = sizeof(addr);
  339. buff[0] = PROXY_SOCKS5_VERSION;
  340. if (proxy_conn->is_udp) {
  341. buff[1] = PROXY_SOCKS5_CONNECT_UDP;
  342. } else {
  343. buff[1] = PROXY_SOCKS5_CONNECT_TCP;
  344. }
  345. buff[2] = 0x0;
  346. ptr = buff + 3;
  347. if (proxy_conn->server_info->info.use_domain) {
  348. *ptr = PROXY_SOCKS5_TYPE_DOMAIN;
  349. ptr++;
  350. int domainlen = strnlen(proxy_conn->host, DNS_MAX_CNAME_LEN);
  351. *ptr = domainlen;
  352. ptr++;
  353. memcpy(ptr, proxy_conn->host, domainlen);
  354. ptr += domainlen;
  355. } else {
  356. if (proxy_conn->is_udp) {
  357. memset(&addr, 0, proxy_conn->server_info->server_addrlen);
  358. addr_len = proxy_conn->server_info->server_addrlen;
  359. addr.ss_family = proxy_conn->server_info->server_addr.ss_family;
  360. } else {
  361. getaddr_by_host(proxy_conn->host, (struct sockaddr *)&addr, &addr_len);
  362. }
  363. switch (addr.ss_family) {
  364. case AF_INET: {
  365. struct sockaddr_in *addr_in = NULL;
  366. addr_in = (struct sockaddr_in *)&addr;
  367. *ptr = PROXY_SOCKS5_TYPE_IPV4;
  368. ptr++;
  369. memcpy(ptr, &addr_in->sin_addr.s_addr, 4);
  370. ptr += 4;
  371. } break;
  372. case AF_INET6: {
  373. struct sockaddr_in6 *addr_in6 = NULL;
  374. addr_in6 = (struct sockaddr_in6 *)&addr;
  375. if (IN6_IS_ADDR_V4MAPPED(&addr_in6->sin6_addr)) {
  376. *ptr = PROXY_SOCKS5_TYPE_IPV4;
  377. ptr++;
  378. memcpy(ptr, addr_in6->sin6_addr.s6_addr + 12, 4);
  379. ptr += 4;
  380. } else {
  381. *ptr = PROXY_SOCKS5_TYPE_IPV6;
  382. ptr++;
  383. memcpy(ptr, addr_in6->sin6_addr.s6_addr, 16);
  384. ptr += 16;
  385. }
  386. } break;
  387. default:
  388. return PROXY_HANDSHAKE_ERR;
  389. }
  390. }
  391. *((short *)(ptr)) = htons(proxy_conn->port);
  392. ptr += 2;
  393. len = send(proxy_conn->fd, buff, ptr - buff, MSG_NOSIGNAL);
  394. if (len != ptr - buff) {
  395. tlog(TLOG_ERROR, "Send proxy request failed.");
  396. return PROXY_HANDSHAKE_ERR;
  397. }
  398. proxy_conn->state = PROXY_CONN_CONNECTING;
  399. return PROXY_HANDSHAKE_WANT_READ;
  400. }
  401. static proxy_handshake_state _proxy_handshake_socks5_send_auth(struct proxy_conn *proxy_conn)
  402. {
  403. char buff[DNS_MAX_CNAME_LEN * 2];
  404. int len = 0;
  405. int offset = 0;
  406. memset(buff, 0, sizeof(buff));
  407. buff[0] = 0x1;
  408. buff[1] = strnlen(proxy_conn->server_info->info.username, PROXY_MAX_NAMELEN);
  409. safe_strncpy(buff + 2, proxy_conn->server_info->info.username, buff[1] + 1);
  410. offset = buff[1] + 2;
  411. buff[offset] = strnlen(proxy_conn->server_info->info.password, PROXY_MAX_NAMELEN);
  412. safe_strncpy(buff + offset + 1, proxy_conn->server_info->info.password, buff[offset] + 1);
  413. offset += buff[offset] + 1;
  414. len = send(proxy_conn->fd, buff, offset, MSG_NOSIGNAL);
  415. if (len != offset) {
  416. tlog(TLOG_ERROR, "send auth failed, len: %d, %s", len, strerror(errno));
  417. return PROXY_HANDSHAKE_ERR;
  418. }
  419. proxy_conn->state = PROXY_CONN_AUTH_ACK;
  420. return PROXY_HANDSHAKE_WANT_READ;
  421. }
  422. static proxy_handshake_state _proxy_handshake_socks5(struct proxy_conn *proxy_conn)
  423. {
  424. int len = 0;
  425. char buff[DNS_MAX_CNAME_LEN * 2];
  426. memset(buff, 0, sizeof(buff));
  427. switch (proxy_conn->state) {
  428. case PROXY_CONN_INIT: {
  429. buff[0] = PROXY_SOCKS5_VERSION;
  430. buff[1] = 0x2; // 2 auth methods
  431. buff[2] = PROXY_SOCKS5_NO_AUTH;
  432. buff[3] = PROXY_SOCKS5_AUTH_USER_PASS;
  433. len = send(proxy_conn->fd, buff, 4, MSG_NOSIGNAL);
  434. if (len != 4) {
  435. tlog(TLOG_ERROR, "connect socks5 server %s failed, %s", proxy_conn->server_info->proxy_name,
  436. strerror(errno));
  437. return PROXY_HANDSHAKE_ERR;
  438. }
  439. proxy_conn->state = PROXY_CONN_INIT_ACK;
  440. return PROXY_HANDSHAKE_WANT_READ;
  441. } break;
  442. case PROXY_CONN_INIT_ACK:
  443. len = recv(proxy_conn->fd, proxy_conn->buffer.buffer + proxy_conn->buffer.len,
  444. sizeof(proxy_conn->buffer.buffer), 0);
  445. if (len <= 0) {
  446. if (errno == EAGAIN || errno == EWOULDBLOCK) {
  447. return PROXY_HANDSHAKE_WANT_READ;
  448. }
  449. tlog(TLOG_ERROR, "recv socks5 init ack from %s failed, %s", proxy_conn->server_info->proxy_name,
  450. strerror(errno));
  451. return PROXY_HANDSHAKE_ERR;
  452. }
  453. proxy_conn->buffer.len += len;
  454. if (proxy_conn->buffer.len < 2) {
  455. return PROXY_HANDSHAKE_WANT_READ;
  456. }
  457. if (proxy_conn->buffer.len > 2) {
  458. tlog(TLOG_ERROR, "recv socks5 init ack from %s failed", proxy_conn->server_info->proxy_name);
  459. return PROXY_HANDSHAKE_ERR;
  460. }
  461. proxy_conn->buffer.len = 0;
  462. if (proxy_conn->buffer.buffer[0] != PROXY_SOCKS5_VERSION) {
  463. tlog(TLOG_ERROR, "server %s not support socks5", proxy_conn->server_info->proxy_name);
  464. return PROXY_HANDSHAKE_ERR;
  465. }
  466. if ((unsigned char)proxy_conn->buffer.buffer[1] == PROXY_SOCKS5_AUTH_NONE) {
  467. tlog(TLOG_ERROR, "server %s not support auth methods", proxy_conn->server_info->proxy_name);
  468. return PROXY_HANDSHAKE_ERR;
  469. }
  470. tlog(TLOG_DEBUG, "server %s select auth method is %d", proxy_conn->server_info->proxy_name,
  471. proxy_conn->buffer.buffer[1]);
  472. if (proxy_conn->buffer.buffer[1] == PROXY_SOCKS5_AUTH_USER_PASS) {
  473. return _proxy_handshake_socks5_send_auth(proxy_conn);
  474. }
  475. if (proxy_conn->buffer.buffer[1] == PROXY_SOCKS5_NO_AUTH) {
  476. return _proxy_handshake_socks5_reply_connect_addr(proxy_conn);
  477. }
  478. tlog(TLOG_ERROR, "server %s select invalid auth method %d", proxy_conn->server_info->proxy_name,
  479. proxy_conn->buffer.buffer[1]);
  480. return PROXY_HANDSHAKE_ERR;
  481. break;
  482. case PROXY_CONN_AUTH_ACK:
  483. len = recv(proxy_conn->fd, proxy_conn->buffer.buffer + proxy_conn->buffer.len,
  484. sizeof(proxy_conn->buffer.buffer), 0);
  485. if (len <= 0) {
  486. if (errno == EAGAIN || errno == EWOULDBLOCK) {
  487. return PROXY_HANDSHAKE_WANT_READ;
  488. }
  489. tlog(TLOG_ERROR, "recv socks5 auth ack from %s failed, %s", proxy_conn->server_info->proxy_name,
  490. strerror(errno));
  491. return PROXY_HANDSHAKE_ERR;
  492. }
  493. proxy_conn->buffer.len += len;
  494. if (proxy_conn->buffer.len < 2) {
  495. return PROXY_HANDSHAKE_WANT_READ;
  496. }
  497. if (proxy_conn->buffer.len != 2) {
  498. tlog(TLOG_ERROR, "recv socks5 auth ack from %s failed", proxy_conn->server_info->proxy_name);
  499. return PROXY_HANDSHAKE_ERR;
  500. }
  501. proxy_conn->buffer.len = 0;
  502. if (proxy_conn->buffer.buffer[0] != 0x1) {
  503. tlog(TLOG_ERROR, "server %s not support socks5", proxy_conn->server_info->proxy_name);
  504. return PROXY_HANDSHAKE_ERR;
  505. }
  506. if (proxy_conn->buffer.buffer[1] != 0x0) {
  507. tlog(TLOG_ERROR, "server %s auth failed, incorrect user or password, code: %d",
  508. proxy_conn->server_info->proxy_name, proxy_conn->buffer.buffer[1]);
  509. return PROXY_HANDSHAKE_ERR;
  510. }
  511. tlog(TLOG_DEBUG, "server %s auth success", proxy_conn->server_info->proxy_name);
  512. proxy_conn->state = PROXY_CONN_CONNECTING;
  513. return _proxy_handshake_socks5_reply_connect_addr(proxy_conn);
  514. case PROXY_CONN_CONNECTING: {
  515. unsigned char addr[16];
  516. unsigned short port = 0;
  517. int use_dest_ip = 0;
  518. unsigned char *recv_buff = NULL;
  519. int addr_len = 0;
  520. len = recv(proxy_conn->fd, proxy_conn->buffer.buffer + proxy_conn->buffer.len,
  521. sizeof(proxy_conn->buffer.buffer), 0);
  522. if (len <= 0) {
  523. if (errno == EAGAIN || errno == EWOULDBLOCK) {
  524. return PROXY_HANDSHAKE_WANT_READ;
  525. }
  526. if (len == 0) {
  527. tlog(TLOG_ERROR, "server %s closed connection", proxy_conn->server_info->proxy_name);
  528. } else {
  529. tlog(TLOG_ERROR, "recv socks5 connect ack from %s failed, %s", proxy_conn->server_info->proxy_name,
  530. strerror(errno));
  531. }
  532. return PROXY_HANDSHAKE_ERR;
  533. }
  534. proxy_conn->buffer.len += len;
  535. if (proxy_conn->buffer.len < 10) {
  536. return PROXY_HANDSHAKE_WANT_READ;
  537. }
  538. recv_buff = proxy_conn->buffer.buffer;
  539. if (recv_buff[0] != PROXY_SOCKS5_VERSION) {
  540. tlog(TLOG_ERROR, "server %s not support socks5", proxy_conn->server_info->proxy_name);
  541. return PROXY_HANDSHAKE_ERR;
  542. }
  543. if (recv_buff[1] != 0) {
  544. if (recv_buff[1] <=
  545. (sizeof(proxy_socks5_status_code) / sizeof(proxy_socks5_status_code[0]))) {
  546. tlog(TLOG_ERROR, "server %s reply failed, error-code: %s", proxy_conn->server_info->proxy_name,
  547. proxy_socks5_status_code[(int)recv_buff[1]]);
  548. } else {
  549. tlog(TLOG_ERROR, "server %s reply failed, error-code: %x", proxy_conn->server_info->proxy_name,
  550. recv_buff[1]);
  551. }
  552. return PROXY_HANDSHAKE_ERR;
  553. }
  554. switch (recv_buff[3]) {
  555. case PROXY_SOCKS5_TYPE_IPV4: {
  556. struct sockaddr_in *addr_in = NULL;
  557. addr_in = (struct sockaddr_in *)&proxy_conn->udp_dest_addr;
  558. proxy_conn->udp_dest_addrlen = sizeof(struct sockaddr_in);
  559. if (proxy_conn->buffer.len < 10) {
  560. return PROXY_HANDSHAKE_WANT_READ;
  561. }
  562. addr_len = 4;
  563. memcpy(addr, recv_buff + 4, addr_len);
  564. port = ntohs(*((short *)(recv_buff + 4 + addr_len)));
  565. addr_in->sin_family = AF_INET;
  566. addr_in->sin_addr.s_addr = *((int *)addr);
  567. addr_in->sin_port = *((short *)(recv_buff + 4 + addr_len));
  568. if (addr[0] == 0 && addr[1] == 0 && addr[2] == 0 && addr[3] == 0) {
  569. use_dest_ip = 1;
  570. }
  571. tlog(TLOG_DEBUG, "server %s proxy dest: %d.%d.%d.%d:%d\n", proxy_conn->server_info->proxy_name, addr[0],
  572. addr[1], addr[2], addr[3], port);
  573. } break;
  574. case PROXY_SOCKS5_TYPE_IPV6: {
  575. struct sockaddr_in6 *addr_in6 = NULL;
  576. addr_in6 = (struct sockaddr_in6 *)&proxy_conn->udp_dest_addr;
  577. proxy_conn->udp_dest_addrlen = sizeof(struct sockaddr_in6);
  578. if (proxy_conn->buffer.len < 22) {
  579. return PROXY_HANDSHAKE_WANT_READ;
  580. }
  581. addr_len = 16;
  582. memcpy(addr, recv_buff + 4, addr_len);
  583. port = ntohs(*((short *)(recv_buff + 4 + addr_len)));
  584. addr_in6->sin6_family = AF_INET6;
  585. memcpy(addr_in6->sin6_addr.s6_addr, addr, addr_len);
  586. addr_in6->sin6_port = *((short *)(recv_buff + 4 + addr_len));
  587. if (addr[0] == 0 && addr[1] == 0 && addr[2] == 0 && addr[3] == 0 && addr[4] == 0 && addr[5] == 0 &&
  588. addr[6] == 0 && addr[7] == 0 && addr[8] == 0 && addr[9] == 0 && addr[10] == 0 && addr[11] == 0 &&
  589. addr[12] == 0 && addr[13] == 0 && addr[14] == 0 && addr[15] == 0) {
  590. use_dest_ip = 1;
  591. }
  592. tlog(TLOG_DEBUG, "server %s proxy dest: [%x:%x:%x:%x:%x:%x:%x:%x]:%d\n",
  593. proxy_conn->server_info->proxy_name, ntohs(*((short *)addr)), ntohs(*((short *)(addr + 2))),
  594. ntohs(*((short *)(addr + 4))), ntohs(*((short *)(addr + 6))), ntohs(*((short *)(addr + 8))),
  595. ntohs(*((short *)(addr + 10))), ntohs(*((short *)(addr + 12))), ntohs(*((short *)(addr + 14))), port);
  596. } break;
  597. default:
  598. return PROXY_HANDSHAKE_ERR;
  599. }
  600. if (use_dest_ip && proxy_conn->is_udp) {
  601. memcpy(&proxy_conn->udp_dest_addr, &proxy_conn->server_info->server_addr,
  602. proxy_conn->server_info->server_addrlen);
  603. proxy_conn->udp_dest_addrlen = proxy_conn->server_info->server_addrlen;
  604. switch (proxy_conn->udp_dest_addr.ss_family) {
  605. case AF_INET: {
  606. struct sockaddr_in *addr_in = NULL;
  607. addr_in = (struct sockaddr_in *)&proxy_conn->udp_dest_addr;
  608. addr_in->sin_port = *((short *)(recv_buff + 4 + addr_len));
  609. } break;
  610. case AF_INET6: {
  611. struct sockaddr_in6 *addr_in6 = NULL;
  612. addr_in6 = (struct sockaddr_in6 *)&proxy_conn->udp_dest_addr;
  613. addr_in6->sin6_port = *((short *)(recv_buff + 4 + addr_len));
  614. } break;
  615. default:
  616. return PROXY_HANDSHAKE_ERR;
  617. break;
  618. }
  619. }
  620. if (_proxy_handshake_socks5_connect_udp(proxy_conn) != 0) {
  621. return PROXY_HANDSHAKE_ERR;
  622. }
  623. proxy_conn->state = PROXY_CONN_CONNECTED;
  624. tlog(TLOG_DEBUG, "success connect to socks5 proxy server %s, type: %s", proxy_conn->server_info->proxy_name,
  625. proxy_conn->is_udp ? "udp" : "tcp");
  626. return PROXY_HANDSHAKE_CONNECTED;
  627. } break;
  628. default:
  629. tlog(TLOG_ERROR, "client socks5 status %d is invalid", proxy_conn->state);
  630. return PROXY_HANDSHAKE_ERR;
  631. }
  632. return PROXY_HANDSHAKE_ERR;
  633. }
  634. static int _proxy_handshake_http(struct proxy_conn *proxy_conn)
  635. {
  636. int len = 0;
  637. proxy_handshake_state ret = PROXY_HANDSHAKE_ERR;
  638. char buff[4096];
  639. struct http_head *http_head = NULL;
  640. switch (proxy_conn->state) {
  641. case PROXY_CONN_INIT: {
  642. char connecthost[DNS_MAX_CNAME_LEN * 2];
  643. struct sockaddr_storage addr;
  644. socklen_t addr_len = sizeof(addr);
  645. getaddr_by_host(proxy_conn->host, (struct sockaddr *)&addr, &addr_len);
  646. if (proxy_conn->server_info->info.use_domain) {
  647. snprintf(connecthost, sizeof(connecthost), "%s:%d", proxy_conn->host, proxy_conn->port);
  648. } else {
  649. struct sockaddr_in *addr_in;
  650. addr_in = (struct sockaddr_in *)&addr;
  651. unsigned char *paddr = (unsigned char *)&addr_in->sin_addr.s_addr;
  652. snprintf(connecthost, sizeof(connecthost), "%d.%d.%d.%d:%d", paddr[0], paddr[1], paddr[2], paddr[3],
  653. proxy_conn->port);
  654. }
  655. int msglen = 0;
  656. if (proxy_conn->server_info->info.username[0] == '\0') {
  657. msglen = snprintf(buff, sizeof(buff),
  658. "CONNECT %s HTTP/1.1\r\n"
  659. "Host: %s\r\n"
  660. "Proxy-Connection: Keep-Alive\r\n\r\n",
  661. connecthost, connecthost);
  662. } else {
  663. char auth[256];
  664. char base64_auth[256 * 2];
  665. snprintf(auth, sizeof(auth), "%s:%s", proxy_conn->server_info->info.username,
  666. proxy_conn->server_info->info.password);
  667. SSL_base64_encode(auth, strlen(auth), base64_auth);
  668. msglen = snprintf(buff, sizeof(buff),
  669. "CONNECT %s HTTP/1.1\r\n"
  670. "Host: %s\r\n"
  671. "Proxy-Authorization: Basic %s\r\n"
  672. "Proxy-Connection: Keep-Alive\r\n\r\n",
  673. connecthost, connecthost, base64_auth);
  674. }
  675. len = send(proxy_conn->fd, buff, msglen, MSG_NOSIGNAL);
  676. if (len != msglen) {
  677. tlog(TLOG_ERROR, "connect to https proxy server %s failed, %s", proxy_conn->server_info->proxy_name,
  678. strerror(errno));
  679. goto out;
  680. }
  681. proxy_conn->state = PROXY_CONN_CONNECTING;
  682. ret = PROXY_HANDSHAKE_WANT_READ;
  683. goto out;
  684. } break;
  685. case PROXY_CONN_CONNECTING: {
  686. http_head = http_head_init(4096, HTTP_VERSION_1_1);
  687. if (http_head == NULL) {
  688. goto out;
  689. }
  690. len = recv(proxy_conn->fd, proxy_conn->buffer.buffer + proxy_conn->buffer.len,
  691. sizeof(proxy_conn->buffer.buffer), 0);
  692. if (len <= 0) {
  693. if (errno == EAGAIN || errno == EWOULDBLOCK) {
  694. return PROXY_HANDSHAKE_WANT_READ;
  695. }
  696. if (len == 0) {
  697. tlog(TLOG_ERROR, "remote server %s closed.", proxy_conn->server_info->proxy_name);
  698. } else {
  699. tlog(TLOG_ERROR, "recv from %s failed, %s", proxy_conn->server_info->proxy_name, strerror(errno));
  700. }
  701. goto out;
  702. }
  703. proxy_conn->buffer.len += len;
  704. len = http_head_parse(http_head, proxy_conn->buffer.buffer, proxy_conn->buffer.len);
  705. if (len < 0) {
  706. if (len == -1) {
  707. ret = PROXY_HANDSHAKE_WANT_READ;
  708. goto out;
  709. }
  710. tlog(TLOG_DEBUG, "remote server %s not supported.", proxy_conn->server_info->proxy_name);
  711. goto out;
  712. }
  713. if (http_head_get_httpcode(http_head) != 200) {
  714. tlog(TLOG_WARN, "http server %s query failed, server return http code : %d, %s",
  715. proxy_conn->server_info->proxy_name, http_head_get_httpcode(http_head),
  716. http_head_get_httpcode_msg(http_head));
  717. goto out;
  718. }
  719. proxy_conn->buffer.len -= len;
  720. if (proxy_conn->buffer.len > 0) {
  721. memmove(proxy_conn->buffer.buffer, proxy_conn->buffer.buffer + len, proxy_conn->buffer.len);
  722. }
  723. if (proxy_conn->buffer.len < 0) {
  724. proxy_conn->buffer.len = 0;
  725. }
  726. tlog(TLOG_DEBUG, "success connect to http proxy server %s", proxy_conn->server_info->proxy_name);
  727. proxy_conn->state = PROXY_CONN_CONNECTED;
  728. ret = PROXY_HANDSHAKE_CONNECTED;
  729. goto out;
  730. } break;
  731. default:
  732. goto out;
  733. break;
  734. }
  735. out:
  736. if (http_head) {
  737. http_head_destroy(http_head);
  738. }
  739. return ret;
  740. }
  741. proxy_handshake_state proxy_conn_handshake(struct proxy_conn *proxy_conn)
  742. {
  743. if (proxy_conn == NULL) {
  744. return -1;
  745. }
  746. if (proxy_conn->state == PROXY_CONN_CONNECTED) {
  747. return PROXY_HANDSHAKE_OK;
  748. }
  749. switch (proxy_conn->type) {
  750. case PROXY_SOCKS5:
  751. return _proxy_handshake_socks5(proxy_conn);
  752. case PROXY_HTTP:
  753. return _proxy_handshake_http(proxy_conn);
  754. default:
  755. return PROXY_HANDSHAKE_ERR;
  756. }
  757. return PROXY_HANDSHAKE_ERR;
  758. }
  759. static int _proxy_is_tcp_connected(struct proxy_conn *proxy_conn)
  760. {
  761. char buff[1];
  762. int ret = 0;
  763. ret = recv(proxy_conn->fd, buff, 1, MSG_PEEK | MSG_DONTWAIT);
  764. if (ret < 0) {
  765. if (errno == EAGAIN || errno == EWOULDBLOCK) {
  766. return 1;
  767. }
  768. }
  769. return 0;
  770. }
  771. int proxy_conn_sendto(struct proxy_conn *proxy_conn, const void *buf, size_t len, int flags,
  772. const struct sockaddr *dest_addr, socklen_t addrlen)
  773. {
  774. char buffer[PROXY_BUFFER_SIZE];
  775. int buffer_len = 0;
  776. int ret = 0;
  777. if (proxy_conn == NULL) {
  778. return -1;
  779. }
  780. if (_proxy_is_tcp_connected(proxy_conn) == 0) {
  781. errno = ECONNRESET;
  782. return -1;
  783. }
  784. buffer[0] = 0x00;
  785. buffer[1] = 0x00;
  786. buffer[2] = 0x00;
  787. buffer_len += 3;
  788. switch (dest_addr->sa_family) {
  789. case AF_INET:
  790. buffer[3] = PROXY_SOCKS5_TYPE_IPV4;
  791. memcpy(buffer + 4, &((struct sockaddr_in *)dest_addr)->sin_addr.s_addr, 4);
  792. memcpy(buffer + 8, &((struct sockaddr_in *)dest_addr)->sin_port, 2);
  793. buffer_len += 7;
  794. break;
  795. case AF_INET6:
  796. buffer[3] = PROXY_SOCKS5_TYPE_IPV6;
  797. memcpy(buffer + 4, &((struct sockaddr_in6 *)dest_addr)->sin6_addr.s6_addr, 16);
  798. memcpy(buffer + 20, &((struct sockaddr_in6 *)dest_addr)->sin6_port, 2);
  799. buffer_len += 19;
  800. break;
  801. default:
  802. return -1;
  803. }
  804. if (sizeof(buffer) - buffer_len <= len) {
  805. errno = ENOSPC;
  806. return -1;
  807. }
  808. memcpy(buffer + buffer_len, buf, len);
  809. buffer_len += len;
  810. ret = sendto(proxy_conn->udp_fd, buffer, buffer_len, MSG_NOSIGNAL, (struct sockaddr *)&proxy_conn->udp_dest_addr,
  811. proxy_conn->udp_dest_addrlen);
  812. if (ret != buffer_len) {
  813. return -1;
  814. }
  815. return len;
  816. }
  817. int proxy_conn_recvfrom(struct proxy_conn *proxy_conn, void *buf, size_t len, int flags, struct sockaddr *src_addr,
  818. socklen_t *addrlen)
  819. {
  820. char buffer[PROXY_BUFFER_SIZE];
  821. int buffer_len = 0;
  822. int ret = 0;
  823. if (proxy_conn == NULL) {
  824. return -1;
  825. }
  826. ret = recvfrom(proxy_conn->udp_fd, buffer, sizeof(buffer), MSG_NOSIGNAL, NULL, NULL);
  827. if (ret <= 0) {
  828. return -1;
  829. }
  830. if (buffer[0] != 0x00 || buffer[1] != 0x00 || buffer[2] != 0x00) {
  831. return -1;
  832. }
  833. switch (buffer[3]) {
  834. case PROXY_SOCKS5_TYPE_IPV4:
  835. if (ret < 10) {
  836. return -1;
  837. }
  838. if (src_addr) {
  839. memset(src_addr, 0, sizeof(struct sockaddr_in));
  840. ((struct sockaddr_in *)src_addr)->sin_family = AF_INET;
  841. memcpy(&((struct sockaddr_in *)src_addr)->sin_addr.s_addr, buffer + 4, 4);
  842. memcpy(&((struct sockaddr_in *)src_addr)->sin_port, buffer + 8, 2);
  843. }
  844. if (addrlen) {
  845. *addrlen = sizeof(struct sockaddr_in);
  846. }
  847. buffer_len = 10;
  848. break;
  849. case PROXY_SOCKS5_TYPE_IPV6:
  850. if (ret < 22) {
  851. return -1;
  852. }
  853. if (src_addr) {
  854. memset(src_addr, 0, sizeof(struct sockaddr_in6));
  855. ((struct sockaddr_in6 *)src_addr)->sin6_family = AF_INET6;
  856. memcpy(&((struct sockaddr_in6 *)src_addr)->sin6_addr.s6_addr, buffer + 4, 16);
  857. memcpy(&((struct sockaddr_in6 *)src_addr)->sin6_port, buffer + 20, 2);
  858. }
  859. if (addrlen) {
  860. *addrlen = sizeof(struct sockaddr_in6);
  861. }
  862. buffer_len = 22;
  863. break;
  864. default:
  865. return -1;
  866. }
  867. if (ret - buffer_len > (int)len) {
  868. return -1;
  869. }
  870. memcpy(buf, buffer + buffer_len, ret - buffer_len);
  871. return ret - buffer_len;
  872. }
  873. int proxy_conn_get_fd(struct proxy_conn *proxy_conn)
  874. {
  875. if (proxy_conn == NULL) {
  876. return -1;
  877. }
  878. return proxy_conn->fd;
  879. }
  880. int proxy_conn_get_udpfd(struct proxy_conn *proxy_conn)
  881. {
  882. if (proxy_conn == NULL) {
  883. return -1;
  884. }
  885. return proxy_conn->udp_fd;
  886. }
  887. int proxy_conn_is_udp(struct proxy_conn *proxy_conn)
  888. {
  889. if (proxy_conn == NULL) {
  890. return -1;
  891. }
  892. return proxy_conn->is_udp;
  893. }
  894. int proxy_init(void)
  895. {
  896. if (is_proxy_init == 1) {
  897. return -1;
  898. }
  899. memset(&proxy, 0, sizeof(proxy));
  900. hash_init(proxy.proxy_server);
  901. is_proxy_init = 1;
  902. return 0;
  903. }
  904. void proxy_exit(void)
  905. {
  906. if (is_proxy_init == 0) {
  907. return;
  908. }
  909. _proxy_remove_all();
  910. is_proxy_init = 0;
  911. return;
  912. }