14 votos

MULTI: dirección de origen incorrecta del cliente - ¿alguna solución puntual?

Configuración: Tengo el un openvpn cliente / servidor de configuración (archivos de configuración en la parte inferior), y me sale el infame MULTI: bad source address from client [192.168.x.x], packet dropped mensaje 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: En client-config-dir definido en la configuración del servidor está actualmente vacío. Mensajes anteriores (aquí y en los foros de soporte de openvpn) sugieren añadir un archivo llamado DEFAULT con las normas adecuadas en client-config-dir o añadiendo 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 para cada cliente. Así, puedo añadir una regla para permitir clientes de 192.168.x.0 para conectar. Pero si se conectan desde otra red que en su lugar utiliza 192.168.y.0 para NAT, será necesaria una nueva norma.

Preguntas:

  • ¿Pueden redactarse las normas necesarias de forma genérica/única?
  • ¿Puede alguien explicar por qué se produce este problema 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

19voto

Damiano Verzulli Puntos 744

Usted preguntó: " ¿Puede alguien explicar por qué se produce este problema en primer lugar? "

Basándose en lo informado en las FAQ oficiales de OpenVPN Apuesto a que está causado por un problema de enrutamiento dentro del motor 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 ejecutándose en un Sitio Remoto, y conectado a la red remota 192.168.1.0/24

También

  • estamos asumiendo que el túnel OpenVPN está establecido y:
    • El "servidor" OpenVPN es accesible a través de su propio tun con 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 la discusión posterior, así que vamos a enfatizarlo )
    • El "cliente" OpenVPN tiene un tun interfaz con IP 10.10.0.2

Ahora, vamos a suponer que:

  • el "Cliente" OpenVPN ha redefinido su puerta de enlace por defecto, para redirigir dentro del túnel todo el tráfico IP saliente;
  • el "Cliente" OpenVPN tiene activado IP_FORWARDING y, como tal, puede enrutar paquetes procedentes de su LAN interna (192.168.1.0/24) ( Hago hincapié en este punto, ya que es fundamental para nuestra discusión ).

Con este escenario en marcha, comprobemos en detalle qué ocurre cuando R_PC1 (192.168.1.2) envía un paquete, como una eco-solicitud, a L_PC1 (10.0.1.2):

  1. después de salir de R_PC1 NIC, el paquete llega al cliente OpenVPN;
  2. cliente OpenVPN (que está configurado para actuar como un enrutador común), enrutarlo según su tabla de enrutamiento. Como su puerta de enlace por defecto 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 (el servidor OpenVPN) sabe que 10.0.1.2 es una dirección perteneciente a su subred LAN, "reenviará" el paquete, de TUN a LAN;
  4. Paquete alcanzado L_PC1.

Así que todo está bien...

Ahora comprobemos qué ocurre con la eco-respuesta que L_PC1 responde a R_PC1.

  1. La eco-respuesta sale del NIC L_PC1 y llega a la interfaz LAN del servidor OpenVPN (10.0.1.1);

Ahora, si queremos que el servidor OpenVPN pueda alcanzar el sitio remoto, necesitamos 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 pasarela .

Estas rutas estáticas funcionarán a nivel de sistema operativo. En otras palabras, son necesarias para que el sistema operativo enrute correctamente el paquete. Significa algo así como: "Por favor, todo el tráfico dirigido a la subred 192.168.1.0/24 necesita ser reenviado al motor OpenVPN, con el que el SO puede hablar a través de la dirección P2P". Gracias a tal 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. Por lo tanto, en este punto, el sistema operativo no tiene nada más que hacer y todo el enrutamiento (dentro de la VPN) se deja al software del servidor OpenVPN.

Así que, ahora, el problema es: como, el software 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, en función de la configuración del servidor OpenVPN, sabe nada sobre la red 192.168.1.0/24, ni sobre el 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 realmente no quiere (y puede....) enviar el paquete de vuelta a la pasarela local. Así que la única opción, aquí, es lanzar un error. Exactamente el error que estás experimentando

Para decirlo con el lenguaje de las FAQ: " ...no sabe cómo encaminar el paquete a esta máquina, así que lo desecha... ".

¿Cómo podemos resolver el problema?

Como puede ver en la documentación oficial la opción iroute sirve exactamente a nuestro ámbito:

--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.

Así que necesitas una:

--iroute 192.168.1.0 255.255.255.0

a 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 suceder en el paso 2) anterior, entiendo que OpenVPN Client conoce cómo enrutarlo, porque sabe que el túnel VPN es una pasarela por defecto.

Lo mismo no se puede hacer en OpenVPN Server, porque allí la puerta de enlace predeterminada es típicamente no anulado. 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 redactarse las normas necesarias de forma genérica/única? ), lo siento pero no entiendo muy bien tu problema. ¿Podría explicarlo con más detalle?


1voto

aditsu Puntos 186

Tuve un problema que parece similar, pero no estoy seguro de si es el mismo que tu problema. Estaba intentando hacer ping desde un cliente openvpn a un ordenador de la red local del servidor openvpn (enrutado en la configuración del servidor), no obtenía respuesta y podía ver el mensaje "bad source address" en el log openvpn del servidor.

Para solucionarlo, tuve que hacer 2 cosas:

  1. Activar el reenvío ip en el servidor.
  2. Añadir 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 propio servidor, sino un router. El ordenador al que se le hizo el ping intentaba responder a través de la puerta de enlace, que no tenía ni idea de qué hacer para la subred vpn. Así que añadí una ruta estática en el router utilizando la subred vpn para el destino, y la ip del servidor openvpn como la puerta de enlace para ello.

Eso lo arregló para mí.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X