Quiero conectar varias LAN ubicadas en edificios remotos.
El sitio "central" tiene una computadora Linux con OpenVPN. Cada sitio remoto también ejecuta OpenVPN.
- el sitio central tiene una LAN numerada 192.168.0.0/24
- varios sitios remotos también están numerados 192.168.0.0/24
- No puedo / no quiero / no quiero / lo que sea modificar la numeración LAN
- No tengo control sobre la mayoría de los OpenVPN remotos
Luego necesito:
1. definir LAN virtuales
2. configurar un NAT 1: 1 para cada sitio
3. el NAT 1: 1 debe configurarse en el enrutador central
.
Por lo tanto, se considera que cada sitio tiene una LAN 10.10.x.0 / 24.
Cuando una computadora quiere alcanzar, digamos, 192.168.0.44 en el sitio 12, solo tiene que enviar un paquete a 10.10.12.44
Operar una VPN no es un problema para mí. Actualmente conecto más de 60 sitios. Pero no encuentro una manera simple de hacer esto NAT 1: 1.
Aquí hay un ejemplo de un paquete enviado desde el sitio central a un sitio remoto, y su paquete de respuesta:
Hice algunas pruebas con iptables NETMAP pero no puedo hacer que funcione porque no encuentro una manera de modificar el origen + destino después de la decisión de enrutamiento.
Prefiero evitar la nueva --client-nat
función de OpenVPN.
Tal vez tengo que forzar el enrutamiento con ip route
? ¿O para pasar dos veces en la pila de red con veth
?
Nota: no quiero usar disfraces. Solo 1/1 NAT.
EDITAR:
No es posible con una configuración regular de openVPN. Debido a que un paquete de un sitio remoto es indistinguible de un paquete de otro sitio: ambos tienen direcciones de origen y destino similares, y ambos provienen de la misma interfaz tun (o tap). Por lo tanto, no es posible fuente-NAT.
Solución 1: haga el NAT en los sitios remotos. No es posible en mi caso. Tengo que hacerlo solo en el sitio central.
Solución 2: configure una VPN para cada sitio remoto. Así que tendré un tun para cada uno. Creo que esto puede estar bien. No es muy eficiente en memoria pero está bien.
Solución 3: configure un túnel (sin cifrar) dentro de la VPN para cada sitio. Esto le dará una interfaz para cada uno. Los túneles simples no son multiplataforma (para mi conocimiento). Por ejemplo, GRE o ipip o sit están bien para Linux, pero algunos sitios distantes solo ejecutan una computadora con Windows, por lo que openVPN está instalado en ella. Tan imposible de configurar un túnel simple. Otra opción es usar un túnel más complicado (¿cuál?) Pero la sobrecarga en el sistema y en el administrador del sistema puede ser mayor que tener múltiples VPN
Solución 4: compile la última versión de openVPN, ya que incluye una función NAT 1: 1. Pruebo esto esta semana.
Respuestas:
Una solución muy básica es:
1. usar OpenVPN 2.3 o más (actualmente, el último es 2.3-alpha) para servidores + clientes
2. usar la opción de configuración de OpenVPN a continuación
3. no usar nada más (sin ipfilter, sin trucos)
En el lado del servidor, debe distribuir manualmente las direcciones VPN (por lo que no hay
server
opción, debe usarifconfig
oifconfig-push
):El
route
epush route
yclient-nat
se requieren líneas si desea comunicarse directamente entre enrutadores (ping 10.99.99.1
desde un sitio distante A TRAVÉS la VPN). De lo contrario, puedes descartarlos..
.
Ahora tiene que elegir una dirección de red virtual. Mantuve lo mismo que usaste en tu ejemplo: 10.10.0.0/16 Permites el
enrutamiento para esto:
.
.
Ahora debe indicar al cliente que use el NAT 1: 1:
La primera línea establece la dirección del enrutador remoto. Tenga cuidado con el controlador de Windows que requiere direcciones especiales.
La segunda y última línea permiten que el enrutador distante se comunique desde su interfaz 10.99.99.x.
La tercera y cuarta líneas hacen el origen y el destino 1: 1 NAT
La quinta línea le dice a OpenVPN qué hacer con los paquetes correspondientes.
Este método permite conectar sitios con direcciones LAN idénticas (o no), sin ningún host sombreado.
fuente
He hecho algo similar con las interfaces reales, pero no puedo ver por qué no funcionaría con las interfaces VPN.
La idea es que, como tiene la misma subred disponible en diferentes interfaces en ese enrutador, complica el enrutamiento. Básicamente, cuando un paquete para 10.10.13.123 ingresa al enrutador, se DNAT antes de enrutar a 192.168.0.123, por lo que debe poder indicar el enrutamiento que estaba destinado a 192.168.0.123 en la interfaz VPN13 .
Eso se puede hacer usando marcas de firewall y reglas de enrutamiento que usan esas marcas. SNAT y DNAT se deben hacer con el objetivo del firewall NETMAP. Para SNAT, es el mismo problema, en POSTROUTING, ha perdido la información de que el paquete proviene de esta o aquella interfaz y todos tienen la dirección de origen 192.168.0.x. Por lo tanto, también necesita una marca para llevar esa información desde mangle-PREROUTING a nat-POSTROUTING. Puede usar la misma marca, pero eso significaría que esos paquetes usarían esa tabla de enrutamiento alternativa, por lo que necesitaría duplicar la tabla de enrutamiento global en todos.
Para cada red, harías:
Arriba, estamos usando los primeros 4 bits de la marca , para permitir que se enruten hasta 7 redes de esa manera.
fuente