MULTI: dirección de origen incorrecta del cliente: ¿alguna solución única?

10

Configuración: Tengo una configuración de cliente / servidor openvpn (archivos de configuración en la parte inferior), y recibo el MULTI: bad source address from client [192.168.x.x], packet droppedmensaje infame en el servidor. El servidor tiene una dirección IP pública, mientras que el cliente está detrás de NAT.

Deficiencias de las soluciones propuestas anteriormente: La client-config-dirdefinida en la configuración del servidor está actualmente vacía. Las publicaciones anteriores (aquí y en los foros de soporte de openvpn) sugieren agregar un archivo DEFAULTcon las reglas adecuadas client-config-diro agregar un archivo por usuario con esas reglas para resolver el problema.

Sin embargo, esto no parece ser una solución a largo plazo, porque estas reglas son específicas de la ubicación del cliente. Entonces, puedo agregar una regla para permitir que los clientes se 192.168.x.0conecten. Pero si se conectan desde otra red que en su lugar utiliza 192.168.y.0para NAT, se requerirá una nueva regla.

Preguntas:

  • ¿Se pueden escribir las reglas requeridas de forma genérica / única?
  • ¿Alguien puede explicar por qué este problema ocurre en primer lugar?

Configuración del servidor:

port 1234
proto tcp
dev tun

ca ca.crt
cert openvpn.crt
key openvpn.key
dh dh2048.pem

server 10.78.96.0 255.255.255.0
keepalive 10 120
comp-lzo
cipher CAMELLIA-128-CBC

user nobody
group nogroup  
persist-key
persist-tun
client-cert-not-required
plugin /usr/lib/openvpn/openvpn-auth-pam.so login

status openvpn-status.log

push "redirect-gateway def1"
push "remote-gateway 1.2.3.4"
push "dhcp-option DNS 8.8.8.8"

client-config-dir ccd
verb 4

Configuración del cliente:

ca ca.crt
client
dev tun
proto tcp
remote 1.2.3.4 1234

auth-user-pass
script-security 2
keepalive 5 60
topology subnet
resolv-retry infinite
nobind
persist-key
persist-tun
ns-cert-type server
cipher CAMELLIA-128-CBC
comp-lzo
verb 4
m000
fuente
¿Están todos sus clientes en redes 192.168.xy?
IceMage
No está claro para mí ... ¿Quiere decir que desea enrutar de una manera diferente un cliente que está conectado 192.168.x.0y un cliente que está 192.168.y.0conectado a la red? Todos están en la misma 192.168.x.x/16red que ha definido ... (?)
krisFR

Respuestas:

12

Usted preguntó: " ¿Alguien puede explicar por qué este problema ocurre en primer lugar? "

Según lo informado en las preguntas frecuentes oficiales de OpenVPN , apuesto a que es causado por un problema de enrutamiento dentro del motor de OpenVPN.

Para aclarar mejor el escenario, permítanme referirme al siguiente diagrama:

Aquí puedes ver:

  • un "servidor" OpenVPN conectado a la red interna de la SEDE (10.0.1.0/24)
  • un "cliente" OpenVPN que se ejecuta en un sitio remoto y se conecta a la red remota 192.168.1.0/24

también

  • estamos asumiendo que el túnel OpenVPN está establecido y:
    • Se puede acceder al "servidor" de OpenVPN a través de su propia interfaz tun , con la dirección 10.10.0.1. También la dirección P2P, utilizada por la interfaz tun es 10.10.0.2 ( esto es importante para una discusión posterior, así que enfaticemos )
    • El "cliente" OpenVPN tiene una interfaz tun con IP 10.10.0.2

Ahora, supongamos que:

  • el "Cliente" de OpenVPN ha redefinido su puerta de enlace predeterminada, para redirigir dentro del túnel todo el tráfico IP saliente;
  • OpenVPN "Client" tiene habilitado IP_FORWARDING y, como tal, puede enrutar paquetes provenientes de su LAN interna (192.168.1.0/24) ( estoy enfatizando este punto, ya que es crítico para nuestra discusión ).

