¿Resolver nombres en el lado del servidor OpenVPN?

0

Instalé OpenVPN en mi servidor a través de este script de instalación automática y copié el archivo de configuración generado en mi cliente, también ejecuté OpenVPN. Quiero enrutar todo el tráfico del cliente a través de la VPN, y quiero que los nombres se resuelvan en el lado del servidor. Todo el tráfico parece enrutarse con éxito, pero los nombres se resuelven por el servidor DNS que especifique en el cliente resolv.conf . ¿Cómo puedo hacerlo para que se resuelvan del lado del servidor? Configuración relevante del lado del servidor:

root@marius:~# cat /etc/openvpn/server.conf | grep dhcp
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

No estoy familiarizado con los servidores VPN, no estoy seguro de si ese "empuje" es necesario, ya que no uso el lado del cliente DHCP. Lado del cliente resolv.conf(establecido manualmente, nunca cambia):

domain domain.name
search domain.name
# Local cache (dnsmasq)
nameserver 127.0.0.1
# VPN (doesn't work)
#nameserver 10.8.0.1
# ISP (doesn't work with VPN)
#nameserver 200.175.89.139
#nameserver 200.175.5.139
# Google (works with VPN)
nameserver 8.8.8.8
nameserver 8.8.4.4

Según el CÓMO oficial de OpenVPN :

Cuando se utiliza redirect-gateway, los clientes de OpenVPN enrutarán las consultas DNS a través de la VPN, y el servidor VPN deberá manejarlas. Esto se puede lograr presionando una dirección de servidor DNS para conectar clientes que reemplazarán la configuración normal de su servidor DNS durante el tiempo que la VPN esté activa. Por ejemplo:

push "dhcp-option DNS 10.8.0.1"

configurará clientes de Windows (o clientes que no sean de Windows con algunas secuencias de comandos adicionales del lado del servidor) para usar 10.8.0.1 como su servidor DNS. Cualquier dirección que sea accesible desde los clientes puede usarse como la dirección del servidor DNS.

Pero eso no parece funcionar, como se mencionó anteriormente. Supongo que debo configurar mi servidor (VPN) para que también sea un servidor DNS para que eso funcione. ¿Pero es eso necesario? ¿Por qué el servidor VPN no puede manejar consultas DNS reenviadas a través de él resolv.conf(sin ser un servidor DNS, al igual que maneja todo lo demás sin ser un servidor todo lo demás)? Estoy un poco perdido aquí.

Puedo proporcionar cualquier archivo de configuración adicional si es necesario.

Alex
fuente

Respuestas:

1

No estoy seguro si ese "empuje" es necesario, ya que no uso el lado del cliente DHCP.

OpenVPN ya recibe su dirección IP y otra configuración del servidor, por lo que entiende ciertas "opciones de DHCP" en sí, incluso si técnicamente no se envían a través de DHCP.

Supongo que debo configurar mi servidor (VPN) para que también sea un servidor DNS para que eso funcione. ¿Pero es eso necesario?

Sí lo es. (Específicamente, necesita un solucionador: Unbound, dnsmasq, Bind9 funcionará, pero NSD no lo hará, ya que solo tiene autoridad).

¿Por qué el servidor VPN no puede manejar consultas DNS reenviadas a través de su resolv.conf (sin ser un servidor DNS, al igual que maneja todo lo demás sin ser un servidor todo lo demás)?

Eso ni siquiera es lo mismo: el servidor VPN no maneja "todo lo demás", simplemente reenvía los paquetes IP.

Por ejemplo, si un cliente se conecta a Google, o lo usa 8.8.8.8como su servidor DNS, el servidor VPN solo ve que es un paquete IPv4 para la dirección IP de otra persona. Por lo tanto, el servidor VPN no intenta comprender el contenido del paquete, solo lo envía hacia el siguiente enrutador, y así sucesivamente, hasta que el paquete finalmente llegue al destino real.

Pero si desea que el servidor VPN lo respete resolv.conf, debe comprender cómo está relacionado con los paquetes que recibe y qué respuestas se deben generar, y necesita dos cosas para eso:

  • Para empezar, sus clientes deben usar la propia dirección del servidor VPN como su "servidor DNS", para que el servidor se vea a sí mismo como el destino final de los paquetes y realmente interprete sus contenidos (como UDP) en lugar de reenviarlos a otro lugar.

    (Eso significa que "resolv.conf del lado del cliente (configurado manualmente, nunca cambia)" es un problema. Si tiene pushla opción dns-server, el cliente OpenVPN lo entenderá y debería intentar actualizar el cliente resolv.conf, pero eso depende de sistema.)

  • Ahora el servidor VPN está recibiendo paquetes al puerto UDP 53, pero aún no comprende automáticamente qué datos contienen. Al igual que necesita un servidor web para comprender las solicitudes HTTP, también necesita un servidor DNS para comprender las solicitudes DNS y responderlas adecuadamente.


