Пример #1
0
    def recvFromRemote(self, remote_socket, mask, target_ip, target_port):
        try:
            tunnel = self.tunnelWithSocket(remote_socket)
            data = remote_socket.recv(Constants.BUFFER_SIZE)
            if data:
                self.logger.debug("recv from remote {}->{}: {}".format(
                    util.fromHexHost(tunnel.controller_host),
                    util.fromHexHost(tunnel.target_host),
                    data[:Constants.LOG_MSG_SIZE]))
                self.msg_seq += 1
                msg = util.encodeMessage(self.msg_seq, Constants.CMD_FORWARD,
                                         tunnel.controller_host,
                                         tunnel.target_host, data)
                self.proxy_send_buffer.put(msg)
            else:
                self.logger.info("recv null from remote {}".format(
                    util.fromHexHost(tunnel.controller_host)))
                self.disconnectRemote(tunnel.controller_host)
                self.sendDisconnectRemote(tunnel.controller_host,
                                          tunnel.target_host)
        except Exception as e:
            try:
                (controller_ip,
                 controller_port) = util.fromHexHost(tunnel.controller_host)
                self.logger.info("connection closed {}->{}: {}".format(
                    util.fromHexHost(tunnel.controller_host),
                    util.fromHexHost(tunnel.target_host), e))
                self.disconnectRemote(tunnel.controller_host)
                self.sendDisconnectRemote(tunnel.controller_host,
                                          tunnel.target_host)

            except Exception as e:
                self.logger.critical("error when closing socket: {}".format(e))
                self.logger.critical(
                    "cannot close the other side's remote socket")
Пример #2
0
 def sendDisconnectRemote(self, from_host, to_host, reason=None):
     self.msg_seq += 1
     msg = util.encodeMessage(
         self.msg_seq, Constants.CMD_REMOTE_DISCONNECT, from_host, to_host,
         reason.encode()
         if reason else None)  # tell server the remote cannot be connected
     self.proxy_send_buffer.put(msg)
Пример #3
0
 def proxyKeepAliveThread(self):
     self.logger.info("started")
     while self.running:
         if self.proxy_connected.is_set():
             curr_time = time.time()
             since_last_msg = curr_time - self.proxy_last_com_time
             if since_last_msg > Constants.HEART_BEAT_INTERVAL:
                 payload = util.intToHex(int(curr_time)) + util.shortToHex(
                     int((curr_time * 1000) % 1000))
                 # send a heart beat
                 self.msg_seq += 1
                 msg = util.encodeMessage(
                     self.msg_seq, Constants.CMD_ALV,
                     util.toHexHost(self.proxy_ip, self.proxy_port),
                     util.toHexHost(self.proxy_ip, self.proxy_port),
                     payload)
                 self.proxy_send_buffer.put(msg)
                 self.logger.info("added keep alive to proxy send buffer")
         time.sleep(Constants.HEART_BEAT_INTERVAL)
     self.logger.info("ended")
Пример #4
0
    def handleProxyMsg(self, msg):
        (seq, cmd, from_host, to_host, payload) = util.decodeMessage(msg)
        self.logger.debug(
            "read data from proxy: cmd: {}, {}->{}: seq: {}, data: {}".format(
                cmd, util.fromHexHost(from_host), util.fromHexHost(to_host),
                seq, payload[:Constants.LOG_MSG_SIZE]))

        if cmd == Constants.CMD_GREETING:
            self.logger.info("greeting from proxy: {}".format(payload))

        elif cmd == Constants.CMD_FORWARD:
            self.remote_send_buffer.put(msg)

        elif cmd == Constants.CMD_REMOTE_DISCONNECT:
            # 3: CMD, 6:disconnect remote, 6:to be told remote, other: reason
            from_ip, from_port = util.fromHexHost(from_host)
            to_ip, to_port = util.fromHexHost(to_host)

            if to_host not in self.tunnel_dict:
                self.logger.error("error: no remote {}:{} found: {}".format(
                    to_ip, to_port, payload))
            else:
                self.logger.info(
                    "the other side's remote {}:{}->{}:{} disconnected: {}".
                    format(from_ip, from_port, to_ip, to_port, payload))
                self.disconnectRemote(to_host)

        elif cmd == Constants.CMD_ALV:
            # echo back
            latency = time.time() - (util.intFromHex(payload[0:4]) +
                                     util.shortFromHex(payload[4:6]) / 1000.0)
            self.logger.info(
                "recved proxy client keepalive, latency: {}ms".format(
                    int(latency * 1000.0)))
            self.msg_seq += 1
            out_msg = util.encodeMessage(self.msg_seq, cmd, to_host, from_host,
                                         payload)
            self.proxy_send_buffer.put(out_msg)

        else:
            self.logger.error("unknown cmd from proxy: {}".format(cmd))
Пример #5
0
    def recvFromRemote(self, sock, msg):
        (seq, cmd, from_host, to_host, payload) = util.decodeMessage(msg)
        try:
            # remote_host = sock.getpeername()
            data = sock.recv(Constants.BUFFER_SIZE)

            if data:
                self.logger.debug("recv from remote {}: {}".format(
                    sock.getpeername(), data[:Constants.LOG_MSG_SIZE]))
                self.msg_seq += 1
                msg = util.encodeMessage(self.msg_seq, Constants.CMD_FORWARD,
                                         to_host, from_host, data)
                self.proxy_send_buffer.put(msg)
            else:
                self.logger.info("recv null from remote {}".format(
                    sock.getsockname()))
                self.disconnectRemote(sock, from_host, to_host)
                self.sendDisconnectRemote(to_host, from_host)

        except Exception as e:
            self.logger.error("error when recv from remote {}: {}".format(
                sock.getsockname(), e))
            self.disconnectRemote(sock, from_host, to_host)
            self.sendDisconnectRemote(to_host, from_host)