Con tal escenario en su lugar, verifiquemos en detalle qué sucede cuando R_PC1 (192.168.1.2) envía un paquete, como una solicitud de eco, a L_PC1 (10.0.1.2):

  1. después de abandonar la NIC R_PC1, el paquete llega al cliente OpenVPN;
  2. Cliente OpenVPN (que está configurado para actuar como un enrutador común), enrute de acuerdo con su tabla de enrutamiento. Como su puerta de enlace predeterminada es el túnel, envía el paquete al túnel;
  3. El paquete llega a la interfaz tun del servidor OpenVPN. OpenVPN lo "verá" y, como (servidor OpenVPN) sabe que 10.0.1.2 es una dirección que pertenece a su subred LAN, "reenvía" el paquete, de TUN a LAN;
  4. El paquete alcanza L_PC1.

Entonces todo está bien ...

Ahora verifiquemos qué sucede con la respuesta de eco que L_PC1 responde a R_PC1.

  1. echo-reply deja la NIC L_PC1 y alcanza la interfaz LAN del servidor OpenVPN (10.0.1.1);

Ahora, si queremos que OpenVPN Server pueda llegar al sitio remoto, debemos definir el enrutamiento con una "ruta estática". Algo como:

route add -net 192.168.1.0 netmask 255.255.255.0 gw 10.10.0.2

Tenga en cuenta la dirección P2P utilizada como puerta de enlace .

Dichas rutas estáticas operarán a nivel del sistema operativo. En otras palabras, es necesario que el sistema operativo enrute correctamente el paquete. Significa algo como: "Por favor, todo el tráfico dirigido a la subred 192.168.1.0/24 debe reenviarse al motor OpenVPN, con el que el sistema operativo puede comunicarse a través de la dirección P2P". Gracias a esa ruta estática, ahora ...

  1. el paquete abandona el contexto de enrutamiento del sistema operativo y llega a OpenVPN. La instancia de OpenVPN que se ejecuta en el servidor OpenVPN. Entonces, en este punto, el sistema operativo no tiene nada más que hacer y toda la ruta (dentro de la VPN) se deja al software del servidor OpenVPN.

Entonces, ahora, el problema es: ¿cómo, el software del servidor openvpn, podrá decidir la ruta de un paquete, con SRC_IP 10.0.1.2 y DST_IP 192.168.1.2 ?

Tenga en cuenta que, según la configuración del servidor OpenVPN, no sabe nada acerca de la red 192.168.1.0/24 ni del host 192.168.1.2. Es no un cliente conectado. Es no un cliente local. ¿Y entonces? OpenVPN, también, sabe que es no el "OS-Router", por lo que en realidad no quiere (y puede ....) enviar el paquete de regreso a la puerta de enlace local. Entonces, la única opción, aquí, es generar un error. Exactamente el error que estás experimentando

Para decirlo con el lenguaje de las preguntas frecuentes: " ... no sabe cómo enrutar el paquete a esta máquina, por lo que deja caer el paquete ... ".

Cómo podemos resolver el problema?

Como puede ver en la documentación oficial , la opción iroute sirve exactamente para nuestro alcance:

--iroute network [netmask]
Generate an internal route to a specific client. The netmask 
parameter, if omitted, defaults to 255.255.255.255.
This directive can be used to route a fixed subnet from the server 
to a particular client, regardless of where the client is 
connecting from. Remember that you must also add the route to the 
system routing table as well (such as by using the --route 
directive). The reason why two routes are needed is that the 
--route directive routes the packet from the kernel to OpenVPN. 
Once in OpenVPN, the --iroute directive routes to the specific 
client.

Entonces necesitas un:

--iroute 192.168.1.0 255.255.255.0

se aplicará (al servidor) cuando su cliente OpenVPN se conecte, por ejemplo, a través de un archivo de configuración ad-hoc definido en el servidor (client-config-dir, etc.).

Si se pregunta por qué este problema no ocurre en el paso 2) anterior, entiendo que OpenVPN Client sabe cómo enrutarlo, porque sabe que el túnel VPN es una puerta de enlace predeterminada.

