
He configurado una red OpenVPN y está funcionando correctamente en el sentido de que puedo acceder a las máquinas internas/LAN desde el cliente remoto. Sin embargo, mi problema es que todo el tráfico de las máquinas remotas aparece en las máquinas LAN como si viniera de la máquina servidor OpenVPN y no de la máquina cliente.
Para explicar mejor, considere mi topología de red:
La máquina R se conectó al servidor OpenVPN en la máquina A y se le asignó la dirección IP 10.200.200.5.
Luego, la máquina R realiza una solicitud a Apache que se ejecuta en la máquina B. La solicitud llega correctamente y obtengo una respuesta. El problema es que la máquina B ve la solicitud procedente de 192.168.0.10 (IP de la máquina A) y no de 10.200.200.5.
Me gustaría esto último.
Mi configuración actual
Máquina A
Este es un fragmento de las reglas relevantes de iptables:
*nat
:PREROUTING ACCEPT [18:1080]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o eth0 -j MASQUERADE
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
// snip
# accept incoming VPN connections
-A INPUT -p udp -m udp --dport 1194 -j ACCEPT
# forward VPN traffic
-A FORWARD -s 10.200.200.0/25 -d 192.168.128.0/17 -i tun0 -j ACCEPT
-A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
También he habilitado ip_forwarding:
echo 1 > /proc/sys/net/ipv4/ip_forward
.. e hice los cambios apropiados en /etc/sysctl.conf para hacerlo permanente.
En la configuración de OpenVPN, tengo:
server 10.200.200.0 255.255.255.128
push "route 192.168.0.0 255.255.255.0"
Máquina B
Dado que la Máquina A no es la puerta de enlace de la Máquina B, agregué manualmente una ruta en la Máquina B de la siguiente manera:
ip route add 10.200.200.0/25 via 192.168.0.10 dev eth0
Para probar qué IP se está enrutando, creé un pequeño script PHP llamadoshowip.php:
<?php echo "Your IP is: ", $_SERVER['REMOTE_ADDR'], "\n"; ?>
Máquina R
# wget -q -O - http://192.168.0.11/showip.php
Your IP is: 192.168.0.10
¿Cómo consigo que diga 10.200.200.5?
Actualizar
Para aclarar, en mi caso particular, la Máquina A tiene una NIC (eth0) que sirve tanto para LAN como para WAN.
Respuesta1
Respondiendo a mi propia pregunta:
Como antecedente adicional, estas máquinas están alojadas en Linode. Resulta que utilizan mapas estáticos en sus conmutadores para enrutar el tráfico a nodos específicos de la LAN. Dado que las IP de origen de la VPN no forman parte de esos mapas estáticos, el tráfico no se dirigió a ninguna parte.
Así que esto resulta ser un problema específico de Linode, pero espero que pueda ayudar a otros a saberlo.
Respuesta2
Dado que descubrió que la conexión entre la Máquina A y la Máquina B no es realmente una Ethernet conmutada y que solo puede manejar el tráfico utilizando las direcciones IP que se le han asignado, necesita encontrar otra solución.
Esto se puede lograr mediante el uso de un túnel. Hay varios tipos de túneles que podrían utilizarse. Una es usar VPN, que podría ser la más sencilla ya que la máquina A ya es un servidor VPN. Luego solo necesita convertir la Máquina B en un cliente VPN y luego agregar entradas a la tabla de enrutamiento para reenviar los prefijos necesarios a través de esa conexión VPN.
Otra opción es utilizar un túnel GRE o simplemente IP sobre IP. Esos túneles y rutas asociadas podrían configurarse estáticamente, lo que les daría una ventaja sobre el enfoque VPN.
Respuesta3
En la Máquina A tiene una regla NAT, lo que hace que cambie la IP del cliente antes de enrutar los paquetes a la Máquina B. Lo primero que debe hacer es eliminar esa regla NAT, de modo que los paquetes se reenvíen a la Máquina B sin modificaciones.
Este cambio puede hacer que las conexiones dejen de funcionar si la tabla de enrutamiento en la Máquina B está incompleta. Lo que sucede en este caso es que los paquetes se entregan correctamente a la Máquina B, pero esta no tiene una ruta para devolver las respuestas. Eso hará que no responda en absoluto o que envíe las respuestas a Internet en lugar de al servidor VPN.
En la Máquina B puedes intentar agregar una ruta con el siguiente comandoip route add 10.200.200.0/24 via 192.168.0.10