socket servidor recibir juegos hilos enviar datos conectar con computadoras cliente java sockets localhost loopback serversocket

servidor - sockets en java enviar y recibir



¿Cómo puedo hacer que un socket acepte conexiones solo desde el localhost(en Java)? (5)

Tengo una aplicación Java (que no se ejecuta en ningún contenedor de aplicaciones) que escucha en un ServerSocket para las conexiones. Me gustaría que solo acepte conexiones que provienen de localhost. Actualmente, después de que se acepta una conexión, comprueba la IP par y la rechaza si no es la dirección de bucle invertido, pero sé que las direcciones IP pares pueden ser falsificadas. Entonces, si es posible, preferiría vincularme a un socket que solo escucha en la interfaz loopback; ¿es posible?

He intentado algunas cosas diferentes (como especificar "127.0.0.1" como la dirección local al llamar a bind ()) sin suerte. Gracias por adelantado.

Gracias por toda tu ayuda. Me avergüenza admitir que esto fue todo mi error. Nuestra aplicación escucha en dos puertos diferentes, y yo estaba vinculando uno a la interfaz de bucle de retroceso, pero la prueba en contra de la otra. Cuando trato de hacer telnet en el puerto correcto, todo funciona bien (es decir, el enlace a "127.0.0.1" hace exactamente lo que se supone).

En cuanto a suplantar la dirección de loopback, ustedes tienen razón. No debería haber hecho que sonara como la principal preocupación. Realmente, el comportamiento deseado es solo tomar conexiones locales, y enlazar solo a la interfaz local es una forma más directa de lograr eso que aceptar todas las conexiones y luego cerrar las no locales.


Cuando vincula su ServerSocket, la especificación de localhost debe hacer que la pila TCP / IP rechace la conexión. Incluso si esto no funciona en su sistema, localhost no puede (vale, tal vez si alguien pirateó su pila de TCP / IP y el enrutador de puerta de enlace por defecto) ser falsificado, ya que esa dirección no se enruta a través de la interfaz física.

Tengo curiosidad sobre por qué su enlace no tiene éxito, ¿cuál es su sistema operativo, la versión de Java, etc.?


Las direcciones IP pares no pueden ser falsificadas de esta manera, no tiene nada que temer de usar la técnica de inspeccionar el par y decidir abandonar la conexión durante el establecimiento.

Sin embargo, el enlace a 127.0.0.1 debería funcionar y provocar que el sistema operativo le diga al host de conexión que no escucha nada si se conectan a uno de los sistemas con otras direcciones IP. ¿Puedes enmendar esta pregunta con un ejemplo compilable? Tal vez has cometido un error simple.


Si la dirección del par es falsa, entonces no hay nada más que puedas hacer.

Sin embargo, para spoof 127.0.0.1 no es fácil. Tendría que tener una pila TCP / IP lo suficientemente tonta como para aceptar dicho paquete. No habría forma de que el spoofer reciba paquetes de vuelta. En una buena pila TCP / IP, no debería ser capaz de adivinar los números de secuencia para que no pueda seguir el ritmo de la conversación esperada.


Podría, como ya parece estar haciendo, aceptar () la conexión de todos modos, luego use getInetAddress () para asegurarse de que la dirección sea una dirección autorizada. Si no, simplemente cierre () el socket inmediatamente. 127.0.0.1 no es una dirección que pueda ser falsificada.

Alternativamente, puede instalar su propio administrador de seguridad que tendrá su método checkAccept () llamado con la dirección y el puerto del sitio remoto. Es un poco más difícil. Nunca lo intenté porque la primera solución siempre fue adecuada para mí.


if (socket.getInetAddress().isLoopbackAddress()){ //Your code goes here }