No se puede hacer lo mismo en OpenVPN Server, porque allí la puerta de enlace predeterminada normalmente no se anula. Además, considere que podría tener un único servidor OpenVPN con un montón de clientes OpenVPN: cada cliente sabe cómo llegar al servidor pero ... ¿cómo puede, el servidor, decidir cuál es el cliente que actúa como puerta de enlace para una subred desconocida?


En cuanto a su primera pregunta ( ¿Pueden escribirse las reglas requeridas de forma genérica / única? ), Lo siento, pero no entiendo su problema. ¿Puedes reformular proporcionando más detalles?


Damiano Verzulli
fuente
Respondiendo a su última pregunta: no quiero editar la configuración de iroute cada vez que el cliente OpenVPN se conecta desde otro Wi-Fi público solo porque tiene una dirección de red local diferente.
jollyroger
1
@jollyroger: en el escenario típico de "guerreros del camino" (una sola PC que actúa como un cliente vpn hacia un servidor openpn) ¡NO necesita ninguna directiva "iroute"! Entonces, si te conectas a través de wifi público, estoy seguro de que no lo necesitas. Solo lo necesitará en configuraciones típicas de LAN a LAN, donde detrás del cliente OpenVPN tiene una red completa a la que puede acceder el servidor OpenVPN. Estoy seguro de que este NO es el caso cuando te conectas ... "desde otro Wi-Fi público". Si mis suposiciones son incorrectas, brinde detalles sobre su configuración de red típica (especialmente cuando se conecta a través de wifi público)
Damiano Verzulli
Esto está relacionado principalmente con el uso de SIP sobre OpenVPN. Suponga que tiene 192.168.0.111/24 en su wlan0 y 10.10.10.5/30 en su tun0 conectado a OpenVPN. Suponga que el servidor OpenVPN tiene una red adicional 10.11.10.2/24 con Asterisk en 10.11.10.1 y todas las rutas necesarias se envían al cliente (el ping tiene éxito en ambas direcciones). El problema es que SIP puede decidir enrutar paquetes con la IP de origen de su wlan0 a la interfaz tun0 en lugar de usar la IP de origen de tun0 y esto es cuando obtiene el problema: asterisk pensará que tiene NAT aunque no lo esté.
jollyroger
@jollyroger: si estoy en lo cierto, es perfectamente posible tener clientes SIP detrás de las cajas NAT, por lo que debería ser posible, dentro de su cliente OpenVPN, el tráfico VPN saliente NAT (dejando la interfaz tun0). ¿Hay algunas razones específicas por las cuales esta no es una opción para usted?
Damiano Verzulli
Funciona. pero no es confiable (lea mi comentario anterior) debido a la naturaleza de los clientes SIP y con errores y este último no ha cambiado en años. Claro, puedo habilitar la fuerza de proxy de todo el tráfico a través de mi servidor Asterisk, pero esto limita a los clientes a usar solo códecs compatibles con el servidor a pesar de tener la posibilidad de enrutar paquetes RTP directamente con solo negociación de códec de cliente a cliente.
jollyroger
1

Tuve un problema que parece similar, pero no estoy seguro si es el mismo que tu problema. Intenté hacer ping desde un cliente openvpn a una computadora en la red local del servidor openvpn (enrutada en la configuración del servidor), no obtuve respuesta y pude ver el mensaje de "dirección de origen incorrecta" en el registro openvpn del servidor.

Para resolverlo, tuve que hacer 2 cosas:

  1. Habilite el reenvío de IP en el servidor.
  2. Agregue una ruta para la subred vpn en la puerta de enlace del servidor, porque la puerta de enlace para la red local del servidor en mi caso no es el servidor en sí, sino un enrutador. La computadora pinchada intentaba responder a través de la puerta de enlace, que no tenía idea de qué hacer para la subred vpn. Así que agregué una ruta estática en el enrutador usando la subred vpn para el destino y la ip del servidor openvpn como la puerta de enlace.

Eso me lo arregló.

aditsu
fuente