Making magic with the network stack
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.

1379 lines
53 KiB

  1. /*
  2. This file is part of NetGuard.
  3. NetGuard is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 3 of the License, or
  6. (at your option) any later version.
  7. NetGuard is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with NetGuard. If not, see <http://www.gnu.org/licenses/>.
  13. Copyright 2015-2019 by Marcel Bokhorst (M66B)
  14. */
  15. #include "netguard.h"
  16. extern char socks5_addr[INET6_ADDRSTRLEN + 1];
  17. extern int socks5_port;
  18. extern char socks5_username[127 + 1];
  19. extern char socks5_password[127 + 1];
  20. extern FILE *pcap_file;
  21. void clear_tcp_data(struct tcp_session *cur) {
  22. struct segment *s = cur->forward;
  23. while (s != NULL) {
  24. struct segment *p = s;
  25. s = s->next;
  26. ng_free(p->data, __FILE__, __LINE__);
  27. ng_free(p, __FILE__, __LINE__);
  28. }
  29. }
  30. int get_tcp_timeout(const struct tcp_session *t, int sessions, int maxsessions) {
  31. int timeout;
  32. if (t->state == TCP_LISTEN || t->state == TCP_SYN_RECV)
  33. timeout = TCP_INIT_TIMEOUT;
  34. else if (t->state == TCP_ESTABLISHED)
  35. timeout = TCP_IDLE_TIMEOUT;
  36. else
  37. timeout = TCP_CLOSE_TIMEOUT;
  38. int scale = 100 - sessions * 100 / maxsessions;
  39. timeout = timeout * scale / 100;
  40. return timeout;
  41. }
  42. int check_tcp_session(const struct arguments *args, struct ng_session *s,
  43. int sessions, int maxsessions) {
  44. time_t now = time(NULL);
  45. char source[INET6_ADDRSTRLEN + 1];
  46. char dest[INET6_ADDRSTRLEN + 1];
  47. if (s->tcp.version == 4) {
  48. inet_ntop(AF_INET, &s->tcp.saddr.ip4, source, sizeof(source));
  49. inet_ntop(AF_INET, &s->tcp.daddr.ip4, dest, sizeof(dest));
  50. } else {
  51. inet_ntop(AF_INET6, &s->tcp.saddr.ip6, source, sizeof(source));
  52. inet_ntop(AF_INET6, &s->tcp.daddr.ip6, dest, sizeof(dest));
  53. }
  54. char session[250];
  55. sprintf(session, "TCP socket from %s/%u to %s/%u %s socket %d",
  56. source, ntohs(s->tcp.source), dest, ntohs(s->tcp.dest),
  57. strstate(s->tcp.state), s->socket);
  58. int timeout = get_tcp_timeout(&s->tcp, sessions, maxsessions);
  59. // Check session timeout
  60. if (s->tcp.state != TCP_CLOSING && s->tcp.state != TCP_CLOSE &&
  61. s->tcp.time + timeout < now) {
  62. log_android(ANDROID_LOG_WARN, "%s idle %d/%d sec ", session, now - s->tcp.time,
  63. timeout);
  64. if (s->tcp.state == TCP_LISTEN)
  65. s->tcp.state = TCP_CLOSING;
  66. else
  67. write_rst(args, &s->tcp);
  68. }
  69. // Check closing sessions
  70. if (s->tcp.state == TCP_CLOSING) {
  71. // eof closes socket
  72. if (s->socket >= 0) {
  73. if (close(s->socket))
  74. log_android(ANDROID_LOG_ERROR, "%s close error %d: %s",
  75. session, errno, strerror(errno));
  76. else
  77. log_android(ANDROID_LOG_WARN, "%s close", session);
  78. s->socket = -1;
  79. }
  80. s->tcp.time = time(NULL);
  81. s->tcp.state = TCP_CLOSE;
  82. }
  83. if ((s->tcp.state == TCP_CLOSING || s->tcp.state == TCP_CLOSE) &&
  84. (s->tcp.sent || s->tcp.received)) {
  85. account_usage(args, s->tcp.version, IPPROTO_TCP,
  86. dest, ntohs(s->tcp.dest), s->tcp.uid, s->tcp.sent, s->tcp.received);
  87. s->tcp.sent = 0;
  88. s->tcp.received = 0;
  89. }
  90. // Cleanup lingering sessions
  91. if (s->tcp.state == TCP_CLOSE && s->tcp.time + TCP_KEEP_TIMEOUT < now)
  92. return 1;
  93. return 0;
  94. }
  95. int monitor_tcp_session(const struct arguments *args, struct ng_session *s, int epoll_fd) {
  96. int recheck = 0;
  97. unsigned int events = EPOLLERR;
  98. if (s->tcp.state == TCP_LISTEN) {
  99. // Check for connected = writable
  100. if (s->tcp.socks5 == SOCKS5_NONE)
  101. events = events | EPOLLOUT;
  102. else
  103. events = events | EPOLLIN;
  104. } else if (s->tcp.state == TCP_ESTABLISHED || s->tcp.state == TCP_CLOSE_WAIT) {
  105. // Check for incoming data
  106. if (get_send_window(&s->tcp) > 0)
  107. events = events | EPOLLIN;
  108. else {
  109. recheck = 1;
  110. long long ms = get_ms();
  111. if (ms - s->tcp.last_keep_alive > EPOLL_MIN_CHECK) {
  112. s->tcp.last_keep_alive = ms;
  113. log_android(ANDROID_LOG_WARN, "Sending keep alive to update send window");
  114. s->tcp.remote_seq--;
  115. write_ack(args, &s->tcp);
  116. s->tcp.remote_seq++;
  117. }
  118. }
  119. // Check for outgoing data
  120. if (s->tcp.forward != NULL) {
  121. uint32_t buffer_size = get_receive_buffer(s);
  122. if (s->tcp.forward->seq == s->tcp.remote_seq &&
  123. s->tcp.forward->len - s->tcp.forward->sent < buffer_size)
  124. events = events | EPOLLOUT;
  125. else
  126. recheck = 1;
  127. }
  128. }
  129. if (events != s->ev.events) {
  130. s->ev.events = events;
  131. if (epoll_ctl(epoll_fd, EPOLL_CTL_MOD, s->socket, &s->ev)) {
  132. s->tcp.state = TCP_CLOSING;
  133. log_android(ANDROID_LOG_ERROR, "epoll mod tcp error %d: %s", errno, strerror(errno));
  134. } else
  135. log_android(ANDROID_LOG_DEBUG, "epoll mod tcp socket %d in %d out %d",
  136. s->socket, (events & EPOLLIN) != 0, (events & EPOLLOUT) != 0);
  137. }
  138. return recheck;
  139. }
  140. uint32_t get_send_window(const struct tcp_session *cur) {
  141. uint32_t behind;
  142. if (cur->acked <= cur->local_seq)
  143. behind = (cur->local_seq - cur->acked);
  144. else
  145. behind = (0x10000 + cur->local_seq - cur->acked);
  146. behind += (cur->unconfirmed + 1) * 40; // Maximum header size
  147. uint32_t total = (behind < cur->send_window ? cur->send_window - behind : 0);
  148. log_android(ANDROID_LOG_DEBUG, "Send window behind %u window %u total %u",
  149. behind, cur->send_window, total);
  150. return total;
  151. }
  152. uint32_t get_receive_buffer(const struct ng_session *cur) {
  153. if (cur->socket < 0)
  154. return 0;
  155. // Get send buffer size
  156. // /proc/sys/net/core/wmem_default
  157. int sendbuf = 0;
  158. int sendbufsize = sizeof(sendbuf);
  159. if (getsockopt(cur->socket, SOL_SOCKET, SO_SNDBUF, &sendbuf, (socklen_t *) &sendbufsize) < 0)
  160. log_android(ANDROID_LOG_WARN, "getsockopt SO_RCVBUF %d: %s", errno, strerror(errno));
  161. if (sendbuf == 0)
  162. sendbuf = SEND_BUF_DEFAULT;
  163. // Get unsent data size
  164. int unsent = 0;
  165. if (ioctl(cur->socket, SIOCOUTQ, &unsent))
  166. log_android(ANDROID_LOG_WARN, "ioctl SIOCOUTQ %d: %s", errno, strerror(errno));
  167. uint32_t total = (uint32_t) (unsent < sendbuf ? sendbuf - unsent : 0);
  168. log_android(ANDROID_LOG_DEBUG, "Send buffer %u unsent %u total %u",
  169. sendbuf, unsent, total);
  170. return total;
  171. }
  172. uint32_t get_receive_window(const struct ng_session *cur) {
  173. // Get data to forward size
  174. uint32_t toforward = 0;
  175. struct segment *q = cur->tcp.forward;
  176. while (q != NULL) {
  177. toforward += (q->len - q->sent);
  178. q = q->next;
  179. }
  180. uint32_t window = get_receive_buffer(cur);
  181. uint32_t max = ((uint32_t) 0xFFFF) << cur->tcp.recv_scale;
  182. if (window > max) {
  183. log_android(ANDROID_LOG_DEBUG, "Receive window %u > max %u", window, max);
  184. window = max;
  185. }
  186. uint32_t total = (toforward < window ? window - toforward : 0);
  187. log_android(ANDROID_LOG_DEBUG, "Receive window toforward %u window %u total %u",
  188. toforward, window, total);
  189. return total;
  190. }
  191. void check_tcp_socket(const struct arguments *args,
  192. const struct epoll_event *ev,
  193. const int epoll_fd) {
  194. struct ng_session *s = (struct ng_session *) ev->data.ptr;
  195. int oldstate = s->tcp.state;
  196. uint32_t oldlocal = s->tcp.local_seq;
  197. uint32_t oldremote = s->tcp.remote_seq;
  198. char source[INET6_ADDRSTRLEN + 1];
  199. char dest[INET6_ADDRSTRLEN + 1];
  200. if (s->tcp.version == 4) {
  201. inet_ntop(AF_INET, &s->tcp.saddr.ip4, source, sizeof(source));
  202. inet_ntop(AF_INET, &s->tcp.daddr.ip4, dest, sizeof(dest));
  203. } else {
  204. inet_ntop(AF_INET6, &s->tcp.saddr.ip6, source, sizeof(source));
  205. inet_ntop(AF_INET6, &s->tcp.daddr.ip6, dest, sizeof(dest));
  206. }
  207. char session[250];
  208. sprintf(session, "TCP socket from %s/%u to %s/%u %s loc %u rem %u",
  209. source, ntohs(s->tcp.source), dest, ntohs(s->tcp.dest),
  210. strstate(s->tcp.state),
  211. s->tcp.local_seq - s->tcp.local_start,
  212. s->tcp.remote_seq - s->tcp.remote_start);
  213. // Check socket error
  214. if (ev->events & EPOLLERR) {
  215. s->tcp.time = time(NULL);
  216. int serr = 0;
  217. socklen_t optlen = sizeof(int);
  218. int err = getsockopt(s->socket, SOL_SOCKET, SO_ERROR, &serr, &optlen);
  219. if (err < 0)
  220. log_android(ANDROID_LOG_ERROR, "%s getsockopt error %d: %s",
  221. session, errno, strerror(errno));
  222. else if (serr)
  223. log_android(ANDROID_LOG_ERROR, "%s SO_ERROR %d: %s",
  224. session, serr, strerror(serr));
  225. write_rst(args, &s->tcp);
  226. // Connection refused
  227. if (0)
  228. if (err >= 0 && (serr == ECONNREFUSED || serr == EHOSTUNREACH)) {
  229. struct icmp icmp;
  230. memset(&icmp, 0, sizeof(struct icmp));
  231. icmp.icmp_type = ICMP_UNREACH;
  232. if (serr == ECONNREFUSED)
  233. icmp.icmp_code = ICMP_UNREACH_PORT;
  234. else
  235. icmp.icmp_code = ICMP_UNREACH_HOST;
  236. icmp.icmp_cksum = 0;
  237. icmp.icmp_cksum = ~calc_checksum(0, (const uint8_t *) &icmp, 4);
  238. struct icmp_session sicmp;
  239. memset(&sicmp, 0, sizeof(struct icmp_session));
  240. sicmp.version = s->tcp.version;
  241. if (s->tcp.version == 4) {
  242. sicmp.saddr.ip4 = (__be32) s->tcp.saddr.ip4;
  243. sicmp.daddr.ip4 = (__be32) s->tcp.daddr.ip4;
  244. } else {
  245. memcpy(&sicmp.saddr.ip6, &s->tcp.saddr.ip6, 16);
  246. memcpy(&sicmp.daddr.ip6, &s->tcp.daddr.ip6, 16);
  247. }
  248. write_icmp(args, &sicmp, (uint8_t *) &icmp, 8);
  249. }
  250. } else {
  251. // Assume socket okay
  252. if (s->tcp.state == TCP_LISTEN) {
  253. // Check socket connect
  254. if (s->tcp.socks5 == SOCKS5_NONE) {
  255. if (ev->events & EPOLLOUT) {
  256. log_android(ANDROID_LOG_INFO, "%s connected", session);
  257. // https://tools.ietf.org/html/rfc1928
  258. // https://tools.ietf.org/html/rfc1929
  259. // https://en.wikipedia.org/wiki/SOCKS#SOCKS5
  260. if (*socks5_addr && socks5_port)
  261. s->tcp.socks5 = SOCKS5_HELLO;
  262. else
  263. s->tcp.socks5 = SOCKS5_CONNECTED;
  264. }
  265. } else {
  266. if (ev->events & EPOLLIN) {
  267. uint8_t buffer[32];
  268. ssize_t bytes = recv(s->socket, buffer, sizeof(buffer), 0);
  269. if (bytes < 0) {
  270. log_android(ANDROID_LOG_ERROR, "%s recv SOCKS5 error %d: %s",
  271. session, errno, strerror(errno));
  272. write_rst(args, &s->tcp);
  273. } else {
  274. char *h = hex(buffer, (const size_t) bytes);
  275. log_android(ANDROID_LOG_INFO, "%s recv SOCKS5 %s", session, h);
  276. ng_free(h, __FILE__, __LINE__);
  277. if (s->tcp.socks5 == SOCKS5_HELLO &&
  278. bytes == 2 && buffer[0] == 5) {
  279. if (buffer[1] == 0)
  280. s->tcp.socks5 = SOCKS5_CONNECT;
  281. else if (buffer[1] == 2)
  282. s->tcp.socks5 = SOCKS5_AUTH;
  283. else {
  284. s->tcp.socks5 = 0;
  285. log_android(ANDROID_LOG_ERROR, "%s SOCKS5 auth %d not supported",
  286. session, buffer[1]);
  287. write_rst(args, &s->tcp);
  288. }
  289. } else if (s->tcp.socks5 == SOCKS5_AUTH &&
  290. bytes == 2 &&
  291. (buffer[0] == 1 || buffer[0] == 5)) {
  292. if (buffer[1] == 0) {
  293. s->tcp.socks5 = SOCKS5_CONNECT;
  294. log_android(ANDROID_LOG_WARN, "%s SOCKS5 auth OK", session);
  295. } else {
  296. s->tcp.socks5 = 0;
  297. log_android(ANDROID_LOG_ERROR, "%s SOCKS5 auth error %d",
  298. session, buffer[1]);
  299. write_rst(args, &s->tcp);
  300. }
  301. } else if (s->tcp.socks5 == SOCKS5_CONNECT &&
  302. bytes == 6 + (s->tcp.version == 4 ? 4 : 16) &&
  303. buffer[0] == 5) {
  304. if (buffer[1] == 0) {
  305. s->tcp.socks5 = SOCKS5_CONNECTED;
  306. log_android(ANDROID_LOG_WARN, "%s SOCKS5 connected", session);
  307. } else {
  308. s->tcp.socks5 = 0;
  309. log_android(ANDROID_LOG_ERROR, "%s SOCKS5 connect error %d",
  310. session, buffer[1]);
  311. write_rst(args, &s->tcp);
  312. /*
  313. 0x00 = request granted
  314. 0x01 = general failure
  315. 0x02 = connection not allowed by ruleset
  316. 0x03 = network unreachable
  317. 0x04 = host unreachable
  318. 0x05 = connection refused by destination host
  319. 0x06 = TTL expired
  320. 0x07 = command not supported / protocol error
  321. 0x08 = address type not supported
  322. */
  323. }
  324. } else {
  325. s->tcp.socks5 = 0;
  326. log_android(ANDROID_LOG_ERROR, "%s recv SOCKS5 state %d",
  327. session, s->tcp.socks5);
  328. write_rst(args, &s->tcp);
  329. }
  330. }
  331. }
  332. }
  333. if (s->tcp.socks5 == SOCKS5_HELLO) {
  334. uint8_t buffer[4] = {5, 2, 0, 2};
  335. char *h = hex(buffer, sizeof(buffer));
  336. log_android(ANDROID_LOG_INFO, "%s sending SOCKS5 hello: %s",
  337. session, h);
  338. ng_free(h, __FILE__, __LINE__);
  339. ssize_t sent = send(s->socket, buffer, sizeof(buffer), MSG_NOSIGNAL);
  340. if (sent < 0) {
  341. log_android(ANDROID_LOG_ERROR, "%s send SOCKS5 hello error %d: %s",
  342. session, errno, strerror(errno));
  343. write_rst(args, &s->tcp);
  344. }
  345. } else if (s->tcp.socks5 == SOCKS5_AUTH) {
  346. uint8_t ulen = strlen(socks5_username);
  347. uint8_t plen = strlen(socks5_password);
  348. uint8_t buffer[512];
  349. *(buffer + 0) = 1; // Version
  350. *(buffer + 1) = ulen;
  351. memcpy(buffer + 2, socks5_username, ulen);
  352. *(buffer + 2 + ulen) = plen;
  353. memcpy(buffer + 2 + ulen + 1, socks5_password, plen);
  354. size_t len = 2 + ulen + 1 + plen;
  355. char *h = hex(buffer, len);
  356. log_android(ANDROID_LOG_INFO, "%s sending SOCKS5 auth: %s",
  357. session, h);
  358. ng_free(h, __FILE__, __LINE__);
  359. ssize_t sent = send(s->socket, buffer, len, MSG_NOSIGNAL);
  360. if (sent < 0) {
  361. log_android(ANDROID_LOG_ERROR,
  362. "%s send SOCKS5 connect error %d: %s",
  363. session, errno, strerror(errno));
  364. write_rst(args, &s->tcp);
  365. }
  366. } else if (s->tcp.socks5 == SOCKS5_CONNECT) {
  367. uint8_t buffer[22];
  368. *(buffer + 0) = 5; // version
  369. *(buffer + 1) = 1; // TCP/IP stream connection
  370. *(buffer + 2) = 0; // reserved
  371. *(buffer + 3) = (uint8_t) (s->tcp.version == 4 ? 1 : 4);
  372. if (s->tcp.version == 4) {
  373. memcpy(buffer + 4, &s->tcp.daddr.ip4, 4);
  374. *((__be16 *) (buffer + 4 + 4)) = s->tcp.dest;
  375. } else {
  376. memcpy(buffer + 4, &s->tcp.daddr.ip6, 16);
  377. *((__be16 *) (buffer + 4 + 16)) = s->tcp.dest;
  378. }
  379. size_t len = (s->tcp.version == 4 ? 10 : 22);
  380. char *h = hex(buffer, len);
  381. log_android(ANDROID_LOG_INFO, "%s sending SOCKS5 connect: %s",
  382. session, h);
  383. ng_free(h, __FILE__, __LINE__);
  384. ssize_t sent = send(s->socket, buffer, len, MSG_NOSIGNAL);
  385. if (sent < 0) {
  386. log_android(ANDROID_LOG_ERROR,
  387. "%s send SOCKS5 connect error %d: %s",
  388. session, errno, strerror(errno));
  389. write_rst(args, &s->tcp);
  390. }
  391. } else if (s->tcp.socks5 == SOCKS5_CONNECTED) {
  392. s->tcp.remote_seq++; // remote SYN
  393. if (write_syn_ack(args, &s->tcp) >= 0) {
  394. s->tcp.time = time(NULL);
  395. s->tcp.local_seq++; // local SYN
  396. s->tcp.state = TCP_SYN_RECV;
  397. }
  398. }
  399. } else {
  400. // Always forward data
  401. int fwd = 0;
  402. if (ev->events & EPOLLOUT) {
  403. // Forward data
  404. uint32_t buffer_size = get_receive_buffer(s);
  405. while (s->tcp.forward != NULL &&
  406. s->tcp.forward->seq == s->tcp.remote_seq &&
  407. s->tcp.forward->len - s->tcp.forward->sent < buffer_size) {
  408. log_android(ANDROID_LOG_DEBUG, "%s fwd %u...%u sent %u",
  409. session,
  410. s->tcp.forward->seq - s->tcp.remote_start,
  411. s->tcp.forward->seq + s->tcp.forward->len - s->tcp.remote_start,
  412. s->tcp.forward->sent);
  413. ssize_t sent = send(s->socket,
  414. s->tcp.forward->data + s->tcp.forward->sent,
  415. s->tcp.forward->len - s->tcp.forward->sent,
  416. (unsigned int) (MSG_NOSIGNAL | (s->tcp.forward->psh
  417. ? 0
  418. : MSG_MORE)));
  419. if (sent < 0) {
  420. log_android(ANDROID_LOG_ERROR, "%s send error %d: %s",
  421. session, errno, strerror(errno));
  422. if (errno == EINTR || errno == EAGAIN) {
  423. // Retry later
  424. break;
  425. } else {
  426. write_rst(args, &s->tcp);
  427. break;
  428. }
  429. } else {
  430. fwd = 1;
  431. buffer_size -= sent;
  432. s->tcp.sent += sent;
  433. s->tcp.forward->sent += sent;
  434. if (s->tcp.forward->len == s->tcp.forward->sent) {
  435. s->tcp.remote_seq = s->tcp.forward->seq + s->tcp.forward->sent;
  436. struct segment *p = s->tcp.forward;
  437. s->tcp.forward = s->tcp.forward->next;
  438. ng_free(p->data, __FILE__, __LINE__);
  439. ng_free(p, __FILE__, __LINE__);
  440. } else {
  441. log_android(ANDROID_LOG_WARN,
  442. "%s partial send %u/%u",
  443. session, s->tcp.forward->sent, s->tcp.forward->len);
  444. break;
  445. }
  446. }
  447. }
  448. // Log data buffered
  449. struct segment *seg = s->tcp.forward;
  450. while (seg != NULL) {
  451. log_android(ANDROID_LOG_WARN, "%s queued %u...%u sent %u",
  452. session,
  453. seg->seq - s->tcp.remote_start,
  454. seg->seq + seg->len - s->tcp.remote_start,
  455. seg->sent);
  456. seg = seg->next;
  457. }
  458. }
  459. // Get receive window
  460. uint32_t window = get_receive_window(s);
  461. uint32_t prev = s->tcp.recv_window;
  462. s->tcp.recv_window = window;
  463. if ((prev == 0 && window > 0) || (prev > 0 && window == 0))
  464. log_android(ANDROID_LOG_WARN, "%s recv window %u > %u",
  465. session, prev, window);
  466. // Acknowledge forwarded data
  467. if (fwd || (prev == 0 && window > 0)) {
  468. if (fwd && s->tcp.forward == NULL && s->tcp.state == TCP_CLOSE_WAIT) {
  469. log_android(ANDROID_LOG_WARN, "%s confirm FIN", session);
  470. s->tcp.remote_seq++; // remote FIN
  471. }
  472. if (write_ack(args, &s->tcp) >= 0)
  473. s->tcp.time = time(NULL);
  474. }
  475. if (s->tcp.state == TCP_ESTABLISHED || s->tcp.state == TCP_CLOSE_WAIT) {
  476. // Check socket read
  477. // Send window can be changed in the mean time
  478. uint32_t send_window = get_send_window(&s->tcp);
  479. if ((ev->events & EPOLLIN) && send_window > 0) {
  480. s->tcp.time = time(NULL);
  481. uint32_t buffer_size = (send_window > s->tcp.mss
  482. ? s->tcp.mss : send_window);
  483. uint8_t *buffer = ng_malloc(buffer_size, "tcp socket");
  484. ssize_t bytes = recv(s->socket, buffer, (size_t) buffer_size, 0);
  485. if (bytes < 0) {
  486. // Socket error
  487. log_android(ANDROID_LOG_ERROR, "%s recv error %d: %s",
  488. session, errno, strerror(errno));
  489. if (errno != EINTR && errno != EAGAIN)
  490. write_rst(args, &s->tcp);
  491. } else if (bytes == 0) {
  492. log_android(ANDROID_LOG_WARN, "%s recv eof", session);
  493. if (s->tcp.forward == NULL) {
  494. if (write_fin_ack(args, &s->tcp) >= 0) {
  495. log_android(ANDROID_LOG_WARN, "%s FIN sent", session);
  496. s->tcp.local_seq++; // local FIN
  497. }
  498. if (s->tcp.state == TCP_ESTABLISHED)
  499. s->tcp.state = TCP_FIN_WAIT1;
  500. else if (s->tcp.state == TCP_CLOSE_WAIT)
  501. s->tcp.state = TCP_LAST_ACK;
  502. else
  503. log_android(ANDROID_LOG_ERROR, "%s invalid close", session);
  504. } else {
  505. // There was still data to send
  506. log_android(ANDROID_LOG_ERROR, "%s close with queue", session);
  507. write_rst(args, &s->tcp);
  508. }
  509. if (close(s->socket))
  510. log_android(ANDROID_LOG_ERROR, "%s close error %d: %s",
  511. session, errno, strerror(errno));
  512. s->socket = -1;
  513. } else {
  514. // Socket read data
  515. log_android(ANDROID_LOG_DEBUG, "%s recv bytes %d", session, bytes);
  516. s->tcp.received += bytes;
  517. // Process DNS response
  518. if (ntohs(s->tcp.dest) == 53 && bytes > 2) {
  519. ssize_t dlen = bytes - 2;
  520. parse_dns_response(args, s, buffer + 2, (size_t *) &dlen);
  521. }
  522. // Forward to tun
  523. if (write_data(args, &s->tcp, buffer, (size_t) bytes) >= 0) {
  524. s->tcp.local_seq += bytes;
  525. s->tcp.unconfirmed++;
  526. }
  527. }
  528. ng_free(buffer, __FILE__, __LINE__);
  529. }
  530. }
  531. }
  532. }
  533. if (s->tcp.state != oldstate || s->tcp.local_seq != oldlocal ||
  534. s->tcp.remote_seq != oldremote)
  535. log_android(ANDROID_LOG_DEBUG, "%s new state", session);
  536. }
  537. jboolean handle_tcp(const struct arguments *args,
  538. const uint8_t *pkt, size_t length,
  539. const uint8_t *payload,
  540. int uid, int allowed, struct allowed *redirect,
  541. const int epoll_fd) {
  542. // Get headers
  543. const uint8_t version = (*pkt) >> 4;
  544. const struct iphdr *ip4 = (struct iphdr *) pkt;
  545. const struct ip6_hdr *ip6 = (struct ip6_hdr *) pkt;
  546. const struct tcphdr *tcphdr = (struct tcphdr *) payload;
  547. const uint8_t tcpoptlen = (uint8_t) ((tcphdr->doff - 5) * 4);
  548. const uint8_t *tcpoptions = payload + sizeof(struct tcphdr);
  549. const uint8_t *data = payload + sizeof(struct tcphdr) + tcpoptlen;
  550. const uint16_t datalen = (const uint16_t) (length - (data - pkt));
  551. // Search session
  552. struct ng_session *cur = args->ctx->ng_session;
  553. while (cur != NULL &&
  554. !(cur->protocol == IPPROTO_TCP &&
  555. cur->tcp.version == version &&
  556. cur->tcp.source == tcphdr->source && cur->tcp.dest == tcphdr->dest &&
  557. (version == 4 ? cur->tcp.saddr.ip4 == ip4->saddr &&
  558. cur->tcp.daddr.ip4 == ip4->daddr
  559. : memcmp(&cur->tcp.saddr.ip6, &ip6->ip6_src, 16) == 0 &&
  560. memcmp(&cur->tcp.daddr.ip6, &ip6->ip6_dst, 16) == 0)))
  561. cur = cur->next;
  562. // Prepare logging
  563. char source[INET6_ADDRSTRLEN + 1];
  564. char dest[INET6_ADDRSTRLEN + 1];
  565. if (version == 4) {
  566. inet_ntop(AF_INET, &ip4->saddr, source, sizeof(source));
  567. inet_ntop(AF_INET, &ip4->daddr, dest, sizeof(dest));
  568. } else {
  569. inet_ntop(AF_INET6, &ip6->ip6_src, source, sizeof(source));
  570. inet_ntop(AF_INET6, &ip6->ip6_dst, dest, sizeof(dest));
  571. }
  572. char flags[10];
  573. int flen = 0;
  574. if (tcphdr->syn)
  575. flags[flen++] = 'S';
  576. if (tcphdr->ack)
  577. flags[flen++] = 'A';
  578. if (tcphdr->psh)
  579. flags[flen++] = 'P';
  580. if (tcphdr->fin)
  581. flags[flen++] = 'F';
  582. if (tcphdr->rst)
  583. flags[flen++] = 'R';
  584. if (tcphdr->urg)
  585. flags[flen++] = 'U';
  586. flags[flen] = 0;
  587. char packet[250];
  588. sprintf(packet,
  589. "TCP %s %s/%u > %s/%u seq %u ack %u data %u win %u uid %d",
  590. flags,
  591. source, ntohs(tcphdr->source),
  592. dest, ntohs(tcphdr->dest),
  593. ntohl(tcphdr->seq) - (cur == NULL ? 0 : cur->tcp.remote_start),
  594. tcphdr->ack ? ntohl(tcphdr->ack_seq) - (cur == NULL ? 0 : cur->tcp.local_start) : 0,
  595. datalen, ntohs(tcphdr->window), uid);
  596. log_android(tcphdr->urg ? ANDROID_LOG_WARN : ANDROID_LOG_DEBUG, packet);
  597. log_android(ANDROID_LOG_ERROR,"handling TCP with source: %s, dest: %s", source, dest);
  598. // Drop URG data
  599. if (tcphdr->urg)
  600. return 1;
  601. // Check session
  602. if (cur == NULL) {
  603. if (tcphdr->syn) {
  604. // Decode options
  605. // http://www.iana.org/assignments/tcp-parameters/tcp-parameters.xhtml#tcp-parameters-1
  606. uint16_t mss = get_default_mss(version);
  607. uint8_t ws = 0;
  608. int optlen = tcpoptlen;
  609. uint8_t *options = (uint8_t *) tcpoptions;
  610. while (optlen > 0) {
  611. uint8_t kind = *options;
  612. uint8_t len = *(options + 1);
  613. if (kind == 0) // End of options list
  614. break;
  615. if (kind == 2 && len == 4)
  616. mss = ntohs(*((uint16_t *) (options + 2)));
  617. else if (kind == 3 && len == 3)
  618. ws = *(options + 2);
  619. if (kind == 1) {
  620. optlen--;
  621. options++;
  622. } else {
  623. optlen -= len;
  624. options += len;
  625. }
  626. }
  627. log_android(ANDROID_LOG_ERROR, "%s new session mss %u ws %u window %u, tcp doff: %u",
  628. packet, mss, ws, ntohs(tcphdr->window) << ws, tcphdr->doff);
  629. // Register session
  630. struct ng_session *s = ng_malloc(sizeof(struct ng_session), "tcp session");
  631. s->protocol = IPPROTO_TCP;
  632. s->tcp.time = time(NULL);
  633. s->tcp.uid = uid;
  634. s->tcp.version = version;
  635. s->tcp.mss = mss;
  636. s->tcp.recv_scale = ws;
  637. s->tcp.send_scale = ws;
  638. s->tcp.send_window = ((uint32_t) ntohs(tcphdr->window)) << s->tcp.send_scale;
  639. s->tcp.unconfirmed = 0;
  640. s->tcp.remote_seq = ntohl(tcphdr->seq); // ISN remote
  641. s->tcp.local_seq = (uint32_t) rand(); // ISN local
  642. s->tcp.remote_start = s->tcp.remote_seq;
  643. s->tcp.local_start = s->tcp.local_seq;
  644. s->tcp.acked = 0;
  645. s->tcp.last_keep_alive = 0;
  646. s->tcp.sent = 0;
  647. s->tcp.received = 0;
  648. if (version == 4) {
  649. s->tcp.saddr.ip4 = (__be32) ip4->saddr;
  650. s->tcp.daddr.ip4 = (__be32) ip4->daddr;
  651. } else {
  652. memcpy(&s->tcp.saddr.ip6, &ip6->ip6_src, 16);
  653. memcpy(&s->tcp.daddr.ip6, &ip6->ip6_dst, 16);
  654. }
  655. s->tcp.source = tcphdr->source;
  656. s->tcp.dest = tcphdr->dest;
  657. s->tcp.state = TCP_LISTEN;
  658. s->tcp.socks5 = SOCKS5_NONE;
  659. s->tcp.forward = NULL;
  660. s->next = NULL;
  661. if (datalen) {
  662. log_android(ANDROID_LOG_ERROR, "%s some SYN data", packet);
  663. s->tcp.forward = ng_malloc(sizeof(struct segment), "syn segment");
  664. s->tcp.forward->seq = s->tcp.remote_seq;
  665. s->tcp.forward->len = datalen;
  666. s->tcp.forward->sent = 0;
  667. s->tcp.forward->psh = tcphdr->psh;
  668. s->tcp.forward->data = ng_malloc(datalen, "syn segment data");
  669. memcpy(s->tcp.forward->data, data, datalen);
  670. s->tcp.forward->next = NULL;
  671. }
  672. // Open socket
  673. s->socket = open_tcp_socket(args, &s->tcp, redirect);
  674. if (s->socket < 0) {
  675. // Remote might retry
  676. ng_free(s, __FILE__, __LINE__);
  677. return 0;
  678. }
  679. s->tcp.recv_window = get_receive_window(s);
  680. log_android(ANDROID_LOG_DEBUG, "TCP socket %d lport %d",
  681. s->socket, get_local_port(s->socket));
  682. // Monitor events
  683. memset(&s->ev, 0, sizeof(struct epoll_event));
  684. s->ev.events = EPOLLOUT | EPOLLERR;
  685. s->ev.data.ptr = s;
  686. log_android(ANDROID_LOG_ERROR, "FULL adding epoll monitor events: %d", epoll_fd);
  687. if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, s->socket, &s->ev))
  688. log_android(ANDROID_LOG_ERROR, "epoll add tcp error %d: %s",
  689. errno, strerror(errno));
  690. s->next = args->ctx->ng_session;
  691. args->ctx->ng_session = s;
  692. if (!allowed) {
  693. log_android(ANDROID_LOG_WARN, "%s resetting blocked session", packet);
  694. write_rst(args, &s->tcp);
  695. }
  696. } else {
  697. log_android(ANDROID_LOG_WARN, "%s unknown session", packet);
  698. struct tcp_session rst;
  699. memset(&rst, 0, sizeof(struct tcp_session));
  700. rst.version = version;
  701. rst.local_seq = ntohl(tcphdr->ack_seq);
  702. rst.remote_seq = ntohl(tcphdr->seq) + datalen + (tcphdr->syn || tcphdr->fin ? 1 : 0);
  703. if (version == 4) {
  704. rst.saddr.ip4 = (__be32) ip4->saddr;
  705. rst.daddr.ip4 = (__be32) ip4->daddr;
  706. } else {
  707. memcpy(&rst.saddr.ip6, &ip6->ip6_src, 16);
  708. memcpy(&rst.daddr.ip6, &ip6->ip6_dst, 16);
  709. }
  710. rst.source = tcphdr->source;
  711. rst.dest = tcphdr->dest;
  712. write_rst(args, &rst);
  713. return 0;
  714. }
  715. } else {
  716. char session[250];
  717. sprintf(session,
  718. "%s %s loc %u rem %u acked %u",
  719. packet,
  720. strstate(cur->tcp.state),
  721. cur->tcp.local_seq - cur->tcp.local_start,
  722. cur->tcp.remote_seq - cur->tcp.remote_start,
  723. cur->tcp.acked - cur->tcp.local_start);
  724. // Session found
  725. if (cur->tcp.state == TCP_CLOSING || cur->tcp.state == TCP_CLOSE) {
  726. log_android(ANDROID_LOG_WARN, "%s was closed", session);
  727. write_rst(args, &cur->tcp);
  728. return 0;
  729. } else {
  730. int oldstate = cur->tcp.state;
  731. uint32_t oldlocal = cur->tcp.local_seq;
  732. uint32_t oldremote = cur->tcp.remote_seq;
  733. log_android(ANDROID_LOG_DEBUG, "%s handling", session);
  734. if (!tcphdr->syn)
  735. cur->tcp.time = time(NULL);
  736. cur->tcp.send_window = ((uint32_t) ntohs(tcphdr->window)) << cur->tcp.send_scale;
  737. cur->tcp.unconfirmed = 0;
  738. // Do not change the order of the conditions
  739. // Queue data to forward
  740. if (datalen) {
  741. if (cur->socket < 0) {
  742. log_android(ANDROID_LOG_ERROR, "%s data while local closed", session);
  743. write_rst(args, &cur->tcp);
  744. return 0;
  745. }
  746. if (cur->tcp.state == TCP_CLOSE_WAIT) {
  747. log_android(ANDROID_LOG_ERROR, "%s data while remote closed", session);
  748. write_rst(args, &cur->tcp);
  749. return 0;
  750. }
  751. queue_tcp(args, tcphdr, session, &cur->tcp, data, datalen);
  752. }
  753. if (tcphdr->rst /* +ACK */) {
  754. // No sequence check
  755. // http://tools.ietf.org/html/rfc1122#page-87
  756. log_android(ANDROID_LOG_WARN, "%s received reset", session);
  757. cur->tcp.state = TCP_CLOSING;
  758. return 0;
  759. } else {
  760. if (!tcphdr->ack || ntohl(tcphdr->ack_seq) == cur->tcp.local_seq) {
  761. if (tcphdr->syn) {
  762. log_android(ANDROID_LOG_WARN, "%s repeated SYN", session);
  763. // The socket is probably not opened yet
  764. } else if (tcphdr->fin /* +ACK */) {
  765. if (cur->tcp.state == TCP_ESTABLISHED) {
  766. log_android(ANDROID_LOG_WARN, "%s FIN received", session);
  767. if (cur->tcp.forward == NULL) {
  768. cur->tcp.remote_seq++; // remote FIN
  769. if (write_ack(args, &cur->tcp) >= 0)
  770. cur->tcp.state = TCP_CLOSE_WAIT;
  771. } else
  772. cur->tcp.state = TCP_CLOSE_WAIT;
  773. } else if (cur->tcp.state == TCP_CLOSE_WAIT) {
  774. log_android(ANDROID_LOG_WARN, "%s repeated FIN", session);
  775. // The socket is probably not closed yet
  776. } else if (cur->tcp.state == TCP_FIN_WAIT1) {
  777. log_android(ANDROID_LOG_WARN, "%s last ACK", session);
  778. cur->tcp.remote_seq++; // remote FIN
  779. if (write_ack(args, &cur->tcp) >= 0)
  780. cur->tcp.state = TCP_CLOSE;
  781. } else {
  782. log_android(ANDROID_LOG_ERROR, "%s invalid FIN", session);
  783. return 0;
  784. }
  785. } else if (tcphdr->ack) {
  786. cur->tcp.acked = ntohl(tcphdr->ack_seq);
  787. if (cur->tcp.state == TCP_SYN_RECV)
  788. cur->tcp.state = TCP_ESTABLISHED;
  789. else if (cur->tcp.state == TCP_ESTABLISHED) {
  790. // Do nothing
  791. } else if (cur->tcp.state == TCP_LAST_ACK)
  792. cur->tcp.state = TCP_CLOSING;
  793. else if (cur->tcp.state == TCP_CLOSE_WAIT) {
  794. // ACK after FIN/ACK
  795. } else if (cur->tcp.state == TCP_FIN_WAIT1) {
  796. // Do nothing
  797. } else {
  798. log_android(ANDROID_LOG_ERROR, "%s invalid state", session);
  799. return 0;
  800. }
  801. } else {
  802. log_android(ANDROID_LOG_ERROR, "%s unknown packet", session);
  803. return 0;
  804. }
  805. } else {
  806. uint32_t ack = ntohl(tcphdr->ack_seq);
  807. if ((uint32_t) (ack + 1) == cur->tcp.local_seq) {
  808. // Keep alive
  809. if (cur->tcp.state == TCP_ESTABLISHED) {
  810. int on = 1;
  811. if (setsockopt(cur->socket, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on)))
  812. log_android(ANDROID_LOG_ERROR,
  813. "%s setsockopt SO_KEEPALIVE error %d: %s",
  814. session, errno, strerror(errno));
  815. else
  816. log_android(ANDROID_LOG_WARN, "%s enabled keep alive", session);
  817. } else
  818. log_android(ANDROID_LOG_WARN, "%s keep alive", session);
  819. } else if (compare_u32(ack, cur->tcp.local_seq) < 0) {
  820. if (compare_u32(ack, cur->tcp.acked) <= 0)
  821. log_android(
  822. ack == cur->tcp.acked ? ANDROID_LOG_WARN : ANDROID_LOG_ERROR,
  823. "%s repeated ACK %u/%u",
  824. session,
  825. ack - cur->tcp.local_start,
  826. cur->tcp.acked - cur->tcp.local_start);
  827. else {
  828. log_android(ANDROID_LOG_WARN, "%s previous ACK %u",
  829. session, ack - cur->tcp.local_seq);
  830. cur->tcp.acked = ack;
  831. }
  832. return 1;
  833. } else {
  834. log_android(ANDROID_LOG_ERROR, "%s future ACK", session);
  835. write_rst(args, &cur->tcp);
  836. return 0;
  837. }
  838. }
  839. }
  840. if (cur->tcp.state != oldstate ||
  841. cur->tcp.local_seq != oldlocal ||
  842. cur->tcp.remote_seq != oldremote)
  843. log_android(ANDROID_LOG_INFO, "%s > %s loc %u rem %u",
  844. session,
  845. strstate(cur->tcp.state),
  846. cur->tcp.local_seq - cur->tcp.local_start,
  847. cur->tcp.remote_seq - cur->tcp.remote_start);
  848. }
  849. }
  850. return 1;
  851. }
  852. void queue_tcp(const struct arguments *args,
  853. const struct tcphdr *tcphdr,
  854. const char *session, struct tcp_session *cur,
  855. const uint8_t *data, uint16_t datalen) {
  856. uint32_t seq = ntohl(tcphdr->seq);
  857. if (compare_u32(seq, cur->remote_seq) < 0)
  858. log_android(ANDROID_LOG_WARN, "%s already forwarded %u..%u",
  859. session,
  860. seq - cur->remote_start, seq + datalen - cur->remote_start);
  861. else {
  862. struct segment *p = NULL;
  863. struct segment *s = cur->forward;
  864. while (s != NULL && compare_u32(s->seq, seq) < 0) {
  865. p = s;
  866. s = s->next;
  867. }
  868. if (s == NULL || compare_u32(s->seq, seq) > 0) {
  869. log_android(ANDROID_LOG_DEBUG, "%s queuing %u...%u",
  870. session,
  871. seq - cur->remote_start, seq + datalen - cur->remote_start);
  872. struct segment *n = ng_malloc(sizeof(struct segment), "tcp segment");
  873. n->seq = seq;
  874. n->len = datalen;
  875. n->sent = 0;
  876. n->psh = tcphdr->psh;
  877. n->data = ng_malloc(datalen, "tcp segment");
  878. memcpy(n->data, data, datalen);
  879. n->next = s;
  880. if (p == NULL)
  881. cur->forward = n;
  882. else
  883. p->next = n;
  884. } else if (s != NULL && s->seq == seq) {
  885. if (s->len == datalen)
  886. log_android(ANDROID_LOG_WARN, "%s segment already queued %u..%u",
  887. session,
  888. s->seq - cur->remote_start, s->seq + s->len - cur->remote_start);
  889. else if (s->len < datalen) {
  890. log_android(ANDROID_LOG_WARN, "%s segment smaller %u..%u > %u",
  891. session,
  892. s->seq - cur->remote_start, s->seq + s->len - cur->remote_start,
  893. s->seq + datalen - cur->remote_start);
  894. ng_free(s->data, __FILE__, __LINE__);
  895. s->len = datalen;
  896. s->data = ng_malloc(datalen, "tcp segment smaller");
  897. memcpy(s->data, data, datalen);
  898. } else {
  899. log_android(ANDROID_LOG_ERROR, "%s segment larger %u..%u < %u",
  900. session,
  901. s->seq - cur->remote_start, s->seq + s->len - cur->remote_start,
  902. s->seq + datalen - cur->remote_start);
  903. ng_free(s->data, __FILE__, __LINE__);
  904. s->len = datalen;
  905. s->data = ng_malloc(datalen, "tcp segment larger");
  906. memcpy(s->data, data, datalen);
  907. }
  908. }
  909. }
  910. }
  911. int open_tcp_socket(const struct arguments *args,
  912. const struct tcp_session *cur, const struct allowed *redirect) {
  913. int sock;
  914. int version;
  915. if (redirect == NULL) {
  916. if (*socks5_addr && socks5_port)
  917. version = (strstr(socks5_addr, ":") == NULL ? 4 : 6);
  918. else
  919. version = cur->version;
  920. } else
  921. version = (strstr(redirect->raddr, ":") == NULL ? 4 : 6);
  922. // Get TCP socket
  923. if ((sock = socket(version == 4 ? PF_INET : PF_INET6, SOCK_STREAM, 0)) < 0) {
  924. log_android(ANDROID_LOG_ERROR, "socket error %d: %s", errno, strerror(errno));
  925. return -1;
  926. }
  927. // Protect
  928. if (protect_socket(args, sock) < 0)
  929. return -1;
  930. int on = 1;
  931. if (setsockopt(sock, SOL_TCP, TCP_NODELAY, &on, sizeof(on)) < 0)
  932. log_android(ANDROID_LOG_ERROR, "setsockopt TCP_NODELAY error %d: %s",
  933. errno, strerror(errno));
  934. // Set non blocking
  935. int flags = fcntl(sock, F_GETFL, 0);
  936. if (flags < 0 || fcntl(sock, F_SETFL, flags | O_NONBLOCK) < 0) {
  937. log_android(ANDROID_LOG_ERROR, "fcntl socket O_NONBLOCK error %d: %s",
  938. errno, strerror(errno));
  939. return -1;
  940. }
  941. // Build target address
  942. struct sockaddr_in addr4;
  943. struct sockaddr_in6 addr6;
  944. if (redirect == NULL) {
  945. if (*socks5_addr && socks5_port) {
  946. log_android(ANDROID_LOG_WARN, "TCP%d SOCKS5 to %s/%u",
  947. version, socks5_addr, socks5_port);
  948. if (version == 4) {
  949. addr4.sin_family = AF_INET;
  950. inet_pton(AF_INET, socks5_addr, &addr4.sin_addr);
  951. addr4.sin_port = htons(socks5_port);
  952. } else {
  953. addr6.sin6_family = AF_INET6;
  954. inet_pton(AF_INET6, socks5_addr, &addr6.sin6_addr);
  955. addr6.sin6_port = htons(socks5_port);
  956. }
  957. } else {
  958. if (version == 4) {
  959. addr4.sin_family = AF_INET;
  960. char source[INET6_ADDRSTRLEN + 1];
  961. char dest[INET6_ADDRSTRLEN + 1];
  962. inet_ntop(AF_INET, &cur->daddr.ip4, source, sizeof(source));
  963. inet_ntop(AF_INET, &cur->saddr.ip4, dest, sizeof(dest));
  964. log_android(ANDROID_LOG_ERROR, "setting sin address source to: %s, dest: %s", source, dest);
  965. addr4.sin_addr.s_addr = (__be32) cur->daddr.ip4;
  966. addr4.sin_port = cur->dest;
  967. } else {
  968. addr6.sin6_family = AF_INET6;
  969. memcpy(&addr6.sin6_addr, &cur->daddr.ip6, 16);
  970. addr6.sin6_port = cur->dest;
  971. }
  972. }
  973. } else {
  974. log_android(ANDROID_LOG_ERROR, "TCP%d redirect to %s/%u",
  975. version, redirect->raddr, redirect->rport);
  976. if (version == 4) {
  977. addr4.sin_family = AF_INET;
  978. inet_pton(AF_INET, redirect->raddr, &addr4.sin_addr);
  979. addr4.sin_port = htons(redirect->rport);
  980. } else {
  981. addr6.sin6_family = AF_INET6;
  982. inet_pton(AF_INET6, redirect->raddr, &addr6.sin6_addr);
  983. addr6.sin6_port = htons(redirect->rport);
  984. }
  985. }
  986. // Initiate connect
  987. int err = connect(sock,
  988. (version == 4 ? (const struct sockaddr *) &addr4
  989. : (const struct sockaddr *) &addr6),
  990. (socklen_t) (version == 4
  991. ? sizeof(struct sockaddr_in)
  992. : sizeof(struct sockaddr_in6)));
  993. if (err < 0 && errno != EINPROGRESS) {
  994. log_android(ANDROID_LOG_ERROR, "connect error %d: %s", errno, strerror(errno));
  995. return -1;
  996. }
  997. log_android(ANDROID_LOG_ERROR, "sock connect result: %d", sock);
  998. return sock;
  999. }
  1000. int write_syn_ack(const struct arguments *args, struct tcp_session *cur) {
  1001. if (write_tcp(args, cur, NULL, 0, 1, 1, 0, 0) < 0) {
  1002. cur->state = TCP_CLOSING;
  1003. return -1;
  1004. }
  1005. return 0;
  1006. }
  1007. int write_ack(const struct arguments *args, struct tcp_session *cur) {
  1008. log_android(ANDROID_LOG_ERROR,"Writing TCP ack to %d", cur->dest);
  1009. if (write_tcp(args, cur, NULL, 0, 0, 1, 0, 0) < 0) {
  1010. cur->state = TCP_CLOSING;
  1011. return -1;
  1012. }
  1013. return 0;
  1014. }
  1015. int write_data(const struct arguments *args, struct tcp_session *cur,
  1016. const uint8_t *buffer, size_t length) {
  1017. log_android(ANDROID_LOG_ERROR,"in write tcp data with length: %d", length);
  1018. if (write_tcp(args, cur, buffer, length, 0, 1, 0, 0) < 0) {
  1019. cur->state = TCP_CLOSING;
  1020. return -1;
  1021. }
  1022. return 0;
  1023. }
  1024. int write_fin_ack(const struct arguments *args, struct tcp_session *cur) {
  1025. if (write_tcp(args, cur, NULL, 0, 0, 1, 1, 0) < 0) {
  1026. cur->state = TCP_CLOSING;
  1027. return -1;
  1028. }
  1029. return 0;
  1030. }
  1031. void write_rst(const struct arguments *args, struct tcp_session *cur) {
  1032. // https://www.snellman.net/blog/archive/2016-02-01-tcp-rst/
  1033. int ack = 0;
  1034. if (cur->state == TCP_LISTEN) {
  1035. ack = 1;
  1036. cur->remote_seq++; // SYN
  1037. }
  1038. write_tcp(args, cur, NULL, 0, 0, ack, 0, 1);
  1039. if (cur->state != TCP_CLOSE)
  1040. cur->state = TCP_CLOSING;
  1041. }
  1042. ssize_t write_tcp(const struct arguments *args, const struct tcp_session *cur,
  1043. const uint8_t *data, size_t datalen,
  1044. int syn, int ack, int fin, int rst) {
  1045. size_t len;
  1046. u_int8_t *buffer;
  1047. struct tcphdr *tcp;
  1048. uint16_t csum;
  1049. char source[INET6_ADDRSTRLEN + 1];
  1050. char dest[INET6_ADDRSTRLEN + 1];
  1051. // Build packet
  1052. int optlen = (syn ? 4 + 3 + 1 : 0);
  1053. uint8_t *options;
  1054. if (cur->version == 4) {
  1055. len = sizeof(struct iphdr) + sizeof(struct tcphdr) + optlen + datalen;
  1056. buffer = ng_malloc(len, "tcp write4");
  1057. struct iphdr *ip4 = (struct iphdr *) buffer;
  1058. tcp = (struct tcphdr *) (buffer + sizeof(struct iphdr));
  1059. options = buffer + sizeof(struct iphdr) + sizeof(struct tcphdr);
  1060. if (datalen)
  1061. memcpy(buffer + sizeof(struct iphdr) + sizeof(struct tcphdr) + optlen, data, datalen);
  1062. // Build IP4 header
  1063. memset(ip4, 0, sizeof(struct iphdr));
  1064. ip4->version = 4;
  1065. ip4->ihl = sizeof(struct iphdr) >> 2;
  1066. ip4->tot_len = htons(len);
  1067. ip4->ttl = IPDEFTTL;
  1068. ip4->protocol = IPPROTO_TCP;
  1069. ip4->saddr = cur->daddr.ip4;
  1070. ip4->daddr = cur->saddr.ip4;
  1071. // Calculate IP4 checksum
  1072. ip4->check = ~calc_checksum(0, (uint8_t *) ip4, sizeof(struct iphdr));
  1073. // Calculate TCP4 checksum
  1074. struct ippseudo pseudo;
  1075. memset(&pseudo, 0, sizeof(struct ippseudo));
  1076. pseudo.ippseudo_src.s_addr = (__be32) ip4->saddr;
  1077. pseudo.ippseudo_dst.s_addr = (__be32) ip4->daddr;
  1078. pseudo.ippseudo_p = ip4->protocol;
  1079. pseudo.ippseudo_len = htons(sizeof(struct tcphdr) + optlen + datalen);
  1080. csum = calc_checksum(0, (uint8_t *) &pseudo, sizeof(struct ippseudo));
  1081. } else {
  1082. len = sizeof(struct ip6_hdr) + sizeof(struct tcphdr) + optlen + datalen;
  1083. buffer = ng_malloc(len, "tcp write 6");
  1084. struct ip6_hdr *ip6 = (struct ip6_hdr *) buffer;
  1085. tcp = (struct tcphdr *) (buffer + sizeof(struct ip6_hdr));
  1086. options = buffer + sizeof(struct ip6_hdr) + sizeof(struct tcphdr);
  1087. if (datalen)
  1088. memcpy(buffer + sizeof(struct ip6_hdr) + sizeof(struct tcphdr) + optlen, data, datalen);
  1089. // Build IP6 header
  1090. memset(ip6, 0, sizeof(struct ip6_hdr));
  1091. ip6->ip6_ctlun.ip6_un1.ip6_un1_plen = htons(len - sizeof(struct ip6_hdr));
  1092. ip6->ip6_ctlun.ip6_un1.ip6_un1_nxt = IPPROTO_TCP;
  1093. ip6->ip6_ctlun.ip6_un1.ip6_un1_hlim = IPDEFTTL;
  1094. ip6->ip6_ctlun.ip6_un2_vfc = 0x60;
  1095. memcpy(&(ip6->ip6_src), &cur->daddr.ip6, 16);
  1096. memcpy(&(ip6->ip6_dst), &cur->saddr.ip6, 16);
  1097. // Calculate TCP6 checksum
  1098. struct ip6_hdr_pseudo pseudo;
  1099. memset(&pseudo, 0, sizeof(struct ip6_hdr_pseudo));
  1100. memcpy(&pseudo.ip6ph_src, &ip6->ip6_dst, 16);
  1101. memcpy(&pseudo.ip6ph_dst, &ip6->ip6_src, 16);
  1102. pseudo.ip6ph_len = ip6->ip6_ctlun.ip6_un1.ip6_un1_plen;
  1103. pseudo.ip6ph_nxt = ip6->ip6_ctlun.ip6_un1.ip6_un1_nxt;
  1104. csum = calc_checksum(0, (uint8_t *) &pseudo, sizeof(struct ip6_hdr_pseudo));
  1105. }
  1106. // Build TCP header
  1107. memset(tcp, 0, sizeof(struct tcphdr));
  1108. tcp->source = cur->dest;
  1109. tcp->dest = cur->source;
  1110. tcp->seq = htonl(cur->local_seq);
  1111. tcp->ack_seq = htonl((uint32_t) (cur->remote_seq));
  1112. tcp->doff = (__u16) ((sizeof(struct tcphdr) + optlen) >> 2);
  1113. tcp->syn = (__u16) syn;
  1114. tcp->ack = (__u16) ack;
  1115. tcp->fin = (__u16) fin;
  1116. tcp->rst = (__u16) rst;
  1117. tcp->window = htons(cur->recv_window >> cur->recv_scale);
  1118. if (!tcp->ack)
  1119. tcp->ack_seq = 0;
  1120. // TCP options
  1121. if (syn) {
  1122. *(options) = 2; // MSS
  1123. *(options + 1) = 4; // total option length
  1124. *((uint16_t *) (options + 2)) = get_default_mss(cur->version);
  1125. *(options + 4) = 3; // window scale
  1126. *(options + 5) = 3; // total option length
  1127. *(options + 6) = cur->recv_scale;
  1128. *(options + 7) = 0; // End, padding
  1129. }
  1130. // Continue checksum
  1131. csum = calc_checksum(csum, (uint8_t *) tcp, sizeof(struct tcphdr));
  1132. csum = calc_checksum(csum, options, (size_t) optlen);
  1133. csum = calc_checksum(csum, data, datalen);
  1134. tcp->check = ~csum;
  1135. inet_ntop(cur->version == 4 ? AF_INET : AF_INET6,
  1136. cur->version == 4 ? (const void *) &cur->saddr.ip4 : (const void *) &cur->saddr.ip6,
  1137. source, sizeof(source));
  1138. inet_ntop(cur->version == 4 ? AF_INET : AF_INET6,
  1139. cur->version == 4 ? (const void *) &cur->daddr.ip4 : (const void *) &cur->daddr.ip6,
  1140. dest, sizeof(dest));
  1141. // Send packet
  1142. log_android(ANDROID_LOG_ERROR,
  1143. "TCP sending%s%s%s%s to tun %s/%u seq %u ack %u data %u",
  1144. (tcp->syn ? " SYN" : ""),
  1145. (tcp->ack ? " ACK" : ""),
  1146. (tcp->fin ? " FIN" : ""),
  1147. (tcp->rst ? " RST" : ""),
  1148. dest, ntohs(tcp->dest),
  1149. ntohl(tcp->seq) - cur->local_start,
  1150. ntohl(tcp->ack_seq) - cur->remote_start,
  1151. datalen);
  1152. ssize_t res = 0;
  1153. res = write(args->tun, buffer, len);
  1154. // Write pcap record
  1155. if (res >= 0) {
  1156. if (pcap_file != NULL)
  1157. write_pcap_rec(buffer, (size_t) res);
  1158. } else
  1159. log_android(ANDROID_LOG_ERROR, "TCP write%s%s%s%s data %d error %d: %s",
  1160. (tcp->syn ? " SYN" : ""),
  1161. (tcp->ack ? " ACK" : ""),
  1162. (tcp->fin ? " FIN" : ""),
  1163. (tcp->rst ? " RST" : ""),
  1164. datalen,
  1165. errno, strerror((errno)));
  1166. ng_free(buffer, __FILE__, __LINE__);
  1167. if (res != len) {
  1168. log_android(ANDROID_LOG_ERROR, "TCP write %d/%d", res, len);
  1169. return -1;
  1170. }
  1171. return res;
  1172. }