def __init__(self, server, fd_to_handlers, loop, local_sock, config, dns_resolver): logging.info(''' *** [%d]: LIFECYCLE START *** '''.strip() % (local_sock.fileno())) logging.info('[%d]: 创建关于该请求的 TCPReplyHandler 并将其添加进 loop' % (local_sock.fileno())) self._server = server self._fd_to_handlers = fd_to_handlers self._loop = loop self._local_sock = local_sock self._remote_sock = None self._config = config self._dns_resolver = dns_resolver self._stage = STAGE_INIT self._cryptor = cryptor.Cryptor(config['password'], config['method'], config['crypto_path']) self._data_to_write_to_local = [] self._data_to_write_to_remote = [] self._upstream_status = WAIT_STATUS_READING self._downstream_status = WAIT_STATUS_INIT self._client_address = local_sock.getpeername()[:2] self._remote_address = None self._forbidden_iplist = config.get('forbidden_ip') self._chosen_server = self._get_a_server() fd_to_handlers[local_sock.fileno()] = self local_sock.setblocking(False) local_sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1) loop.add(local_sock, eventloop.POLL_IN | eventloop.POLL_ERR, self._server) self.last_activity = 0 self._update_activity()
def handle_udp_connection_made(self, transport, peername): self._stage = self.STAGE_INIT self._transport = transport self._transport_protocol = protocol.TRANSPORT_UDP self._cryptor = cryptor.Cryptor(protocol.TRANSPORT_UDP, self._key) self._peername = peername self._logger = logging.getLogger('<LocalUDP{0} {1}>'.format(self._peername, hex(id(self)))) self._logger.debug('udp connection made')
def __init__(self, addr, port, data, key, local): TimeoutHandler.__init__(self) self._logger = logging.getLogger('<RemoteUDP{0} {1}>'.format((addr, port), hex(id(self)))) self._data = data self._local = local self._peername = None self._transport = None self._transport_type = protocol.TRANSPORT_UDP self._cryptor = cryptor.Cryptor(protocol.TRANSPORT_UDP, key)
def handle_tcp_connection_made(self, transport): self.keep_alive_open() self._stage = self.STAGE_INIT self._transport = transport self._transport_protocol = protocol.TRANSPORT_TCP self._cryptor = cryptor.Cryptor(protocol.TRANSPORT_TCP, self._key) self._peername = self._transport.get_extra_info('peername') self._logger = logging.getLogger('<LocalTCP{0} {1}>'.format(self._peername, hex(id(self)))) self._logger.debug('tcp connection made')
def _on_local_read(self): # handle all local read events and dispatch them to methods for # each stage if not self._local_sock: return is_local = self._is_local data = None if is_local: buf_size = UP_STREAM_BUF_SIZE else: buf_size = DOWN_STREAM_BUF_SIZE try: data = self._local_sock.recv(buf_size) if self._firstPacket is False and not is_local: self._firstPacket = True methods = ['aes-256-cfb', 'aes-128-cfb'] encrypt_index = common.ord(data[0]) print(":".join("{:02x}".format(ord(c)) for c in data)) if encrypt_index < len(methods): data = data[1:] print('method!!!', methods[encrypt_index]) self._cryptor = cryptor.Cryptor( self._config['password'], methods[encrypt_index], self._config['crypto_path']) else: return except (OSError, IOError) as e: if eventloop.errno_from_exception(e) in \ (errno.ETIMEDOUT, errno.EAGAIN, errno.EWOULDBLOCK): return if not data: self.destroy() return self._update_activity(len(data)) if not is_local: data = self._cryptor.decrypt(data) if not data: return if self._stage == STAGE_STREAM: self._handle_stage_stream(data) return elif is_local and self._stage == STAGE_INIT: # jump over socks5 init if self._is_tunnel: self._handle_stage_addr(data) return else: self._handle_stage_init(data) elif self._stage == STAGE_CONNECTING: self._handle_stage_connecting(data) elif (is_local and self._stage == STAGE_ADDR) or \ (not is_local and self._stage == STAGE_INIT): self._handle_stage_addr(data)
def __init__(self, server, fd_to_handlers, loop, local_sock, config, dns_resolver, is_local): self._server = server self._fd_to_handlers = fd_to_handlers self._loop = loop self._local_sock = local_sock self._remote_sock = None self._config = config self._dns_resolver = dns_resolver self.tunnel_remote = config.get('tunnel_remote', "8.8.8.8") self.tunnel_remote_port = config.get('tunnel_remote_port', 53) self.tunnel_port = config.get('tunnel_port', 53) self._is_tunnel = server._is_tunnel # TCP Relay works as either sslocal or ssserver # if is_local, this is sslocal self._is_local = is_local # 状态机:初始化 self._stage = STAGE_INIT self._cryptor = cryptor.Cryptor(config['password'], config['method'], config['crypto_path']) self._ota_enable = config.get('one_time_auth', False) self._ota_enable_session = self._ota_enable self._ota_buff_head = b'' self._ota_buff_data = b'' self._ota_len = 0 self._ota_chunk_idx = 0 self._fastopen_connected = False self._data_to_write_to_local = [] self._data_to_write_to_remote = [] self._upstream_status = WAIT_STATUS_READING self._downstream_status = WAIT_STATUS_INIT self._client_address = local_sock.getpeername()[:2] self._remote_address = None self._forbidden_iplist = config.get('forbidden_ip') if is_local: self._chosen_server = self._get_a_server() # 指定一个file描述符 fd_to_handlers[local_sock.fileno()] = self # 非阻塞 local_sock.setblocking(False) # TCP_NODELAY选项禁止Nagle算法。 # Nagle算法通过将未确认的数据存入缓冲区直到蓄足一个包一起发送的方法,来减少主机发送的零碎小数据包的数目。 local_sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1) loop.add(local_sock, eventloop.POLL_IN | eventloop.POLL_ERR, self._server) self.last_activity = 0 # 更新为“最近有活跃的链接”,否则超时 self._update_activity()
def __init__(self, server, fd_to_handlers, loop, local_sock, config, dns_resolver, is_local): logging.info("%s instantiated" % (self.__class__.__name__)) self._server = server self._fd_to_handlers = fd_to_handlers self._loop = loop self._local_sock = local_sock self._remote_sock = None self._config = config self._dns_resolver = dns_resolver self.tunnel_remote = config.get('tunnel_remote', "8.8.8.8") self.tunnel_remote_port = config.get('tunnel_remote_port', 53) self.tunnel_port = config.get('tunnel_port', 53) self._is_tunnel = server._is_tunnel # TCP Relay works as either sslocal or ssserver # if is_local, this is sslocal self._is_local = is_local self._stage = STAGE_INIT self._cryptor = cryptor.Cryptor(config['password'], config['method'], config['crypto_path']) self._ota_enable = config.get('one_time_auth', False) self._ota_enable_session = self._ota_enable self._ota_buff_head = b'' self._ota_buff_data = b'' self._ota_len = 0 self._ota_chunk_idx = 0 self._fastopen_connected = False self._data_to_write_to_local = [] self._data_to_write_to_remote = [] self._upstream_status = WAIT_STATUS_READING self._downstream_status = WAIT_STATUS_INIT self._client_address = local_sock.getpeername()[:2] self._remote_address = None self._forbidden_iplist = config.get('forbidden_ip') if is_local: self._chosen_server = self._get_a_server() fd_to_handlers[local_sock.fileno()] = self local_sock.setblocking(False) local_sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1) logging.info('local_sock:%d peer_addr:%s' % (local_sock.fileno(), self._client_address)) loop.add(local_sock, eventloop.POLL_IN | eventloop.POLL_ERR, self._server) self.last_activity = 0 self._update_activity()
def __init__(self, server, fd_to_handlers, loop, local_sock, config, dns_resolver, is_local): self._server = server self._fd_to_handlers = fd_to_handlers self._loop = loop self._local_sock = local_sock self._remote_sock = None self._config = config self._dns_resolver = dns_resolver # TCP Relay works as either sslocal or ssserver # if is_local, this is sslocal self._is_local = is_local self._stage = STAGE_INIT self._cryptor = cryptor.Cryptor(config['password'], config['method']) if 'one_time_auth' in config: self._ota_enable = config['one_time_auth'] else: self._ota_enable = False self._ota_enable_session = self._ota_enable self._ota_buff_head = b'' self._ota_buff_data = b'' self._ota_len = 0 self._ota_chunk_idx = 0 self._fastopen_connected = False self._data_to_write_to_local = [] self._data_to_write_to_remote = [] self._upstream_status = WAIT_STATUS_READING self._downstream_status = WAIT_STATUS_INIT self._remote_address = None if 'forbidden_ip' in config: self._forbidden_iplist = config['forbidden_ip'] else: self._forbidden_iplist = None if is_local: self._chosen_server = self._get_a_server() fd_to_handlers[local_sock.fileno()] = self local_sock.setblocking(False) local_sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1) loop.add(local_sock, eventloop.POLL_IN | eventloop.POLL_ERR, self._server) self.last_activity = 0 self._update_activity()
def __init__(self, server, fd_to_handlers, loop, local_sock, config, dns_resolver, is_local): self._server = server self._fd_to_handlers = fd_to_handlers self._loop = loop self._local_sock = local_sock self._remote_sock = None self._config = config self._dns_resolver = dns_resolver self.tunnel_remote = config.get('tunnel_remote', "8.8.8.8") self.tunnel_remote_port = config.get('tunnel_remote_port', 53) self.tunnel_port = config.get('tunnel_port', 53) self._is_tunnel = server._is_tunnel # TCP Relay works as either sslocal or ssserver # if is_local, this is sslocal self._is_local = is_local self._stage = STAGE_INIT self._cryptor = cryptor.Cryptor(config['password'], config['method'], config['crypto_path']) self._fastopen_connected = False self._data_to_write_to_local = [] self._data_to_write_to_remote = [] self._upstream_status = WAIT_STATUS_READING self._downstream_status = WAIT_STATUS_INIT self._remote_address = None self._forbidden_iplist = config.get('forbidden_ip') if is_local: self._chosen_server = self._get_a_server() fd_to_handlers[local_sock.fileno()] = self local_sock.setblocking(False) local_sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1) loop.add(local_sock, eventloop.POLL_IN | eventloop.POLL_ERR, self._server) self.last_activity = 0 self._update_activity()