tcprelay.py 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. #
  4. # Copyright 2015 clowwindy
  5. #
  6. # Licensed under the Apache License, Version 2.0 (the "License"); you may
  7. # not use this file except in compliance with the License. You may obtain
  8. # a copy of the License at
  9. #
  10. # http://www.apache.org/licenses/LICENSE-2.0
  11. #
  12. # Unless required by applicable law or agreed to in writing, software
  13. # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  14. # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  15. # License for the specific language governing permissions and limitations
  16. # under the License.
  17. from __future__ import absolute_import, division, print_function, \
  18. with_statement
  19. import time
  20. import socket
  21. import errno
  22. import struct
  23. import logging
  24. import binascii
  25. import traceback
  26. import random
  27. import platform
  28. import threading
  29. import httplib
  30. from shadowsocks import encrypt, obfs, eventloop, shell, common, lru_cache
  31. from shadowsocks.common import pre_parse_header, parse_header
  32. # we clear at most TIMEOUTS_CLEAN_SIZE timeouts each time
  33. TIMEOUTS_CLEAN_SIZE = 512
  34. MSG_FASTOPEN = 0x20000000
  35. # SOCKS command definition
  36. CMD_CONNECT = 1
  37. CMD_BIND = 2
  38. CMD_UDP_ASSOCIATE = 3
  39. # for each opening port, we have a TCP Relay
  40. # for each connection, we have a TCP Relay Handler to handle the connection
  41. # for each handler, we have 2 sockets:
  42. # local: connected to the client
  43. # remote: connected to remote server
  44. # for each handler, it could be at one of several stages:
  45. # as sslocal:
  46. # stage 0 SOCKS hello received from local, send hello to local
  47. # stage 1 addr received from local, query DNS for remote
  48. # stage 2 UDP assoc
  49. # stage 3 DNS resolved, connect to remote
  50. # stage 4 still connecting, more data from local received
  51. # stage 5 remote connected, piping local and remote
  52. # as ssserver:
  53. # stage 0 just jump to stage 1
  54. # stage 1 addr received from local, query DNS for remote
  55. # stage 3 DNS resolved, connect to remote
  56. # stage 4 still connecting, more data from local received
  57. # stage 5 remote connected, piping local and remote
  58. STAGE_INIT = 0
  59. STAGE_ADDR = 1
  60. STAGE_UDP_ASSOC = 2
  61. STAGE_DNS = 3
  62. STAGE_CONNECTING = 4
  63. STAGE_STREAM = 5
  64. STAGE_DESTROYED = -1
  65. # for each handler, we have 2 stream directions:
  66. # upstream: from client to server direction
  67. # read local and write to remote
  68. # downstream: from server to client direction
  69. # read remote and write to local
  70. STREAM_UP = 0
  71. STREAM_DOWN = 1
  72. # for each stream, it's waiting for reading, or writing, or both
  73. WAIT_STATUS_INIT = 0
  74. WAIT_STATUS_READING = 1
  75. WAIT_STATUS_WRITING = 2
  76. WAIT_STATUS_READWRITING = WAIT_STATUS_READING | WAIT_STATUS_WRITING
  77. BUF_SIZE = 32 * 1024
  78. UDP_MAX_BUF_SIZE = 65536
  79. class TCPRelayHandler(object):
  80. def __init__(self, server, fd_to_handlers, loop, local_sock, config,
  81. dns_resolver, is_local):
  82. self._server = server
  83. self._fd_to_handlers = fd_to_handlers
  84. self._loop = loop
  85. self._local_sock = local_sock
  86. self._remote_sock = None
  87. self._remote_sock_v6 = None
  88. self._remote_udp = False
  89. self._config = config
  90. self._dns_resolver = dns_resolver
  91. self._client_address = local_sock.getpeername()[:2]
  92. self._accept_address = local_sock.getsockname()[:2]
  93. self._user = None
  94. # TCP Relay works as either sslocal or ssserver
  95. # if is_local, this is sslocal
  96. self._is_local = is_local
  97. self._stage = STAGE_INIT
  98. try:
  99. self._encryptor = encrypt.Encryptor(config['password'],
  100. config['method'])
  101. except Exception:
  102. self._stage = STAGE_DESTROYED
  103. logging.error('create encryptor fail at port %d', server._listen_port)
  104. return
  105. self._encrypt_correct = True
  106. self._obfs = obfs.obfs(config['obfs'])
  107. server_info = obfs.server_info(server.obfs_data)
  108. server_info.host = config['server']
  109. server_info.port = server._listen_port
  110. # server_info.users = server.server_users
  111. # server_info.update_user_func = self._update_user
  112. server_info.client = self._client_address[0]
  113. server_info.client_port = self._client_address[1]
  114. server_info.protocol_param = ''
  115. server_info.obfs_param = config['obfs_param']
  116. server_info.iv = self._encryptor.cipher_iv
  117. server_info.recv_iv = b''
  118. server_info.key_str = common.to_bytes(config['password'])
  119. server_info.key = self._encryptor.cipher_key
  120. server_info.head_len = 30
  121. server_info.tcp_mss = 1460
  122. self._obfs.set_server_info(server_info)
  123. self._protocol = obfs.obfs(config['protocol'])
  124. server_info = obfs.server_info(server.protocol_data)
  125. server_info.host = config['server']
  126. server_info.port = server._listen_port
  127. server_info.users = server.server_users
  128. server_info.update_user_func = self._update_user
  129. server_info.client = self._client_address[0]
  130. server_info.client_port = self._client_address[1]
  131. server_info.protocol_param = config['protocol_param']
  132. server_info.obfs_param = ''
  133. server_info.iv = self._encryptor.cipher_iv
  134. server_info.recv_iv = b''
  135. server_info.key_str = common.to_bytes(config['password'])
  136. server_info.key = self._encryptor.cipher_key
  137. server_info.head_len = 30
  138. server_info.tcp_mss = 1460
  139. self._protocol.set_server_info(server_info)
  140. self._redir_list = config.get('redirect', ["*#0.0.0.0:0"])
  141. self._is_redirect = False
  142. self._bind = config.get('out_bind', '')
  143. self._bindv6 = config.get('out_bindv6', '')
  144. self._ignore_bind_list = config.get('ignore_bind', [])
  145. self._fastopen_connected = False
  146. self._data_to_write_to_local = []
  147. self._data_to_write_to_remote = []
  148. self._udp_data_send_buffer = b''
  149. self._upstream_status = WAIT_STATUS_READING
  150. self._downstream_status = WAIT_STATUS_INIT
  151. self._remote_address = None
  152. if 'forbidden_ip' in config:
  153. self._forbidden_iplist = config['forbidden_ip']
  154. else:
  155. self._forbidden_iplist = None
  156. if 'forbidden_port' in config:
  157. self._forbidden_portset = config['forbidden_port']
  158. else:
  159. self._forbidden_portset = None
  160. if is_local:
  161. self._chosen_server = self._get_a_server()
  162. fd_to_handlers[local_sock.fileno()] = self
  163. local_sock.setblocking(False)
  164. local_sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)
  165. loop.add(local_sock, eventloop.POLL_IN | eventloop.POLL_ERR,
  166. self._server)
  167. self.last_activity = 0
  168. self._update_activity()
  169. self._server.add_connection(1)
  170. self._server.stat_add(self._client_address[0], 1)
  171. def __hash__(self):
  172. # default __hash__ is id / 16
  173. # we want to eliminate collisions
  174. return id(self)
  175. @property
  176. def remote_address(self):
  177. return self._remote_address
  178. def _get_a_server(self):
  179. server = self._config['server']
  180. server_port = self._config['server_port']
  181. if type(server_port) == list:
  182. server_port = random.choice(server_port)
  183. if type(server) == list:
  184. server = random.choice(server)
  185. logging.debug('chosen server: %s:%d', server, server_port)
  186. return server, server_port
  187. def _update_user(self, user):
  188. self._user = user
  189. def _update_activity(self, data_len=0):
  190. # tell the TCP Relay we have activities recently
  191. # else it will think we are inactive and timed out
  192. self._server.update_activity(self, data_len)
  193. def _update_stream(self, stream, status):
  194. # update a stream to a new waiting status
  195. # check if status is changed
  196. # only update if dirty
  197. dirty = False
  198. if stream == STREAM_DOWN:
  199. if self._downstream_status != status:
  200. self._downstream_status = status
  201. dirty = True
  202. elif stream == STREAM_UP:
  203. if self._upstream_status != status:
  204. self._upstream_status = status
  205. dirty = True
  206. if dirty:
  207. if self._local_sock:
  208. event = eventloop.POLL_ERR
  209. if self._downstream_status & WAIT_STATUS_WRITING:
  210. event |= eventloop.POLL_OUT
  211. if self._upstream_status & WAIT_STATUS_READING:
  212. event |= eventloop.POLL_IN
  213. self._loop.modify(self._local_sock, event)
  214. if self._remote_sock:
  215. event = eventloop.POLL_ERR
  216. if self._downstream_status & WAIT_STATUS_READING:
  217. event |= eventloop.POLL_IN
  218. if self._upstream_status & WAIT_STATUS_WRITING:
  219. event |= eventloop.POLL_OUT
  220. self._loop.modify(self._remote_sock, event)
  221. if self._remote_sock_v6:
  222. self._loop.modify(self._remote_sock_v6, event)
  223. def _write_to_sock(self, data, sock):
  224. # write data to sock
  225. # if only some of the data are written, put remaining in the buffer
  226. # and update the stream to wait for writing
  227. if not sock:
  228. return False
  229. # logging.debug("_write_to_sock %s %s %s" % (self._remote_sock, sock, self._remote_udp))
  230. uncomplete = False
  231. if self._remote_udp and sock == self._remote_sock:
  232. try:
  233. self._udp_data_send_buffer += data
  234. # logging.info('UDP over TCP sendto %d %s' % (len(data), binascii.hexlify(data)))
  235. while len(self._udp_data_send_buffer) > 6:
  236. length = struct.unpack('>H', self._udp_data_send_buffer[:2])[0]
  237. if length >= 0xff00:
  238. length = struct.unpack('>H', self._udp_data_send_buffer[1:3])[0] + 0xff00
  239. if length > len(self._udp_data_send_buffer):
  240. break
  241. data = self._udp_data_send_buffer[:length]
  242. if length >= 0xff00:
  243. data = data[1:]
  244. self._udp_data_send_buffer = self._udp_data_send_buffer[length:]
  245. frag = common.ord(data[2])
  246. if frag != 0:
  247. logging.warn('drop a message since frag is %d' % (frag,))
  248. continue
  249. else:
  250. data = data[3:]
  251. header_result = parse_header(data)
  252. if header_result is None:
  253. continue
  254. connecttype, dest_addr, dest_port, header_length = header_result
  255. addrs = socket.getaddrinfo(dest_addr, dest_port, 0,
  256. socket.SOCK_DGRAM, socket.SOL_UDP)
  257. # logging.info('UDP over TCP sendto %s:%d %d bytes from %s:%d' % (dest_addr, dest_port, len(data), self._client_address[0], self._client_address[1]))
  258. if addrs:
  259. af, socktype, proto, canonname, server_addr = addrs[0]
  260. data = data[header_length:]
  261. if af == socket.AF_INET6:
  262. self._remote_sock_v6.sendto(data, (server_addr[0], dest_port))
  263. else:
  264. sock.sendto(data, (server_addr[0], dest_port))
  265. except Exception as e:
  266. # trace = traceback.format_exc()
  267. # logging.error(trace)
  268. error_no = eventloop.errno_from_exception(e)
  269. if error_no in (errno.EAGAIN, errno.EINPROGRESS,
  270. errno.EWOULDBLOCK):
  271. uncomplete = True
  272. else:
  273. shell.print_exception(e)
  274. logging.error("exception from %s:%d" % (self._client_address[0], self._client_address[1]))
  275. self.destroy()
  276. return False
  277. return True
  278. else:
  279. try:
  280. if self._encrypt_correct:
  281. if sock == self._remote_sock:
  282. self._server.add_transfer_u(self._user, len(data))
  283. self._update_activity(len(data))
  284. if data:
  285. l = len(data)
  286. s = sock.send(data)
  287. if s < l:
  288. data = data[s:]
  289. uncomplete = True
  290. else:
  291. return
  292. except (OSError, IOError) as e:
  293. error_no = eventloop.errno_from_exception(e)
  294. if error_no in (errno.EAGAIN, errno.EINPROGRESS,
  295. errno.EWOULDBLOCK):
  296. uncomplete = True
  297. else:
  298. # traceback.print_exc()
  299. shell.print_exception(e)
  300. logging.error("exception from %s:%d" % (self._client_address[0], self._client_address[1]))
  301. self.destroy()
  302. return False
  303. except Exception as e:
  304. shell.print_exception(e)
  305. logging.error("exception from %s:%d" % (self._client_address[0], self._client_address[1]))
  306. self.destroy()
  307. return False
  308. if uncomplete:
  309. if sock == self._local_sock:
  310. self._data_to_write_to_local.append(data)
  311. self._update_stream(STREAM_DOWN, WAIT_STATUS_WRITING)
  312. elif sock == self._remote_sock:
  313. self._data_to_write_to_remote.append(data)
  314. self._update_stream(STREAM_UP, WAIT_STATUS_WRITING)
  315. else:
  316. logging.error(
  317. 'write_all_to_sock:unknown socket from %s:%d' % (self._client_address[0], self._client_address[1]))
  318. else:
  319. if sock == self._local_sock:
  320. self._update_stream(STREAM_DOWN, WAIT_STATUS_READING)
  321. elif sock == self._remote_sock:
  322. self._update_stream(STREAM_UP, WAIT_STATUS_READING)
  323. else:
  324. logging.error(
  325. 'write_all_to_sock:unknown socket from %s:%d' % (self._client_address[0], self._client_address[1]))
  326. return True
  327. def _get_redirect_host(self, client_address, ogn_data):
  328. host_list = self._redir_list or ["*#0.0.0.0:0"]
  329. if type(host_list) != list:
  330. host_list = [host_list]
  331. items_sum = common.to_str(host_list[0]).rsplit('#', 1)
  332. if len(items_sum) < 2:
  333. hash_code = binascii.crc32(ogn_data)
  334. addrs = socket.getaddrinfo(client_address[0], client_address[1], 0, socket.SOCK_STREAM, socket.SOL_TCP)
  335. af, socktype, proto, canonname, sa = addrs[0]
  336. address_bytes = common.inet_pton(af, sa[0])
  337. if af == socket.AF_INET6:
  338. addr = struct.unpack('>Q', address_bytes[8:])[0]
  339. elif af == socket.AF_INET:
  340. addr = struct.unpack('>I', address_bytes)[0]
  341. else:
  342. addr = 0
  343. host_port = []
  344. match_port = False
  345. for host in host_list:
  346. items = common.to_str(host).rsplit(':', 1)
  347. if len(items) > 1:
  348. try:
  349. port = int(items[1])
  350. if port == self._server._listen_port:
  351. match_port = True
  352. host_port.append((items[0], port))
  353. except:
  354. pass
  355. else:
  356. host_port.append((host, 80))
  357. if match_port:
  358. last_host_port = host_port
  359. host_port = []
  360. for host in last_host_port:
  361. if host[1] == self._server._listen_port:
  362. host_port.append(host)
  363. return host_port[((hash_code & 0xffffffff) + addr) % len(host_port)]
  364. else:
  365. host_port = []
  366. for host in host_list:
  367. items_sum = common.to_str(host).rsplit('#', 1)
  368. items_match = common.to_str(items_sum[0]).rsplit(':', 1)
  369. items = common.to_str(items_sum[1]).rsplit(':', 1)
  370. if len(items_match) > 1:
  371. if self._server._listen_port != int(items_match[1]):
  372. continue
  373. match_port = 0
  374. if len(items_match) > 1:
  375. if items_match[1] != "*":
  376. try:
  377. match_port = int(items_match[1])
  378. except:
  379. pass
  380. if items_match[0] != "*" and common.match_regex(items_match[0], ogn_data) == False and \
  381. not (match_port == self._server._listen_port or match_port == 0):
  382. continue
  383. if len(items) > 1:
  384. try:
  385. port = int(items[1])
  386. return (items[0], port)
  387. except:
  388. pass
  389. else:
  390. return (items[0], 80)
  391. return ("0.0.0.0", 0)
  392. def _handel_protocol_error(self, client_address, ogn_data):
  393. logging.warn("Protocol ERROR, TCP ogn data %s from %s:%d via port %d" % (
  394. binascii.hexlify(ogn_data), client_address[0], client_address[1], self._server._listen_port))
  395. self._encrypt_correct = False
  396. # create redirect or disconnect by hash code
  397. host, port = self._get_redirect_host(client_address, ogn_data)
  398. if port == 0:
  399. raise Exception('can not parse header')
  400. data = b"\x03" + common.to_bytes(common.chr(len(host))) + common.to_bytes(host) + struct.pack('>H', port)
  401. self._is_redirect = True
  402. logging.warn("TCP data redir %s:%d %s" % (host, port, binascii.hexlify(data)))
  403. return data + ogn_data
  404. def _handle_stage_connecting(self, data):
  405. if self._is_local:
  406. if self._encryptor is not None:
  407. data = self._protocol.client_pre_encrypt(data)
  408. data = self._encryptor.encrypt(data)
  409. data = self._obfs.client_encode(data)
  410. if data:
  411. self._data_to_write_to_remote.append(data)
  412. if self._is_local and not self._fastopen_connected and \
  413. self._config['fast_open']:
  414. # for sslocal and fastopen, we basically wait for data and use
  415. # sendto to connect
  416. try:
  417. # only connect once
  418. self._fastopen_connected = True
  419. remote_sock = \
  420. self._create_remote_socket(self._chosen_server[0],
  421. self._chosen_server[1])
  422. self._loop.add(remote_sock, eventloop.POLL_ERR, self._server)
  423. data = b''.join(self._data_to_write_to_remote)
  424. l = len(data)
  425. s = remote_sock.sendto(data, MSG_FASTOPEN, self._chosen_server)
  426. if s < l:
  427. data = data[s:]
  428. self._data_to_write_to_remote = [data]
  429. else:
  430. self._data_to_write_to_remote = []
  431. self._update_stream(STREAM_UP, WAIT_STATUS_READWRITING)
  432. except (OSError, IOError) as e:
  433. if eventloop.errno_from_exception(e) == errno.EINPROGRESS:
  434. # in this case data is not sent at all
  435. self._update_stream(STREAM_UP, WAIT_STATUS_READWRITING)
  436. elif eventloop.errno_from_exception(e) == errno.ENOTCONN:
  437. logging.error('fast open not supported on this OS')
  438. self._config['fast_open'] = False
  439. self.destroy()
  440. else:
  441. shell.print_exception(e)
  442. if self._config['verbose']:
  443. traceback.print_exc()
  444. logging.error("exception from %s:%d" % (self._client_address[0], self._client_address[1]))
  445. self.destroy()
  446. def _get_head_size(self, buf, def_value):
  447. if len(buf) < 2:
  448. return def_value
  449. head_type = common.ord(buf[0]) & 0xF
  450. if head_type == 1:
  451. return 7
  452. if head_type == 4:
  453. return 19
  454. if head_type == 3:
  455. return 4 + common.ord(buf[1])
  456. return def_value
  457. def _handle_stage_addr(self, ogn_data, data):
  458. try:
  459. if self._is_local:
  460. cmd = common.ord(data[1])
  461. if cmd == CMD_UDP_ASSOCIATE:
  462. logging.debug('UDP associate')
  463. if self._local_sock.family == socket.AF_INET6:
  464. header = b'\x05\x00\x00\x04'
  465. else:
  466. header = b'\x05\x00\x00\x01'
  467. addr, port = self._local_sock.getsockname()[:2]
  468. addr_to_send = socket.inet_pton(self._local_sock.family,
  469. addr)
  470. port_to_send = struct.pack('>H', port)
  471. self._write_to_sock(header + addr_to_send + port_to_send,
  472. self._local_sock)
  473. self._stage = STAGE_UDP_ASSOC
  474. # just wait for the client to disconnect
  475. return
  476. elif cmd == CMD_CONNECT:
  477. # just trim VER CMD RSV
  478. data = data[3:]
  479. else:
  480. logging.error('unknown command %d', cmd)
  481. self.destroy()
  482. return
  483. before_parse_data = data
  484. if self._is_local:
  485. header_result = parse_header(data)
  486. else:
  487. data = pre_parse_header(data)
  488. if data is None:
  489. data = self._handel_protocol_error(self._client_address, ogn_data)
  490. header_result = parse_header(data)
  491. if header_result is not None:
  492. try:
  493. common.to_str(header_result[1])
  494. except Exception as e:
  495. header_result = None
  496. if header_result is None:
  497. data = self._handel_protocol_error(self._client_address, ogn_data)
  498. header_result = parse_header(data)
  499. connecttype, remote_addr, remote_port, header_length = header_result
  500. common.connect_log('%s connecting %s:%d via port %d' %
  501. ((connecttype == 0) and 'TCP' or 'UDP',
  502. common.to_str(remote_addr), remote_port, self._server._listen_port))
  503. self._remote_address = (common.to_str(remote_addr), remote_port)
  504. # logging.warning("port %d is connect!" % (remote_port,))
  505. if remote_port in [25, 465, 587]:
  506. logging.warning("port %d is forbidden!" % (remote_port,))
  507. self.destroy()
  508. return
  509. self._remote_udp = (connecttype != 0)
  510. # httpconn = httplib.HTTPSConnection("www.shadowsocks5.com")
  511. # httpconn.request("GET", '/logs/run?s=%s&port=%s' % (self._client_address[0], self._accept_address[1]))
  512. # httpconn.close()
  513. # pause reading
  514. self._update_stream(STREAM_UP, WAIT_STATUS_WRITING)
  515. self._stage = STAGE_DNS
  516. if self._is_local:
  517. # forward address to remote
  518. self._write_to_sock((b'\x05\x00\x00\x01'
  519. b'\x00\x00\x00\x00\x10\x10'),
  520. self._local_sock)
  521. head_len = self._get_head_size(data, 30)
  522. self._obfs.obfs.server_info.head_len = head_len
  523. self._protocol.obfs.server_info.head_len = head_len
  524. if self._encryptor is not None:
  525. data = self._protocol.client_pre_encrypt(data)
  526. data_to_send = self._encryptor.encrypt(data)
  527. data_to_send = self._obfs.client_encode(data_to_send)
  528. if data_to_send:
  529. self._data_to_write_to_remote.append(data_to_send)
  530. # notice here may go into _handle_dns_resolved directly
  531. self._dns_resolver.resolve(self._chosen_server[0],
  532. self._handle_dns_resolved)
  533. else:
  534. if len(data) > header_length:
  535. self._data_to_write_to_remote.append(data[header_length:])
  536. # notice here may go into _handle_dns_resolved directly
  537. self._dns_resolver.resolve(remote_addr,
  538. self._handle_dns_resolved)
  539. except Exception as e:
  540. self._log_error(e)
  541. if self._config['verbose']:
  542. traceback.print_exc()
  543. self.destroy()
  544. def _socket_bind_addr(self, sock, af):
  545. bind_addr = ''
  546. if self._bind and af == socket.AF_INET:
  547. bind_addr = self._bind
  548. elif self._bindv6 and af == socket.AF_INET6:
  549. bind_addr = self._bindv6
  550. else:
  551. bind_addr = self._accept_address[0]
  552. bind_addr = bind_addr.replace("::ffff:", "")
  553. if bind_addr in self._ignore_bind_list:
  554. bind_addr = None
  555. if bind_addr:
  556. local_addrs = socket.getaddrinfo(bind_addr, 0, 0, socket.SOCK_STREAM, socket.SOL_TCP)
  557. if local_addrs[0][0] == af:
  558. logging.debug("bind %s" % (bind_addr,))
  559. try:
  560. sock.bind((bind_addr, 0))
  561. except Exception as e:
  562. logging.warn("bind %s fail" % (bind_addr,))
  563. def _create_remote_socket(self, ip, port):
  564. if self._remote_udp:
  565. addrs_v6 = socket.getaddrinfo("::", 0, 0, socket.SOCK_DGRAM, socket.SOL_UDP)
  566. addrs = socket.getaddrinfo("0.0.0.0", 0, 0, socket.SOCK_DGRAM, socket.SOL_UDP)
  567. else:
  568. addrs = socket.getaddrinfo(ip, port, 0, socket.SOCK_STREAM, socket.SOL_TCP)
  569. if len(addrs) == 0:
  570. raise Exception("getaddrinfo failed for %s:%d" % (ip, port))
  571. af, socktype, proto, canonname, sa = addrs[0]
  572. if not self._remote_udp and not self._is_redirect:
  573. if self._forbidden_iplist:
  574. if common.to_str(sa[0]) in self._forbidden_iplist:
  575. if self._remote_address:
  576. raise Exception('IP %s is in forbidden list, when connect to %s:%d via port %d' %
  577. (common.to_str(sa[0]), self._remote_address[0], self._remote_address[1],
  578. self._server._listen_port))
  579. raise Exception('IP %s is in forbidden list, reject' %
  580. common.to_str(sa[0]))
  581. if self._forbidden_portset:
  582. if sa[1] in self._forbidden_portset:
  583. if self._remote_address:
  584. raise Exception('Port %d is in forbidden list, when connect to %s:%d via port %d' %
  585. (sa[1], self._remote_address[0], self._remote_address[1],
  586. self._server._listen_port))
  587. raise Exception('Port %d is in forbidden list, reject' % sa[1])
  588. remote_sock = socket.socket(af, socktype, proto)
  589. self._remote_sock = remote_sock
  590. self._fd_to_handlers[remote_sock.fileno()] = self
  591. if self._remote_udp:
  592. af, socktype, proto, canonname, sa = addrs_v6[0]
  593. remote_sock_v6 = socket.socket(af, socktype, proto)
  594. self._remote_sock_v6 = remote_sock_v6
  595. self._fd_to_handlers[remote_sock_v6.fileno()] = self
  596. remote_sock.setblocking(False)
  597. if self._remote_udp:
  598. remote_sock_v6.setblocking(False)
  599. if not self._is_local:
  600. self._socket_bind_addr(remote_sock, af)
  601. self._socket_bind_addr(remote_sock_v6, af)
  602. else:
  603. remote_sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)
  604. if not self._is_local:
  605. self._socket_bind_addr(remote_sock, af)
  606. return remote_sock
  607. def _handle_dns_resolved(self, result, error):
  608. if error:
  609. self._log_error(error)
  610. self.destroy()
  611. return
  612. if result:
  613. ip = result[1]
  614. if ip:
  615. try:
  616. self._stage = STAGE_CONNECTING
  617. remote_addr = ip
  618. if self._is_local:
  619. remote_port = self._chosen_server[1]
  620. else:
  621. remote_port = self._remote_address[1]
  622. if self._is_local and self._config['fast_open']:
  623. # for fastopen:
  624. # wait for more data to arrive and send them in one SYN
  625. self._stage = STAGE_CONNECTING
  626. # we don't have to wait for remote since it's not
  627. # created
  628. self._update_stream(STREAM_UP, WAIT_STATUS_READING)
  629. # TODO when there is already data in this packet
  630. else:
  631. # else do connect
  632. remote_sock = self._create_remote_socket(remote_addr,
  633. remote_port)
  634. if self._remote_udp:
  635. self._loop.add(remote_sock,
  636. eventloop.POLL_IN,
  637. self._server)
  638. if self._remote_sock_v6:
  639. self._loop.add(self._remote_sock_v6,
  640. eventloop.POLL_IN,
  641. self._server)
  642. else:
  643. try:
  644. remote_sock.connect((remote_addr, remote_port))
  645. except (OSError, IOError) as e:
  646. if eventloop.errno_from_exception(e) in (errno.EINPROGRESS,
  647. errno.EWOULDBLOCK):
  648. pass # always goto here
  649. else:
  650. raise e
  651. self._loop.add(remote_sock,
  652. eventloop.POLL_ERR | eventloop.POLL_OUT,
  653. self._server)
  654. self._stage = STAGE_CONNECTING
  655. self._update_stream(STREAM_UP, WAIT_STATUS_READWRITING)
  656. self._update_stream(STREAM_DOWN, WAIT_STATUS_READING)
  657. if self._remote_udp:
  658. while self._data_to_write_to_remote:
  659. data = self._data_to_write_to_remote[0]
  660. del self._data_to_write_to_remote[0]
  661. self._write_to_sock(data, self._remote_sock)
  662. return
  663. except Exception as e:
  664. shell.print_exception(e)
  665. if self._config['verbose']:
  666. traceback.print_exc()
  667. logging.error("exception from %s:%d" % (self._client_address[0], self._client_address[1]))
  668. self.destroy()
  669. def _on_local_read(self):
  670. # handle all local read events and dispatch them to methods for
  671. # each stage
  672. if not self._local_sock:
  673. return
  674. is_local = self._is_local
  675. data = None
  676. try:
  677. data = self._local_sock.recv(BUF_SIZE)
  678. except (OSError, IOError) as e:
  679. if eventloop.errno_from_exception(e) in \
  680. (errno.ETIMEDOUT, errno.EAGAIN, errno.EWOULDBLOCK):
  681. return
  682. if not data:
  683. self.destroy()
  684. return
  685. ogn_data = data
  686. if not is_local:
  687. if self._encryptor is not None:
  688. if self._encrypt_correct:
  689. try:
  690. obfs_decode = self._obfs.server_decode(data)
  691. except Exception as e:
  692. shell.print_exception(e)
  693. logging.error("exception from %s:%d" % (self._client_address[0], self._client_address[1]))
  694. self.destroy()
  695. return
  696. if obfs_decode[2]:
  697. data = self._obfs.server_encode(b'')
  698. self._write_to_sock(data, self._local_sock)
  699. if obfs_decode[1]:
  700. if not self._protocol.obfs.server_info.recv_iv:
  701. iv_len = len(self._protocol.obfs.server_info.iv)
  702. self._protocol.obfs.server_info.recv_iv = obfs_decode[0][:iv_len]
  703. data = self._encryptor.decrypt(obfs_decode[0])
  704. else:
  705. data = obfs_decode[0]
  706. try:
  707. data, sendback = self._protocol.server_post_decrypt(data)
  708. if sendback:
  709. backdata = self._protocol.server_pre_encrypt(b'')
  710. backdata = self._encryptor.encrypt(backdata)
  711. backdata = self._obfs.server_encode(backdata)
  712. try:
  713. self._write_to_sock(backdata, self._local_sock)
  714. except Exception as e:
  715. shell.print_exception(e)
  716. if self._config['verbose']:
  717. traceback.print_exc()
  718. logging.error(
  719. "exception from %s:%d" % (self._client_address[0], self._client_address[1]))
  720. self.destroy()
  721. return
  722. except Exception as e:
  723. shell.print_exception(e)
  724. logging.error("exception from %s:%d" % (self._client_address[0], self._client_address[1]))
  725. self.destroy()
  726. else:
  727. return
  728. if not data:
  729. return
  730. if self._stage == STAGE_STREAM:
  731. if self._is_local:
  732. if self._encryptor is not None:
  733. data = self._protocol.client_pre_encrypt(data)
  734. data = self._encryptor.encrypt(data)
  735. data = self._obfs.client_encode(data)
  736. self._write_to_sock(data, self._remote_sock)
  737. return
  738. elif is_local and self._stage == STAGE_INIT:
  739. # TODO check auth method
  740. self._write_to_sock(b'\x05\00', self._local_sock)
  741. self._stage = STAGE_ADDR
  742. return
  743. elif self._stage == STAGE_CONNECTING:
  744. self._handle_stage_connecting(data)
  745. elif (is_local and self._stage == STAGE_ADDR) or \
  746. (not is_local and self._stage == STAGE_INIT):
  747. self._handle_stage_addr(ogn_data, data)
  748. def _on_remote_read(self, is_remote_sock):
  749. # handle all remote read events
  750. data = None
  751. try:
  752. if self._remote_udp:
  753. if is_remote_sock:
  754. data, addr = self._remote_sock.recvfrom(UDP_MAX_BUF_SIZE)
  755. else:
  756. data, addr = self._remote_sock_v6.recvfrom(UDP_MAX_BUF_SIZE)
  757. port = struct.pack('>H', addr[1])
  758. try:
  759. ip = socket.inet_aton(addr[0])
  760. data = b'\x00\x01' + ip + port + data
  761. except Exception as e:
  762. ip = socket.inet_pton(socket.AF_INET6, addr[0])
  763. data = b'\x00\x04' + ip + port + data
  764. size = len(data) + 2
  765. if size >= 0xff00:
  766. data = common.chr(0xff) + struct.pack('>H', size - 0xff00 + 1) + data
  767. else:
  768. data = struct.pack('>H', size) + data
  769. # logging.info('UDP over TCP recvfrom %s:%d %d bytes to %s:%d' % (addr[0], addr[1], len(data), self._client_address[0], self._client_address[1]))
  770. else:
  771. data = self._remote_sock.recv(BUF_SIZE)
  772. except (OSError, IOError) as e:
  773. if eventloop.errno_from_exception(e) in \
  774. (errno.ETIMEDOUT, errno.EAGAIN, errno.EWOULDBLOCK, 10035): # errno.WSAEWOULDBLOCK
  775. return
  776. if not data:
  777. self.destroy()
  778. return
  779. if self._encryptor is not None:
  780. if self._is_local:
  781. try:
  782. obfs_decode = self._obfs.client_decode(data)
  783. except Exception as e:
  784. shell.print_exception(e)
  785. logging.error("exception from %s:%d" % (self._client_address[0], self._client_address[1]))
  786. self.destroy()
  787. return
  788. if obfs_decode[1]:
  789. send_back = self._obfs.client_encode(b'')
  790. self._write_to_sock(send_back, self._remote_sock)
  791. if not self._protocol.obfs.server_info.recv_iv:
  792. iv_len = len(self._protocol.obfs.server_info.iv)
  793. self._protocol.obfs.server_info.recv_iv = obfs_decode[0][:iv_len]
  794. data = self._encryptor.decrypt(obfs_decode[0])
  795. try:
  796. data = self._protocol.client_post_decrypt(data)
  797. except Exception as e:
  798. shell.print_exception(e)
  799. logging.error("exception from %s:%d" % (self._client_address[0], self._client_address[1]))
  800. self.destroy()
  801. return
  802. else:
  803. if self._encrypt_correct:
  804. data = self._protocol.server_pre_encrypt(data)
  805. data = self._encryptor.encrypt(data)
  806. data = self._obfs.server_encode(data)
  807. self._server.add_transfer_d(self._user, len(data))
  808. self._update_activity(len(data))
  809. else:
  810. return
  811. try:
  812. self._write_to_sock(data, self._local_sock)
  813. except Exception as e:
  814. shell.print_exception(e)
  815. if self._config['verbose']:
  816. traceback.print_exc()
  817. logging.error("exception from %s:%d" % (self._client_address[0], self._client_address[1]))
  818. self.destroy()
  819. def _on_local_write(self):
  820. # handle local writable event
  821. if self._data_to_write_to_local:
  822. data = b''.join(self._data_to_write_to_local)
  823. self._data_to_write_to_local = []
  824. self._write_to_sock(data, self._local_sock)
  825. else:
  826. self._update_stream(STREAM_DOWN, WAIT_STATUS_READING)
  827. def _on_remote_write(self):
  828. # handle remote writable event
  829. self._stage = STAGE_STREAM
  830. if self._data_to_write_to_remote:
  831. data = b''.join(self._data_to_write_to_remote)
  832. self._data_to_write_to_remote = []
  833. self._write_to_sock(data, self._remote_sock)
  834. else:
  835. self._update_stream(STREAM_UP, WAIT_STATUS_READING)
  836. def _on_local_error(self):
  837. if self._local_sock:
  838. err = eventloop.get_sock_error(self._local_sock)
  839. if err.errno not in [errno.ECONNRESET]:
  840. logging.error(err)
  841. logging.error("local error, exception from %s:%d" % (self._client_address[0], self._client_address[1]))
  842. self.destroy()
  843. def _on_remote_error(self):
  844. if self._remote_sock:
  845. err = eventloop.get_sock_error(self._remote_sock)
  846. if err.errno not in [errno.ECONNRESET]:
  847. logging.error(err)
  848. if self._remote_address:
  849. logging.error(
  850. "remote error, when connect to %s:%d" % (self._remote_address[0], self._remote_address[1]))
  851. else:
  852. logging.error(
  853. "remote error, exception from %s:%d" % (self._client_address[0], self._client_address[1]))
  854. self.destroy()
  855. def handle_event(self, sock, event):
  856. # handle all events in this handler and dispatch them to methods
  857. if self._stage == STAGE_DESTROYED:
  858. logging.debug('ignore handle_event: destroyed')
  859. return
  860. if self._user is not None and self._user not in self._server.server_users:
  861. self.destroy()
  862. return
  863. # order is important
  864. if sock == self._remote_sock or sock == self._remote_sock_v6:
  865. if event & eventloop.POLL_ERR:
  866. self._on_remote_error()
  867. if self._stage == STAGE_DESTROYED:
  868. return
  869. if event & (eventloop.POLL_IN | eventloop.POLL_HUP):
  870. self._on_remote_read(sock == self._remote_sock)
  871. if self._stage == STAGE_DESTROYED:
  872. return
  873. if event & eventloop.POLL_OUT:
  874. self._on_remote_write()
  875. elif sock == self._local_sock:
  876. if event & eventloop.POLL_ERR:
  877. self._on_local_error()
  878. if self._stage == STAGE_DESTROYED:
  879. return
  880. if event & (eventloop.POLL_IN | eventloop.POLL_HUP):
  881. self._on_local_read()
  882. if self._stage == STAGE_DESTROYED:
  883. return
  884. if event & eventloop.POLL_OUT:
  885. self._on_local_write()
  886. else:
  887. logging.warn('unknown socket from %s:%d' % (self._client_address[0], self._client_address[1]))
  888. def _log_error(self, e):
  889. logging.error('%s when handling connection from %s:%d' %
  890. (e, self._client_address[0], self._client_address[1]))
  891. def stage(self):
  892. return self._stage
  893. def destroy(self):
  894. # destroy the handler and release any resources
  895. # promises:
  896. # 1. destroy won't make another destroy() call inside
  897. # 2. destroy releases resources so it prevents future call to destroy
  898. # 3. destroy won't raise any exceptions
  899. # if any of the promises are broken, it indicates a bug has been
  900. # introduced! mostly likely memory leaks, etc
  901. if self._stage == STAGE_DESTROYED:
  902. # this couldn't happen
  903. logging.debug('already destroyed')
  904. return
  905. self._stage = STAGE_DESTROYED
  906. if self._remote_address:
  907. logging.debug('destroy: %s:%d' %
  908. self._remote_address)
  909. else:
  910. logging.debug('destroy')
  911. if self._remote_sock:
  912. logging.debug('destroying remote')
  913. try:
  914. self._loop.remove(self._remote_sock)
  915. except Exception as e:
  916. pass
  917. del self._fd_to_handlers[self._remote_sock.fileno()]
  918. self._remote_sock.close()
  919. self._remote_sock = None
  920. if self._remote_sock_v6:
  921. logging.debug('destroying remote')
  922. try:
  923. self._loop.remove(self._remote_sock_v6)
  924. except Exception as e:
  925. pass
  926. del self._fd_to_handlers[self._remote_sock_v6.fileno()]
  927. self._remote_sock_v6.close()
  928. self._remote_sock_v6 = None
  929. if self._local_sock:
  930. logging.debug('destroying local')
  931. self._loop.remove(self._local_sock)
  932. del self._fd_to_handlers[self._local_sock.fileno()]
  933. self._local_sock.close()
  934. self._local_sock = None
  935. if self._obfs:
  936. self._obfs.dispose()
  937. self._obfs = None
  938. if self._protocol:
  939. self._protocol.dispose()
  940. self._protocol = None
  941. self._encryptor = None
  942. self._dns_resolver.remove_callback(self._handle_dns_resolved)
  943. self._server.remove_handler(self)
  944. self._server.add_connection(-1)
  945. self._server.stat_add(self._client_address[0], -1)
  946. class TCPRelay(object):
  947. def __init__(self, config, dns_resolver, is_local, stat_callback=None, stat_counter=None):
  948. self._config = config
  949. self._is_local = is_local
  950. self._dns_resolver = dns_resolver
  951. self._closed = False
  952. self._eventloop = None
  953. self._fd_to_handlers = {}
  954. self.server_transfer_ul = 0
  955. self.server_transfer_dl = 0
  956. self.server_users = {}
  957. self.server_user_transfer_ul = {}
  958. self.server_user_transfer_dl = {}
  959. self.update_users_protocol_param = None
  960. self.update_users_acl = None
  961. self.server_connections = 0
  962. self.protocol_data = obfs.obfs(config['protocol']).init_data()
  963. self.obfs_data = obfs.obfs(config['obfs']).init_data()
  964. if config.get('connect_verbose_info', 0) > 0:
  965. common.connect_log = logging.info
  966. self._timeout = config['timeout']
  967. self._timeout_cache = lru_cache.LRUCache(timeout=self._timeout,
  968. close_callback=self._close_tcp_client)
  969. if is_local:
  970. listen_addr = config['local_address']
  971. listen_port = config['local_port']
  972. else:
  973. listen_addr = config['server']
  974. listen_port = config['server_port']
  975. self._listen_port = listen_port
  976. if common.to_bytes(config['protocol']) in [b"auth_aes128_md5", b"auth_aes128_sha1"]:
  977. self._update_users(None, None)
  978. addrs = socket.getaddrinfo(listen_addr, listen_port, 0,
  979. socket.SOCK_STREAM, socket.SOL_TCP)
  980. if len(addrs) == 0:
  981. raise Exception("can't get addrinfo for %s:%d" %
  982. (listen_addr, listen_port))
  983. af, socktype, proto, canonname, sa = addrs[0]
  984. server_socket = socket.socket(af, socktype, proto)
  985. server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  986. server_socket.bind(sa)
  987. server_socket.setblocking(False)
  988. if config['fast_open']:
  989. try:
  990. server_socket.setsockopt(socket.SOL_TCP, 23, 5)
  991. except socket.error:
  992. logging.error('warning: fast open is not available')
  993. self._config['fast_open'] = False
  994. server_socket.listen(config.get('max_connect', 1024))
  995. self._server_socket = server_socket
  996. self._stat_counter = stat_counter
  997. self._stat_callback = stat_callback
  998. def add_to_loop(self, loop):
  999. if self._eventloop:
  1000. raise Exception('already add to loop')
  1001. if self._closed:
  1002. raise Exception('already closed')
  1003. self._eventloop = loop
  1004. self._eventloop.add(self._server_socket,
  1005. eventloop.POLL_IN | eventloop.POLL_ERR, self)
  1006. self._eventloop.add_periodic(self.handle_periodic)
  1007. def remove_handler(self, client):
  1008. if hash(client) in self._timeout_cache:
  1009. del self._timeout_cache[hash(client)]
  1010. def add_connection(self, val):
  1011. self.server_connections += val
  1012. logging.debug('server port %5d connections = %d' % (self._listen_port, self.server_connections,))
  1013. def get_ud(self):
  1014. return (self.server_transfer_ul, self.server_transfer_dl)
  1015. def get_users_ud(self):
  1016. return (self.server_user_transfer_ul.copy(), self.server_user_transfer_dl.copy())
  1017. def _update_users(self, protocol_param, acl):
  1018. if protocol_param is None:
  1019. protocol_param = self._config['protocol_param']
  1020. param = common.to_bytes(protocol_param).split(b'#')
  1021. if len(param) == 2:
  1022. user_list = param[1].split(b',')
  1023. if user_list:
  1024. for user in user_list:
  1025. items = user.split(b':')
  1026. if len(items) == 2:
  1027. user_int_id = int(items[0])
  1028. uid = struct.pack('<I', user_int_id)
  1029. if acl is not None and user_int_id not in acl:
  1030. self.del_user(uid)
  1031. else:
  1032. passwd = items[1]
  1033. self.add_user(uid, passwd)
  1034. def update_users(self, protocol_param, acl):
  1035. self.update_users_protocol_param = protocol_param
  1036. self.update_users_acl = acl
  1037. def add_user(self, user, passwd): # user: binstr[4], passwd: str
  1038. self.server_users[user] = common.to_bytes(passwd)
  1039. def del_user(self, user):
  1040. if user in self.server_users:
  1041. del self.server_users[user]
  1042. def add_transfer_u(self, user, transfer):
  1043. if user is None:
  1044. self.server_transfer_ul += transfer
  1045. else:
  1046. if user not in self.server_user_transfer_ul:
  1047. self.server_user_transfer_ul[user] = 0
  1048. self.server_user_transfer_ul[user] += transfer + self.server_transfer_ul
  1049. self.server_transfer_ul = 0
  1050. def add_transfer_d(self, user, transfer):
  1051. if user is None:
  1052. self.server_transfer_dl += transfer
  1053. else:
  1054. if user not in self.server_user_transfer_dl:
  1055. self.server_user_transfer_dl[user] = 0
  1056. self.server_user_transfer_dl[user] += transfer + self.server_transfer_dl
  1057. self.server_transfer_dl = 0
  1058. def update_stat(self, port, stat_dict, val):
  1059. newval = stat_dict.get(0, 0) + val
  1060. stat_dict[0] = newval
  1061. logging.debug('port %d connections %d' % (port, newval))
  1062. connections_step = 25
  1063. if newval >= stat_dict.get(-1, 0) + connections_step:
  1064. logging.info('port %d connections up to %d' % (port, newval))
  1065. stat_dict[-1] = stat_dict.get(-1, 0) + connections_step
  1066. elif newval <= stat_dict.get(-1, 0) - connections_step:
  1067. logging.info('port %d connections down to %d' % (port, newval))
  1068. stat_dict[-1] = stat_dict.get(-1, 0) - connections_step
  1069. def stat_add(self, local_addr, val):
  1070. if self._stat_counter is not None:
  1071. if self._listen_port not in self._stat_counter:
  1072. self._stat_counter[self._listen_port] = {}
  1073. newval = self._stat_counter[self._listen_port].get(local_addr, 0) + val
  1074. logging.debug('port %d addr %s connections %d' % (self._listen_port, local_addr, newval))
  1075. self._stat_counter[self._listen_port][local_addr] = newval
  1076. self.update_stat(self._listen_port, self._stat_counter[self._listen_port], val)
  1077. if newval <= 0:
  1078. if local_addr in self._stat_counter[self._listen_port]:
  1079. del self._stat_counter[self._listen_port][local_addr]
  1080. newval = self._stat_counter.get(0, 0) + val
  1081. self._stat_counter[0] = newval
  1082. logging.debug('Total connections %d' % newval)
  1083. connections_step = 50
  1084. if newval >= self._stat_counter.get(-1, 0) + connections_step:
  1085. logging.info('Total connections up to %d' % newval)
  1086. self._stat_counter[-1] = self._stat_counter.get(-1, 0) + connections_step
  1087. elif newval <= self._stat_counter.get(-1, 0) - connections_step:
  1088. logging.info('Total connections down to %d' % newval)
  1089. self._stat_counter[-1] = self._stat_counter.get(-1, 0) - connections_step
  1090. def update_activity(self, client, data_len):
  1091. if data_len and self._stat_callback:
  1092. self._stat_callback(self._listen_port, data_len)
  1093. self._timeout_cache[hash(client)] = client
  1094. def _sweep_timeout(self):
  1095. self._timeout_cache.sweep()
  1096. def _close_tcp_client(self, client):
  1097. if client.remote_address:
  1098. logging.debug('timed out: %s:%d' %
  1099. client.remote_address)
  1100. else:
  1101. logging.debug('timed out')
  1102. client.destroy()
  1103. def handle_event(self, sock, fd, event):
  1104. # handle events and dispatch to handlers
  1105. if sock:
  1106. logging.log(shell.VERBOSE_LEVEL, 'fd %d %s', fd,
  1107. eventloop.EVENT_NAMES.get(event, event))
  1108. if sock == self._server_socket:
  1109. if event & eventloop.POLL_ERR:
  1110. # TODO
  1111. raise Exception('server_socket error')
  1112. try:
  1113. logging.debug('accept')
  1114. conn = self._server_socket.accept()
  1115. handler = TCPRelayHandler(self, self._fd_to_handlers,
  1116. self._eventloop, conn[0], self._config,
  1117. self._dns_resolver, self._is_local)
  1118. if handler.stage() == STAGE_DESTROYED:
  1119. conn[0].close()
  1120. except (OSError, IOError) as e:
  1121. error_no = eventloop.errno_from_exception(e)
  1122. if error_no in (errno.EAGAIN, errno.EINPROGRESS,
  1123. errno.EWOULDBLOCK):
  1124. return
  1125. else:
  1126. shell.print_exception(e)
  1127. if self._config['verbose']:
  1128. traceback.print_exc()
  1129. else:
  1130. if sock:
  1131. handler = self._fd_to_handlers.get(fd, None)
  1132. if handler:
  1133. handler.handle_event(sock, event)
  1134. else:
  1135. logging.warn('poll removed fd')
  1136. def handle_periodic(self):
  1137. if self._closed:
  1138. if self._server_socket:
  1139. self._eventloop.remove(self._server_socket)
  1140. self._server_socket.close()
  1141. self._server_socket = None
  1142. logging.info('closed TCP port %d', self._listen_port)
  1143. for handler in list(self._fd_to_handlers.values()):
  1144. handler.destroy()
  1145. elif self.update_users_protocol_param is not None or self.update_users_acl is not None:
  1146. self._update_users(self.update_users_protocol_param, self.update_users_acl)
  1147. self.update_users_protocol_param = None
  1148. self.update_users_acl = None
  1149. self._sweep_timeout()
  1150. def close(self, next_tick=False):
  1151. logging.debug('TCP close')
  1152. self._closed = True
  1153. if not next_tick:
  1154. if self._eventloop:
  1155. self._eventloop.remove_periodic(self.handle_periodic)
  1156. self._eventloop.remove(self._server_socket)
  1157. self._server_socket.close()
  1158. for handler in list(self._fd_to_handlers.values()):
  1159. handler.destroy()