Técnicamente, puede sortear el primer requisito utilizando iptables en el servidor VPN para redirigir todos los paquetes UDP / 53 a sí mismo; creo que eso se llama "proxy transparente" o -j REDIRECTen varios tutoriales.

Pero sugiero que solo lo haga una vez que tenga una buena comprensión de la distinción entre su servidor que reenvía paquetes y los maneja. De lo contrario, solo se sumaría a la confusión.

Gravedad
fuente
Veo. No necesito usar el servidor resolv.conf, aunque lo mencioné en el OP. Dado que tengo control tanto del cliente como del servidor resolv.conf, cualquiera de los dos está bien, siempre que la consulta DNS salga del servidor DNS desde mi VPN . Es decir, estoy de acuerdo con que la VPN solo reenvíe las consultas. Ahora, como pregunta final, ¿por qué las consultas DNS requieren un tratamiento especial? Quiero decir, no se requiere interpretación de la VPN, ¿no deberían enviarse las consultas junto con todo lo demás cuando configuro la dirección de mi cliente resolv.confa algún servidor DNS (no la dirección de mi VPN)?
Alex
1
No ven su propia cita: "Cualquier dirección a la que se pueda acceder desde los clientes se puede usar como la dirección del servidor DNS". Es simplemente común usar el servidor VPN como caché local.
Grawity
1
Oh, ya veo ahora. Estaba confundiendo cosas. Pensé que los nombres se resuelven localmente porque fallaron con los servidores DNS de mi ISP, y cuando cambié el cliente resolv.conf a Google funcionó. De hecho, las consultas se enviaron a la VPN tal como se esperaba, pero mi ISP solo acepta consultas de sus clientes (que no es la VPN). Debería haberlo comprobado antes con Wireshark. Gracias, en realidad podría usar la VPN como caché local con dnsmasq, aunque parece funcionar bien si el caché está en el cliente (también con dnsmasq).
Alex
1

Debe usar un script de shell adecuado para interactuar con las opciones que le pasó OpenVPN (las dos push dhcp-options..., que están perfectamente bien) con el resolv.confarchivo a través del resolvconfpaquete, que debería haber instalado de manera predeterminada.

Tengo, en /etc/openvpnel cliente, un archivo (¡no es mi trabajo!) Llamado /etc/openvpn/update-resolv-conf, que se invoca en el archivo de configuración del cliente de la siguiente manera:

 script-security 2
 up /etc/openvpn/update-resolv-conf
 down /etc/openvpn/update-resolv-conf

Estoy seguro de que el script de shell está ampliamente disponible en línea, pero si no puede localizarlo, aquí está:

#!/bin/bash
# 
# Parses DHCP options from openvpn to update resolv.conf
# To use set as 'up' and 'down' script in your openvpn *.conf:
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
#
# Used snippets of resolvconf script by Thomas Hood and Chris Hanson.
# Licensed under the GNU GPL.  See /usr/share/common-licenses/GPL. 
# 
# Example envs set from openvpn:
#
#     foreign_option_1='dhcp-option DNS 193.43.27.132'
#     foreign_option_2='dhcp-option DNS 193.43.27.133'
#     foreign_option_3='dhcp-option DOMAIN be.bnc.ch'
#

[ -x /sbin/resolvconf ] || exit 0
[ "$script_type" ] || exit 0
[ "$dev" ] || exit 0

split_into_parts()
{
    part1="$1"
    part2="$2"
    part3="$3"
}

case "$script_type" in
   up)
        NMSRVRS=""
        SRCHS=""
        for optionvarname in ${!foreign_option_*} ; do
            option="${!optionvarname}"
            echo "$option"
            split_into_parts $option
            if [ "$part1" = "dhcp-option" ] ; then
                if [ "$part2" = "DNS" ] ; then
                    NMSRVRS="${NMSRVRS:+$NMSRVRS }$part3"
                elif [ "$part2" = "DOMAIN" ] ; then
                    SRCHS="${SRCHS:+$SRCHS }$part3"
                fi
            fi
        done
        R=""
        [ "$SRCHS" ] && R="search $SRCHS
"
        for NS in $NMSRVRS ; do
              R="${R}nameserver $NS
"
        done
        echo -n "$R" | /sbin/resolvconf -a "${dev}.openvpn"
  ;;
  down)
  /sbin/resolvconf -d "${dev}.openvpn"
  ;;
esac
MariusMatutiae
fuente