2008-09-19 9 views
8

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?¿Cómo puedo hacer que un socket acepte conexiones solo desde el localhost (en Java)?

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 a todos por su 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 la suplantación de identidad de la dirección de bucle invertido, 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.

+0

¿De dónde sacó la información de que 127.0.0.1 puede ser falsificado? Soy escéptico –

Respuesta

7

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 hacer que el sistema operativo le diga al host de conexión que no hay nada que escuche si se conectan en uno de los sistemas con otras direcciones IP. ¿Puedes enmendar esta pregunta con un ejemplo compilable? Tal vez has cometido un error simple.

1

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.?

3

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

Como alternativa, 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í.

+1

El póster original ya ha dicho que lo está haciendo, pero no quiere porque el lado remoto puede ser 'falso' o algo así. – Jerub

+1

Jerub: El OP no entiende la suplantación. Pax: Cualquier administrador de seguridad antiguo lo hará, solo tiene que establecer una política que otorgue al código los permisos correctos (permiso java.net.SocketPermission "127.0.0.1" "escuchar, aceptar", o algo así - necesita atrapar SecurityException de aceptar). –

3

Si la dirección del par es suplantada, entonces no hay nada más que pueda 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.

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

Aunque el código se expresa solo, se desaconsejan las respuestas de solo código. Considere agregar referencias de documentación, lo que hace, etc. – edmz

Cuestiones relacionadas