Crear red P2P descentralizada

Iniciado por Kaxperday, 5 Septiembre 2015, 21:51 PM

0 Miembros y 1 Visitante están viendo este tema.

Kaxperday

Hola a todos, quería informarme de como crear una red P2P descentralizada, me he estado informando y según he leído no requiere un servidor que haga de enroutador. Simplemente los usuarios actuan como cliente y servidor a la vez, vale. Pero mi pregunta es, ¿como hago que los usuarios busquen a más usuarios entre sí?.

Mi idea es programar algo sencillo en C++, sería una red P2P descentralizada. El cliente haría de cliente y servidor a la vez, es decir, se conectaría a otro cliente o usuario de la red y a la vez permitiría que estos se conectaran a el, para compartir información. Una vez tenga la IP  de estos sería fácil para mi por medio de sockets realizar la conexion, pero la pregunta es:

¿Como encuentro la IP de los clientes conectados, cual es el método de programación que he de usar? ¿Como obtengo la lista de todos los clientes conectados de la red? (Tendría que preguntar al que ya tengo y este a los que ya tiene y así hasta acabar supongo).

Algo de información pls, estoy leyendo pero no se como implementar.

Podría hacer una centralizada, pero no busco eso, quiero está que es más difícil y supongo que más estable ya que no depende de un server central.

Saludos y gracias.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

engel lex

que sea descentralizada significa que no hay servidores de datos que sirvan como nodos mayores, sin embargo, debe haber servidores trackers fijos que los clientes busquen y tengan la información de la colmena (los cientes conectados y las cosas utiles que se merezcan conocer) de resto es practicamente imposible la implementación sin trackers
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

someRandomCode

Sumado a lo que dice engel, trata de usar UPnP por si tenes que pasar por algun routeador que tiene la posibilidad de usarlo para no tener que hacer explicitamente el port forward (redireccion de puertos, o "abrir puertos" como se dice mal, porque en realidad eso es otra cosa que es dejar pasar el trafico).

La arquitectura de un servicio P2P sencillo es tener un tracker, y varios clientes.
Los clientes conectan al tracker, piden la informacion de un archivo (por ejemplo) y a base de esa informacion solicitan pares. Luego el servidor devuelve la direccion de base dentro de la red para que te conectes directamente a ellos y, por ejemplo, transfieras archvos con DCC.

engel lex

cierto... aunque hay  una tecnica llamada "port bashing" o algo similar, que es que el tracker le avisa a ambos clientes que deben comunicarse entre ellos y los puertos a usar, ambos empiezan a enviarse mensajes por la ruta indicada, haciendo que el NAT haga el forwarding y enrutando todo correctamente
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

someRandomCode

El NAT automatizado funciona con UPnP en plataformas Windows :P

Es la forma de decirle al router "che, todo lo que te llegue en el puerto 8976 no lo tires porque es para mi" sino el routueador ve que tiene su IP pero el mismo no tiene ese puerto en estado de escucha y descarta los paquetes..

Lo que se hace es port knocking de ultima, pero eso requiere que haya una configuracion previa de ese puerto, lo que no hace falta es que el mismo sea conocido.. Digamos que es como hacer banner grabbing para saber que es lo que eesta del otro lado..

Kaxperday

#5
Hola compañeros, muchas gracias por las respuestas.

Entonces lo que buscaba era un "tracker", entiendo. Pero eso ¿no sería una red P2P centralizada? Mmmm nos estamos conectando a un servidor para obtener información de los hosts. Si cae el servidor adiós red.

Mi idea de implementación en base a mis conocimientos, sería crear un servidor, o usar un servidor web gratuito, donde los clientes hagan HTTP request  al servidor y el servidor los vaya metiendo en una tabla, con su IP, y si pasado X tiempo no llegan datos de uno se eliminaría de la tabla. Allí mostraría los usuarios de la red en una tabla con IP y puerto. Al hacer HTTP request a la página obtendrían el listado de hosts online, con los que poder compartir información.

Incluso podría dar órdenes desde el servidor web a un cliente, y hacer que este envíe un comando a los demás, ese comando quedaría intraceable ya que pasaría de nodo a nodo.

El problema es que la página web que haría de "tracker" podría fallar, o desaparecer al ser de dominio gratuito, y si es atacada caería la red, ¿cómo podría comunicar entonces a los usuarios? ¿qué más maneras se os ocurren?.

Claro que el server solo recojería las IPs que hacen HTTP request y las mostraría, y pasaría de response las que tiene en la tabla, luego los clientes harían la red.

Me gustaría tener una mejor solución que esa XD.

Saludos.

Edito: El problema es que sería muy fácil tumbarla pues el cliente se estaría conectando todo el rato al servidor web para ver quienes están conectados, alguien que tiene el cliente abre wireshark ve el server de donde extrae la info de la red y se puede cargar fácilmente el server así como la red.

