You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

834 lines
21 KiB

12 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
12 years ago
11 years ago
12 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
12 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
10 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
  1. /*
  2. * redir.c - Provide a transparent TCP proxy through remote shadowsocks
  3. * server
  4. *
  5. * Copyright (C) 2013 - 2014, Max Lv <max.c.lv@gmail.com>
  6. *
  7. * This file is part of the shadowsocks-libev.
  8. *
  9. * shadowsocks-libev is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation; either version 3 of the License, or
  12. * (at your option) any later version.
  13. *
  14. * shadowsocks-libev is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with pdnsd; see the file COPYING. If not, see
  21. * <http://www.gnu.org/licenses/>.
  22. */
  23. #include <sys/stat.h>
  24. #include <sys/types.h>
  25. #include <arpa/inet.h>
  26. #include <errno.h>
  27. #include <fcntl.h>
  28. #include <locale.h>
  29. #include <netdb.h>
  30. #include <netinet/in.h>
  31. #include <netinet/tcp.h>
  32. #include <pthread.h>
  33. #include <signal.h>
  34. #include <string.h>
  35. #include <strings.h>
  36. #include <time.h>
  37. #include <unistd.h>
  38. #include <limits.h>
  39. #include <linux/netfilter_ipv4.h>
  40. #ifdef HAVE_CONFIG_H
  41. #include "config.h"
  42. #endif
  43. #include "utils.h"
  44. #include "redir.h"
  45. #ifndef EAGAIN
  46. #define EAGAIN EWOULDBLOCK
  47. #endif
  48. #ifndef EWOULDBLOCK
  49. #define EWOULDBLOCK EAGAIN
  50. #endif
  51. #ifndef BUF_SIZE
  52. #define BUF_SIZE 512
  53. #endif
  54. int getdestaddr(int fd, struct sockaddr_in *destaddr)
  55. {
  56. socklen_t socklen = sizeof(*destaddr);
  57. int error;
  58. error = getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, destaddr, &socklen);
  59. if (error)
  60. {
  61. return -1;
  62. }
  63. return 0;
  64. }
  65. int setnonblocking(int fd)
  66. {
  67. int flags;
  68. if (-1 ==(flags = fcntl(fd, F_GETFL, 0)))
  69. flags = 0;
  70. return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
  71. }
  72. int create_and_bind(const char *addr, const char *port)
  73. {
  74. struct addrinfo hints;
  75. struct addrinfo *result, *rp;
  76. int s, listen_sock;
  77. memset(&hints, 0, sizeof(struct addrinfo));
  78. hints.ai_family = AF_UNSPEC; /* Return IPv4 and IPv6 choices */
  79. hints.ai_socktype = SOCK_STREAM; /* We want a TCP socket */
  80. s = getaddrinfo(addr, port, &hints, &result);
  81. if (s != 0)
  82. {
  83. LOGD("getaddrinfo: %s", gai_strerror(s));
  84. return -1;
  85. }
  86. for (rp = result; rp != NULL; rp = rp->ai_next)
  87. {
  88. listen_sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
  89. if (listen_sock == -1)
  90. continue;
  91. int opt = 1;
  92. setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
  93. setsockopt(listen_sock, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt));
  94. #ifdef SO_NOSIGPIPE
  95. setsockopt(listen_sock, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
  96. #endif
  97. s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);
  98. if (s == 0)
  99. {
  100. /* We managed to bind successfully! */
  101. break;
  102. }
  103. else
  104. {
  105. ERROR("bind");
  106. }
  107. close(listen_sock);
  108. }
  109. if (rp == NULL)
  110. {
  111. LOGE("Could not bind");
  112. return -1;
  113. }
  114. freeaddrinfo(result);
  115. return listen_sock;
  116. }
  117. static void server_recv_cb (EV_P_ ev_io *w, int revents)
  118. {
  119. struct server_ctx *server_recv_ctx = (struct server_ctx *)w;
  120. struct server *server = server_recv_ctx->server;
  121. struct remote *remote = server->remote;
  122. if (remote == NULL)
  123. {
  124. close_and_free_server(EV_A_ server);
  125. return;
  126. }
  127. ssize_t r = recv(server->fd, remote->buf, BUF_SIZE, 0);
  128. if (r == 0)
  129. {
  130. // connection closed
  131. remote->buf_len = 0;
  132. remote->buf_idx = 0;
  133. close_and_free_server(EV_A_ server);
  134. if (remote != NULL)
  135. {
  136. ev_io_start(EV_A_ &remote->send_ctx->io);
  137. }
  138. return;
  139. }
  140. else if(r < 0)
  141. {
  142. if (errno == EAGAIN || errno == EWOULDBLOCK)
  143. {
  144. // no data
  145. // continue to wait for recv
  146. return;
  147. }
  148. else
  149. {
  150. ERROR("server recv");
  151. close_and_free_remote(EV_A_ remote);
  152. close_and_free_server(EV_A_ server);
  153. return;
  154. }
  155. }
  156. remote->buf = ss_encrypt(BUF_SIZE, remote->buf, &r, server->e_ctx);
  157. if (remote->buf == NULL)
  158. {
  159. LOGE("invalid password or cipher");
  160. close_and_free_remote(EV_A_ remote);
  161. close_and_free_server(EV_A_ server);
  162. return;
  163. }
  164. int s = send(remote->fd, remote->buf, r, 0);
  165. if(s == -1)
  166. {
  167. if (errno == EAGAIN || errno == EWOULDBLOCK)
  168. {
  169. // no data, wait for send
  170. remote->buf_len = r;
  171. remote->buf_idx = 0;
  172. ev_io_stop(EV_A_ &server_recv_ctx->io);
  173. ev_io_start(EV_A_ &remote->send_ctx->io);
  174. return;
  175. }
  176. else
  177. {
  178. ERROR("send");
  179. close_and_free_remote(EV_A_ remote);
  180. close_and_free_server(EV_A_ server);
  181. return;
  182. }
  183. }
  184. else if(s < r)
  185. {
  186. remote->buf_len = r - s;
  187. remote->buf_idx = s;
  188. ev_io_stop(EV_A_ &server_recv_ctx->io);
  189. ev_io_start(EV_A_ &remote->send_ctx->io);
  190. return;
  191. }
  192. }
  193. static void server_send_cb (EV_P_ ev_io *w, int revents)
  194. {
  195. struct server_ctx *server_send_ctx = (struct server_ctx *)w;
  196. struct server *server = server_send_ctx->server;
  197. struct remote *remote = server->remote;
  198. if (server->buf_len == 0)
  199. {
  200. // close and free
  201. close_and_free_remote(EV_A_ remote);
  202. close_and_free_server(EV_A_ server);
  203. return;
  204. }
  205. else
  206. {
  207. // has data to send
  208. ssize_t s = send(server->fd, server->buf + server->buf_idx,
  209. server->buf_len, 0);
  210. if (s < 0)
  211. {
  212. if (errno != EAGAIN && errno != EWOULDBLOCK)
  213. {
  214. ERROR("send");
  215. close_and_free_remote(EV_A_ remote);
  216. close_and_free_server(EV_A_ server);
  217. }
  218. return;
  219. }
  220. else if (s < server->buf_len)
  221. {
  222. // partly sent, move memory, wait for the next time to send
  223. server->buf_len -= s;
  224. server->buf_idx += s;
  225. return;
  226. }
  227. else
  228. {
  229. // all sent out, wait for reading
  230. server->buf_len = 0;
  231. server->buf_idx = 0;
  232. ev_io_stop(EV_A_ &server_send_ctx->io);
  233. if (remote != NULL)
  234. {
  235. ev_io_start(EV_A_ &remote->recv_ctx->io);
  236. }
  237. else
  238. {
  239. close_and_free_remote(EV_A_ remote);
  240. close_and_free_server(EV_A_ server);
  241. return;
  242. }
  243. }
  244. }
  245. }
  246. static void remote_timeout_cb(EV_P_ ev_timer *watcher, int revents)
  247. {
  248. struct remote_ctx *remote_ctx = (struct remote_ctx *) (((void*)watcher)
  249. - sizeof(ev_io));
  250. struct remote *remote = remote_ctx->remote;
  251. struct server *server = remote->server;
  252. LOGD("remote timeout");
  253. ev_timer_stop(EV_A_ watcher);
  254. if (server == NULL)
  255. {
  256. close_and_free_remote(EV_A_ remote);
  257. return;
  258. }
  259. close_and_free_remote(EV_A_ remote);
  260. close_and_free_server(EV_A_ server);
  261. }
  262. static void remote_recv_cb (EV_P_ ev_io *w, int revents)
  263. {
  264. struct remote_ctx *remote_recv_ctx = (struct remote_ctx *)w;
  265. struct remote *remote = remote_recv_ctx->remote;
  266. struct server *server = remote->server;
  267. if (server == NULL)
  268. {
  269. close_and_free_remote(EV_A_ remote);
  270. return;
  271. }
  272. ssize_t r = recv(remote->fd, server->buf, BUF_SIZE, 0);
  273. if (r == 0)
  274. {
  275. // connection closed
  276. server->buf_len = 0;
  277. server->buf_idx = 0;
  278. close_and_free_remote(EV_A_ remote);
  279. if (server != NULL)
  280. {
  281. ev_io_start(EV_A_ &server->send_ctx->io);
  282. }
  283. return;
  284. }
  285. else if(r < 0)
  286. {
  287. if (errno == EAGAIN || errno == EWOULDBLOCK)
  288. {
  289. // no data
  290. // continue to wait for recv
  291. return;
  292. }
  293. else
  294. {
  295. ERROR("remote recv");
  296. close_and_free_remote(EV_A_ remote);
  297. close_and_free_server(EV_A_ server);
  298. return;
  299. }
  300. }
  301. server->buf = ss_decrypt(BUF_SIZE, server->buf, &r, server->d_ctx);
  302. if (server->buf == NULL)
  303. {
  304. LOGE("invalid password or cipher");
  305. close_and_free_remote(EV_A_ remote);
  306. close_and_free_server(EV_A_ server);
  307. return;
  308. }
  309. int s = send(server->fd, server->buf, r, 0);
  310. if (s == -1)
  311. {
  312. if (errno == EAGAIN || errno == EWOULDBLOCK)
  313. {
  314. // no data, wait for send
  315. server->buf_len = r;
  316. server->buf_idx = 0;
  317. ev_io_stop(EV_A_ &remote_recv_ctx->io);
  318. ev_io_start(EV_A_ &server->send_ctx->io);
  319. return;
  320. }
  321. else
  322. {
  323. ERROR("send");
  324. close_and_free_remote(EV_A_ remote);
  325. close_and_free_server(EV_A_ server);
  326. return;
  327. }
  328. }
  329. else if (s < r)
  330. {
  331. server->buf_len = r - s;
  332. server->buf_idx = s;
  333. ev_io_stop(EV_A_ &remote_recv_ctx->io);
  334. ev_io_start(EV_A_ &server->send_ctx->io);
  335. return;
  336. }
  337. }
  338. static void remote_send_cb (EV_P_ ev_io *w, int revents)
  339. {
  340. struct remote_ctx *remote_send_ctx = (struct remote_ctx *)w;
  341. struct remote *remote = remote_send_ctx->remote;
  342. struct server *server = remote->server;
  343. if (!remote_send_ctx->connected)
  344. {
  345. struct sockaddr_storage addr;
  346. socklen_t len = sizeof addr;
  347. int r = getpeername(remote->fd, (struct sockaddr*)&addr, &len);
  348. if (r == 0)
  349. {
  350. remote_send_ctx->connected = 1;
  351. ev_io_stop(EV_A_ &remote_send_ctx->io);
  352. ev_timer_stop(EV_A_ &remote_send_ctx->watcher);
  353. // send destaddr
  354. char *ss_addr_to_send = malloc(BUF_SIZE);
  355. ssize_t addr_len = 0;
  356. ss_addr_to_send[addr_len++] = 1;
  357. // handle IP V4 only
  358. size_t in_addr_len = sizeof(struct in_addr);
  359. memcpy(ss_addr_to_send + addr_len, &server->destaddr.sin_addr, in_addr_len);
  360. addr_len += in_addr_len;
  361. memcpy(ss_addr_to_send + addr_len, &server->destaddr.sin_port, 2);
  362. addr_len += 2;
  363. ss_addr_to_send = ss_encrypt(BUF_SIZE, ss_addr_to_send, &addr_len, server->e_ctx);
  364. if (ss_addr_to_send == NULL)
  365. {
  366. LOGE("invalid password or cipher");
  367. close_and_free_remote(EV_A_ remote);
  368. close_and_free_server(EV_A_ server);
  369. return;
  370. }
  371. int s = send(remote->fd, ss_addr_to_send, addr_len, 0);
  372. free(ss_addr_to_send);
  373. if (s < addr_len)
  374. {
  375. LOGE("failed to send remote addr.");
  376. close_and_free_remote(EV_A_ remote);
  377. close_and_free_server(EV_A_ server);
  378. }
  379. ev_io_start(EV_A_ &server->recv_ctx->io);
  380. ev_io_start(EV_A_ &remote->recv_ctx->io);
  381. return;
  382. }
  383. else
  384. {
  385. ERROR("getpeername");
  386. // not connected
  387. close_and_free_remote(EV_A_ remote);
  388. close_and_free_server(EV_A_ server);
  389. return;
  390. }
  391. }
  392. else
  393. {
  394. if (remote->buf_len == 0)
  395. {
  396. // close and free
  397. close_and_free_remote(EV_A_ remote);
  398. close_and_free_server(EV_A_ server);
  399. return;
  400. }
  401. else
  402. {
  403. // has data to send
  404. ssize_t s = send(remote->fd, remote->buf + remote->buf_idx,
  405. remote->buf_len, 0);
  406. if (s < 0)
  407. {
  408. if (errno != EAGAIN && errno != EWOULDBLOCK)
  409. {
  410. ERROR("send");
  411. // close and free
  412. close_and_free_remote(EV_A_ remote);
  413. close_and_free_server(EV_A_ server);
  414. }
  415. return;
  416. }
  417. else if (s < remote->buf_len)
  418. {
  419. // partly sent, move memory, wait for the next time to send
  420. remote->buf_len -= s;
  421. remote->buf_idx += s;
  422. return;
  423. }
  424. else
  425. {
  426. // all sent out, wait for reading
  427. remote->buf_len = 0;
  428. remote->buf_idx = 0;
  429. ev_io_stop(EV_A_ &remote_send_ctx->io);
  430. if (server != NULL)
  431. {
  432. ev_io_start(EV_A_ &server->recv_ctx->io);
  433. }
  434. else
  435. {
  436. close_and_free_remote(EV_A_ remote);
  437. close_and_free_server(EV_A_ server);
  438. return;
  439. }
  440. }
  441. }
  442. }
  443. }
  444. struct remote* new_remote(int fd, int timeout)
  445. {
  446. struct remote *remote;
  447. remote = malloc(sizeof(struct remote));
  448. remote->buf = malloc(BUF_SIZE);
  449. remote->recv_ctx = malloc(sizeof(struct remote_ctx));
  450. remote->send_ctx = malloc(sizeof(struct remote_ctx));
  451. remote->fd = fd;
  452. ev_io_init(&remote->recv_ctx->io, remote_recv_cb, fd, EV_READ);
  453. ev_io_init(&remote->send_ctx->io, remote_send_cb, fd, EV_WRITE);
  454. ev_timer_init(&remote->send_ctx->watcher, remote_timeout_cb, timeout, 0);
  455. remote->recv_ctx->remote = remote;
  456. remote->recv_ctx->connected = 0;
  457. remote->send_ctx->remote = remote;
  458. remote->send_ctx->connected = 0;
  459. remote->buf_len = 0;
  460. remote->buf_idx = 0;
  461. return remote;
  462. }
  463. void free_remote(struct remote *remote)
  464. {
  465. if (remote != NULL)
  466. {
  467. if (remote->server != NULL)
  468. {
  469. remote->server->remote = NULL;
  470. }
  471. if (remote->buf != NULL)
  472. {
  473. free(remote->buf);
  474. }
  475. free(remote->recv_ctx);
  476. free(remote->send_ctx);
  477. free(remote);
  478. }
  479. }
  480. void close_and_free_remote(EV_P_ struct remote *remote)
  481. {
  482. if (remote != NULL)
  483. {
  484. ev_timer_stop(EV_A_ &remote->send_ctx->watcher);
  485. ev_io_stop(EV_A_ &remote->send_ctx->io);
  486. ev_io_stop(EV_A_ &remote->recv_ctx->io);
  487. close(remote->fd);
  488. free_remote(remote);
  489. }
  490. }
  491. struct server* new_server(int fd, int method)
  492. {
  493. struct server *server;
  494. server = malloc(sizeof(struct server));
  495. server->buf = malloc(BUF_SIZE);
  496. server->recv_ctx = malloc(sizeof(struct server_ctx));
  497. server->send_ctx = malloc(sizeof(struct server_ctx));
  498. server->fd = fd;
  499. ev_io_init(&server->recv_ctx->io, server_recv_cb, fd, EV_READ);
  500. ev_io_init(&server->send_ctx->io, server_send_cb, fd, EV_WRITE);
  501. server->recv_ctx->server = server;
  502. server->recv_ctx->connected = 0;
  503. server->send_ctx->server = server;
  504. server->send_ctx->connected = 0;
  505. if (method)
  506. {
  507. server->e_ctx = malloc(sizeof(struct enc_ctx));
  508. server->d_ctx = malloc(sizeof(struct enc_ctx));
  509. enc_ctx_init(method, server->e_ctx, 1);
  510. enc_ctx_init(method, server->d_ctx, 0);
  511. }
  512. else
  513. {
  514. server->e_ctx = NULL;
  515. server->d_ctx = NULL;
  516. }
  517. server->buf_len = 0;
  518. server->buf_idx = 0;
  519. return server;
  520. }
  521. void free_server(struct server *server)
  522. {
  523. if (server != NULL)
  524. {
  525. if (server->remote != NULL)
  526. {
  527. server->remote->server = NULL;
  528. }
  529. if (server->e_ctx != NULL)
  530. {
  531. cipher_context_release(&server->e_ctx->evp);
  532. free(server->e_ctx);
  533. }
  534. if (server->d_ctx != NULL)
  535. {
  536. cipher_context_release(&server->d_ctx->evp);
  537. free(server->d_ctx);
  538. }
  539. if (server->buf != NULL)
  540. {
  541. free(server->buf);
  542. }
  543. free(server->recv_ctx);
  544. free(server->send_ctx);
  545. free(server);
  546. }
  547. }
  548. void close_and_free_server(EV_P_ struct server *server)
  549. {
  550. if (server != NULL)
  551. {
  552. ev_io_stop(EV_A_ &server->send_ctx->io);
  553. ev_io_stop(EV_A_ &server->recv_ctx->io);
  554. close(server->fd);
  555. free_server(server);
  556. }
  557. }
  558. static void accept_cb (EV_P_ ev_io *w, int revents)
  559. {
  560. struct listen_ctx *listener = (struct listen_ctx *)w;
  561. struct sockaddr_in destaddr;
  562. int err;
  563. int clientfd = accept(listener->fd, NULL, NULL);
  564. if (clientfd == -1)
  565. {
  566. ERROR("accept");
  567. return;
  568. }
  569. err = getdestaddr(clientfd, &destaddr);
  570. if (err)
  571. {
  572. ERROR("getdestaddr");
  573. return;
  574. }
  575. setnonblocking(clientfd);
  576. int opt = 1;
  577. setsockopt(clientfd, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt));
  578. #ifdef SO_NOSIGPIPE
  579. setsockopt(clientfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
  580. #endif
  581. struct addrinfo hints, *res;
  582. int sockfd;
  583. memset(&hints, 0, sizeof hints);
  584. hints.ai_family = AF_UNSPEC;
  585. hints.ai_socktype = SOCK_STREAM;
  586. int index = rand() % listener->remote_num;
  587. err = getaddrinfo(listener->remote_addr[index].host, listener->remote_addr[index].port, &hints, &res);
  588. if (err)
  589. {
  590. ERROR("getaddrinfo");
  591. return;
  592. }
  593. sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
  594. if (sockfd < 0)
  595. {
  596. ERROR("socket");
  597. freeaddrinfo(res);
  598. return;
  599. }
  600. setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt));
  601. #ifdef SO_NOSIGPIPE
  602. setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
  603. #endif
  604. // Setup
  605. setnonblocking(sockfd);
  606. struct server *server = new_server(clientfd, listener->method);
  607. struct remote *remote = new_remote(sockfd, listener->timeout);
  608. server->remote = remote;
  609. remote->server = server;
  610. server->destaddr = destaddr;
  611. connect(sockfd, res->ai_addr, res->ai_addrlen);
  612. freeaddrinfo(res);
  613. // listen to remote connected event
  614. ev_io_start(EV_A_ &remote->send_ctx->io);
  615. ev_timer_start(EV_A_ &remote->send_ctx->watcher);
  616. }
  617. int main (int argc, char **argv)
  618. {
  619. int i, c;
  620. int pid_flags = 0;
  621. char *user = NULL;
  622. char *local_port = NULL;
  623. char *local_addr = NULL;
  624. char *password = NULL;
  625. char *timeout = NULL;
  626. char *method = NULL;
  627. char *pid_path = NULL;
  628. char *conf_path = NULL;
  629. int remote_num = 0;
  630. ss_addr_t remote_addr[MAX_REMOTE_NUM];
  631. char *remote_port = NULL;
  632. opterr = 0;
  633. while ((c = getopt (argc, argv, "f:s:p:l:k:t:m:c:b:a:")) != -1)
  634. {
  635. switch (c)
  636. {
  637. case 's':
  638. remote_addr[remote_num].host = optarg;
  639. remote_addr[remote_num++].port = NULL;
  640. break;
  641. case 'p':
  642. remote_port = optarg;
  643. break;
  644. case 'l':
  645. local_port = optarg;
  646. break;
  647. case 'k':
  648. password = optarg;
  649. break;
  650. case 'f':
  651. pid_flags = 1;
  652. pid_path = optarg;
  653. break;
  654. case 't':
  655. timeout = optarg;
  656. break;
  657. case 'm':
  658. method = optarg;
  659. break;
  660. case 'c':
  661. conf_path = optarg;
  662. break;
  663. case 'b':
  664. local_addr = optarg;
  665. break;
  666. case 'a':
  667. user = optarg;
  668. break;
  669. }
  670. }
  671. if (opterr)
  672. {
  673. usage();
  674. exit(EXIT_FAILURE);
  675. }
  676. if (conf_path != NULL)
  677. {
  678. jconf_t *conf = read_jconf(conf_path);
  679. if (remote_num == 0)
  680. {
  681. remote_num = conf->remote_num;
  682. for (i = 0; i < remote_num; i++)
  683. {
  684. remote_addr[i] = conf->remote_addr[i];
  685. }
  686. }
  687. if (remote_port == NULL) remote_port = conf->remote_port;
  688. if (local_addr == NULL) local_addr = conf->local_addr;
  689. if (local_port == NULL) local_port = conf->local_port;
  690. if (password == NULL) password = conf->password;
  691. if (method == NULL) method = conf->method;
  692. if (timeout == NULL) timeout = conf->timeout;
  693. }
  694. if (remote_num == 0 || remote_port == NULL ||
  695. local_port == NULL || password == NULL)
  696. {
  697. usage();
  698. exit(EXIT_FAILURE);
  699. }
  700. if (timeout == NULL) timeout = "10";
  701. if (local_addr == NULL) local_addr = "0.0.0.0";
  702. if (pid_flags)
  703. {
  704. USE_SYSLOG(argv[0]);
  705. daemonize(pid_path);
  706. }
  707. // ignore SIGPIPE
  708. signal(SIGPIPE, SIG_IGN);
  709. signal(SIGABRT, SIG_IGN);
  710. // Setup keys
  711. LOGD("initialize ciphers... %s", method);
  712. int m = enc_init(password, method);
  713. // Setup socket
  714. int listenfd;
  715. listenfd = create_and_bind(local_addr, local_port);
  716. if (listenfd < 0)
  717. {
  718. FATAL("bind() error..");
  719. }
  720. if (listen(listenfd, SOMAXCONN) == -1)
  721. {
  722. FATAL("listen() error.");
  723. }
  724. setnonblocking(listenfd);
  725. LOGD("server listening at port %s.", local_port);
  726. // Setup proxy context
  727. struct listen_ctx listen_ctx;
  728. listen_ctx.remote_num = remote_num;
  729. listen_ctx.remote_addr = malloc(sizeof(ss_addr_t) * remote_num);
  730. while (remote_num > 0)
  731. {
  732. int index = --remote_num;
  733. if (remote_addr[index].port == NULL) remote_addr[index].port = remote_port;
  734. listen_ctx.remote_addr[index] = remote_addr[index];
  735. }
  736. listen_ctx.timeout = atoi(timeout);
  737. listen_ctx.fd = listenfd;
  738. listen_ctx.method = m;
  739. struct ev_loop *loop = ev_default_loop(0);
  740. if (!loop)
  741. {
  742. FATAL("ev_loop error.");
  743. }
  744. ev_io_init (&listen_ctx.io, accept_cb, listenfd, EV_READ);
  745. ev_io_start (loop, &listen_ctx.io);
  746. // setuid
  747. if (user != NULL)
  748. run_as(user);
  749. ev_run (loop, 0);
  750. return 0;
  751. }