コード例 #1
0
    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()
コード例 #2
0
ファイル: server.py プロジェクト: pixelorz/shadowsocks-naive
 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')
コード例 #3
0
ファイル: server.py プロジェクト: pixelorz/shadowsocks-naive
 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)
コード例 #4
0
ファイル: server.py プロジェクト: pixelorz/shadowsocks-naive
 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')
コード例 #5
0
ファイル: tcprelay.py プロジェクト: LitleCarl/shadowsocks
    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)
コード例 #6
0
    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()
コード例 #7
0
    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()
コード例 #8
0
    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()
コード例 #9
0
    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()