Resolve nomes no lado do servidor OpenVPN?

0

Eu instalei o OpenVPN no meu servidor via este script de instalação automática e copiei o arquivo de configuração gerado para o meu cliente, também executando o OpenVPN. Eu quero rotear todo o tráfego do cliente através da VPN, e eu quero que os nomes sejam resolvidos no lado do servidor. Todo o tráfego parece ser roteado com sucesso, mas os nomes são resolvidos por qualquer servidor DNS especificado no cliente resolv.conf . Como posso fazer com que eles sejam resolvidos do lado do servidor? Configuração relevante do lado do 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"

Não estou familiarizado com servidores VPN, não tenho certeza se esse "push" é necessário, pois não uso o lado do cliente DHCP. resolv.conf do lado do cliente (definido manualmente, nunca muda):

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

De acordo com o HOWTO oficial da OpenVPN :

When redirect-gateway is used, OpenVPN clients will route DNS queries through the VPN, and the VPN server will need handle them. This can be accomplished by pushing a DNS server address to connecting clients which will replace their normal DNS server settings during the time that the VPN is active. For example:

push "dhcp-option DNS 10.8.0.1"

will configure Windows clients (or non-Windows clients with some extra server-side scripting) to use 10.8.0.1 as their DNS server. Any address which is reachable from clients may be used as the DNS server address.

Mas isso não parece funcionar, como mencionado anteriormente. Eu presumo que devo configurar meu servidor (VPN) para também ser um servidor DNS para que isso funcione. Mas isso é necessário? Por que o servidor VPN não pode manipular as consultas DNS encaminhadas por meio de seu resolv.conf (sem ser um servidor DNS, assim como ele lida com todo o resto sem ser um servidor todo restante)? Estou um pouco perdido aqui.

Eu posso fornecer qualquer arquivo de configuração adicional, se necessário.

    
por Alex 17.12.2015 / 09:33

2 respostas

1

I'm not sure if that "push" is necessary, as I don't use DHCP client-side.

O OpenVPN já recebe seu endereço IP e outras configurações do servidor, por isso entende certas "opções de DHCP", mesmo que não sejam enviadas tecnicamente via DHCP.

I presume I must set up my (VPN) server to also be a DNS server in order for that to work. But is that necessary?

Sim, é. (Especificamente, você precisa de um resolvedor - Unbound, dnsmasq, Bind9 funcionará, mas NSD não será, como é somente autoridade.)

Why can't the VPN server handle forwarded DNS queries via it's resolv.conf (without being a DNS server, just as it handles everything else without being an everything else server)?

Isso não chega nem perto da mesma coisa - o servidor VPN não manipula "todo o resto", mas apenas encaminha os pacotes IP.

Por exemplo, se um cliente se conecta ao Google ou usa 8.8.8.8 como seu servidor DNS, o servidor VPN só vê que é um pacote IPv4 para o endereço IP de outra pessoa. Assim, o servidor VPN não tenta entender o conteúdo do pacote - apenas o envia para o próximo roteador, e assim por diante, até que o pacote chegue ao destino real.

Mas se você quiser que o servidor VPN honre seu resolv.conf , ele deve entender como ele está relacionado aos pacotes que recebe e quais respostas devem ser geradas - e precisa de duas coisas para isso:

  • Para começar, seus clientes devem usar o próprio endereço do servidor VPN como seu "servidor DNS", para que o servidor se veja como o destino final dos pacotes e realmente interprete seu conteúdo (como UDP) em vez de encaminhá-los para algum lugar mais.

    (Isso significa que "resolv.conf do lado do cliente (manualmente, nunca muda)" é um problema. Se você push a opção dns-server, o cliente OpenVPN vai entendê-lo e deve tente atualizar o resolv.conf do cliente, mas isso depende do sistema.

  • Agora, o servidor VPN está recebendo pacotes para a porta UDP 53, mas ainda não entende automaticamente os dados que eles contêm. Assim como você precisa de um servidor da Web para entender as solicitações HTTP, você também precisa de um servidor DNS para entender as solicitações de DNS e responder adequadamente a elas.

Tecnicamente, você pode contornar o primeiro requisito usando iptables no servidor VPN para redirecionar todos os pacotes UDP / 53 para si mesmo - eu acho que isso é chamado de "proxy transparente" ou -j REDIRECT em vários tutoriais.

Mas sugiro fazer isso apenas uma vez que você tenha uma boa noção da distinção entre os pacotes de encaminhamento do seu servidor e o manuseamento deles. Caso contrário, isso só aumentaria a confusão.

    
por 17.12.2015 / 10:04
1

Você precisa usar um script de shell adequado para fazer interface das opções passadas para você pelo OpenVPN (os dois push dhcp-options... , que estão perfeitamente bem) com o arquivo resolv.conf via o resolvconf pacote, que você deve ter instalado por padrão.

Eu tenho, em /etc/openvpn no cliente, um arquivo (não meu trabalho!) chamado /etc/openvpn/update-resolv-conf , que é chamado no arquivo de configuração do cliente da seguinte forma:

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

Tenho certeza de que o script de shell está amplamente disponível on-line, mas se você não conseguir localizá-lo, clique aqui:

#!/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
    
por 17.12.2015 / 10:18