OOoo mejor, se me acaba de ocurrir que cuando entre un nuevo cliente haga post al tracker, y luego mande a los hosts un "hola estoy aqui" y estos lo añadan en la tabla sin necesidad de que tengan que estar todo el tiempo comunicandose con el server, bien.
De esta manera se comunicarían solo una vez, pero si un cliente se apaga seguiría figurando en la tabla del servidor..(pero luego al bajarse la tabla y que saltase el timeout lo descartaría), pero abría que eliminarlos del server (para eso hacer un ping cada hora aunque sea podría funcionar) a ver a ver...  :rolleyes: :rolleyes:
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

engel lex

a tu pregunta

Cita de: Kaxperday en  6 Septiembre 2015, 00:48 AM
Entonces lo que buscaba era un "tracker", entiendo. Pero eso ¿no sería una red P2P centralizada?


ya respondí
Cita de: engel lex en  5 Septiembre 2015, 22:16 PM
que sea descentralizada significa que no hay servidores de datos que sirvan como nodos mayores

si crees que enviandose entre pcs el mensaje no es rastreable es un chiste XD entre más pc encadenen el mensaje, más agarrarán por vez si la posicía se involucra...

y si... que sea un tracker fijo la hace vulnerable... esa es una de las vulnerabilidades del p2p, por eso todo nodo puede hacer de tracker...

si te fijas un magnet link de torrent (p2p descentralizado)

magnet:?xt=urn:btih:70569d196dafccbebf9b9f72d6ae609f19d51496&dn=Tyrant+S02E12+2015+HDTV+x264+-+AFG&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969

el formato es
magnet:?xt=hash_identificador&dn=nombre+del+torrent&tr=tracker1&tr=tracker2&tr=trackerN
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Kaxperday

#7
Ahh vale, ahora entiendo bien. Podría hacer algo "persistente" creando varios servidores web HTTP y poniendo su IP en el cliente, de esta manera si falla uno saltarían al siguiente, y desde el siguiente que pueda mandar una orden o que lo haga desde un cliente (con una firma) diciendo que añadan un nuevo dominio de web que he creado y que eliminen el anterior.

Pero ayer estuve leyendo acerca del troyano más sofisticado actualmente el "Gameover Zeus" o "zbot", y si no puede conectarse a la red por medio del tracker creaba un dominio en función del día y la hora, para que se conectaran a él me pareció entender.

También, para no perder conexión con el tracker en caso de que el tracker principal cayera, el programa hacía peticiones HTTP a dominios random con terminaciones .com, .biz, .net ... con una palabra clave como "gameover-zeus-dga.com" etc.

CitarP2P layer peer communication entries – tagged "gameover-zeus-peer"
HTTP proxy layer connections – tagged "gameover-zeus-proxy"
Fallback DGA requests (to 1000 random domains per week in the .biz, .com, .info, .net, .org and .ru TLDs) – tagged "gameover-zeus-dga"

De esta manera si cae todos los trackers el cliente mandará peticiones a dominios aleatorios y cuando el controlador de la red cree ese dominio, habrá podido reconectar toda la botnet y controlar los bots. Es bastante fino.

LEEAN: http://blog.shadowserver.org/2014/06/08/gameover-zeus-cryptolocker/

Muy interesante, así se comunica el troyano más potente del mundo.
Y con esto ya creo que puedo partir a hacer pequeños programillas.

Saludos y gracias.

Edito: Aunque si pongamos que "la policia" tomará el control del primer tracker, y se apoderara de ese dominio, ¿como reconectaríamos?, yo creo que aunque haya conexión con el tracker principal, habría que mandar peticiones a los demás servidores frecuentemente, o mejor aún a servidores que se generen aleatoriamente, y que solo el autor sepa cuales son.

Así pues podríamos tener un programa que genere en orden 1000 dominios distintos, solo el creador sabría que dominios generaría y cuando cree uno reconectaría la botnet, a pesar de tener conexión con el tracker principal, debería de hacerlo por si nos quieren robar la botnet que no puedan, ya que cada cierto tiempo se conectaría a uno de estos 1000 dominios. Bastante fino la verdad.

Edito:
Citarque sea descentralizada significa que no hay servidores de datos que sirvan como nodos mayores

Okey se me debió de pasar engelx, gracias por la respuesta. Ya no tengo dudas.

Muuucho tiempo, laaargo proyecto.

Edito: Podria generar 1000 cadenas usando una semilla única en todos los clientes obtendría los mismos dominios, ya solo sería que lanzaran peticiones a ellos y si alguno responde con la adecuada respuesta, se reconectaría la red. Muchas cosas.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.