Para empezar, mis conocimientos en materia de redes son bastante limitados, por lo que pido disculpas de antemano si estoy utilizando la terminología incorrecta.
Situación
Estoy intentando crear un prototipo que permitirá a los clientes comunicarse con un servidor web local en una red diferente. El servidor web está alojado en la misma red que el servidor VPN. Hasta ahora, puedo enrutar el paquete del cliente (por ejemplo, SYN) a una interfaz virtual (tun) y enviar el paquete completo al servidor VPN. En el lado del servidor, recibo estos paquetes, cambio las IP de origen y destino y vuelvo a calcular las sumas de verificación dentro de los encabezados.
Para reiterar, el flujo es el siguiente:
- El usuario intenta acceder al servidor web con una determinada dirección IP.
- El paquete SYN se envía a la interfaz virtual porque coincide con las rutas en la tabla de enrutamiento.
- La aplicación Cliente VPN envía el paquete SYN al Servidor VPN a través de una conexión websocket establecida (no debería importar qué tipo de conexión sea)
- El servidor VPN recibe el paquete y modifica la dirección IP de origen/destino para que apunte al servidor web real alojado en la misma red.
- ¿Cómo envío estos paquetes al servidor web y recibo respuestas del servidor web? Quiero que el cliente se comunique con el servidor web a través del servidor VPN/conexión de socket web establecida. ¿Cuáles son algunas de las opciones que tengo?
Pregunta
¿Cómo puedo enviar estos paquetes al servidor web y recibir paquetes del servidor web para enviarlos al cliente? ¿"Inyecto" paquetes en la interfaz correcta y me aseguro de que mi aplicación envíe las respuestas al cliente? Quiero que el cliente se comunique con el servidor web a través del servidor VPN/conexión de socket web establecida. ¿Cuáles son algunas de las opciones que tengo y, en general, cómo hacen esto los servidores VPN actuales?
lo que he probado
Lo que intenté hacer en el lado del servidor es crear una interfaz virtual (tun) y escribir los paquetes recibidos del cliente en la interfaz. Sin embargo, estos paquetes no se envían al servidor web. El cliente y el servidor se ejecutan en macOS usando Extensiones de red, si eso es de alguna utilidad. El servidor web se está ejecutando 192.168.1.95
y modifiqué la IP de origen del paquete 100.64.0.77
antes de escribir en la tun
interfaz.
Routing tables
Internet:
Destination Gateway Flags Netif Expire
default 192.168.1.254 UGSc en0
default link#10 UCSI utun2
100.64.0.77 100.64.0.77 UH utun2
127 127.0.0.1 UCS lo0
127.0.0.1 127.0.0.1 UH lo0
169.254 link#7 UCS en0 !
192.168.1 link#7 UCS en0 !
192.168.1 link#10 UCSI utun2
192.168.1.92/32 link#7 UCS en0 !
192.168.1.99 8c:a9:82:2e:d6:2e UHLWI en0 986
192.168.1.254/32 link#7 UCS en0 !
192.168.1.254 70:f1:96:86:e6:a0 UHLWIir en0 1196
224.0.0/4 link#7 UmCS en0 !
224.0.0/4 link#10 UmCSI utun2
224.0.0.251 1:0:5e:0:0:fb UHmLWI en0
255.255.255.255/32 link#7 UCS en0 !
255.255.255.255/32 link#10 UCSI utun2
`
Respuesta1
El servidor VPN recibe el paquete y modifica la dirección IP de origen/destino para que apunte al servidor web real alojado en la misma red.
Esto nunca debería ser necesario, porque el cliente ya ha especificado la dirección IP de destino que desea. (VPNencapsularel paquete original dentro de otro paquete IP, sin alterar el encabezado IP original, por lo que el servidor sólo necesita desencapsularlo nuevamente y reenviar el paquete original exactamente como estaba).
NAT se puede hacer (y ocasionalmente se hace), pero más a menudo es trabajo del firewall del sistema operativo y decisión del administrador del sistema; no debería hacerlo el software VPN por sí solo. Y en general, las comunicaciones dentro de una red interna no debennecesidadNAT; Su uso suele ser una indicación de que el enrutamiento elemental de su red no está configurado correctamente.
¿Cómo envío estos paquetes al servidor web y recibo respuestas del servidor web? Quiero que el cliente se comunique con el servidor web a través del servidor VPN/conexión de socket web establecida. ¿Cuáles son algunas de las opciones que tengo?
Normalmente, el servidor VPN tendrá una interfaz virtual exactamente igual al cliente VPN y utilizará exactamente los mismos mecanismos para producir y recibir paquetes. (Algunos crearán interfaces virtuales dedicadas por cliente, otros tendrán una única interfaz para todos los clientes). Si su cliente está utilizando una tun
interfaz, su servidor puede hacer lo mismo.