Usted "pasa" un cheque localhost enviando la solicitud a localhost (o 127. * o :: 1). Por ejemplo, puede hacer que un navegador web haga esto navegando a enlace o enlace . El fragmento de código de C # que publicó para el servidor está verificando la dirección IP local, por lo que para un servidor que es la dirección IP en la que el servidor recibió la solicitud de conexión, y desde la perspectiva de un cliente, es la dirección IP a la que el cliente intenta conectarse ( el destino).
Si intenta enviar una solicitud de este tipo desde una máquina distinta a la que está intentando conectar, enrutará la solicitud a su propia máquina, que no es lo que desea (pero es el punto del bucle de retorno). dirección). Si intenta crear paquetes de Ethernet sin procesar que simplemente contienen tráfico TCP / IP y configura el destino de IP a 127.0.0.1 pero intenta transmitir el paquete a otra máquina (a través de la dirección MAC), sucederá una de estas cosas:
- Recibirá un error de su pila de red, porque se reconoció que el paquete era tráfico IP y se está transmitiendo mal. Sin embargo, la mayoría de los controladores de red probablemente no lo harán, y si lo hacen, puede (en teoría) editar ese comportamiento.
- Su paquete saldrá a la red, pero será rechazado por el primer nodo al que llega (probablemente un conmutador o enrutador, a menos que tenga una conexión directa con la otra máquina) porque, de nuevo, no es válido; Está vinculado a la red de bucle invertido pero proviene de una red externa. Este podría ser lo que estás viendo en Wireshark.
- Su enrutador o conmutador aceptará su paquete, pero se pasará a la red de bucle invertido de ese enrutador / conmutador (después de todo, esa es la dirección IP de destino) en lugar de pasarlo a cualquier otro host (no se sabe dónde estará). enviar el paquete). Esto sería un error de seguridad en el dispositivo y vale la pena informar al fabricante si se encuentra.
- Su paquete irá a la computadora de destino (si está conectada directamente, o posiblemente si se transmite a través de un concentrador de red), y la pila de red lo aceptará inicialmente como un paquete TCP
SYN
. Sin embargo, cuando el servidor intenta responder con SYN/ACK
, fallará porque está intentando enviar un paquete no válido (que se origina con localhost pero está destinado a un host externo). Este es probablemente un error de seguridad en el controlador de red / pila de IP , porque los paquetes UDP no requieren un saludo de ese tipo. Vale mucho la pena informar.
- Su paquete llega al host de destino y se acepta (como arriba), y obtiene un TCP
SYN/ACK
del servidor, invitándole a completar el protocolo de enlace con un ACK
final y comenzar a transmitir datos. Probablemente necesitarías un escucha de socket sin formato para esto, porque la pila de red del sistema operativo no va a reconocer el paquete entrante como parte de un protocolo de enlace TCP en el que estaba trabajando (aunque, teóricamente, puedes parchearlo para hacerlo). Esto indica un error de seguridad grave en la pila de red del servidor .
Tenga en cuenta que en ninguno de estos casos, excepto en el último, hay alguna posibilidad de que el servidor web de C # vea la solicitud. HTTP se transmite a través de TCP, y los servidores TCP ni siquiera son notificados de que alguien se está conectando A ellos hasta que se complete el apretón de manos. Por lo tanto, a menos que tenga un error grave realmente en su pila de red y esté conectado de forma bastante directa, esto nunca sucederá.
Ahora, si desea saber cómo llegar a un servidor que solo escucha en loopback desde fuera de la máquina, la solución es encontrar algún programa en el mismo host que el servidor de destino que hace escuche el tráfico externo y retransmitirá las solicitudes a destinos específicos (un proxy), o puede usarse para crear nuevas solicitudes web (esto es un Server-Side Request Forgery (SSRF) , y una forma común de crearlos es a través de un XML eXternal Entidad (XXE) ataque).