Я установил OpenVPN на свой сервер с помощью этого скрипта автоматической установки и скопировал сгенерированный файл конфигурации на мой клиент, также работающий с OpenVPN. Я хочу направить весь клиентский трафик через VPN, и я хочу, чтобы имена разрешались на стороне сервера. Весь трафик, кажется, успешно маршрутизируется, но имена разрешаются любым DNS-сервером, который я указываю в resolv.conf клиента . Как я могу сделать так, чтобы они были разрешены на стороне сервера? Соответствующая конфигурация на стороне сервера:

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"

Я не знаком с VPN-серверами, я не уверен, что этот "толчок" необходим, так как я не использую DHCP-клиент. Клиентский resolv.conf (ручная установка, никогда не изменяется):

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

Согласно официальному HOWTO от OpenVPN:

Когда используется redirect-gateway, клиенты OpenVPN будут направлять DNS-запросы через VPN, и VPN-сервер должен будет обрабатывать их. Это может быть достигнуто путем передачи адреса DNS-сервера подключающимся клиентам, который заменит их обычные настройки DNS-сервера во время активности VPN. Например:

push "dhcp-option DNS 10.8.0.1"

настроит клиентов Windows (или клиентов не Windows с некоторыми дополнительными серверными сценариями) для использования 10.8.0.1 в качестве своего DNS-сервера. Любой адрес, который доступен клиентам, может использоваться в качестве адреса DNS-сервера.

Но это, похоже, не работает, как уже упоминалось. Я полагаю, что для того, чтобы это работало, мой (VPN) сервер также должен быть DNS-сервером. Но нужно ли это? Почему сервер VPN не может обрабатывать перенаправленные DNS-запросы через свой resolv.conf (не будучи DNS-сервером, так же, как он обрабатывает все остальное, не будучи сервером всего остального)? Я немного потерян здесь.

Я могу предоставить любые дополнительные файлы конфигурации, если это необходимо.

2 ответа2

1

Я не уверен, что этот "толчок" необходим, так как я не использую DHCP-клиент.

OpenVPN уже получает свой IP-адрес и другую конфигурацию с сервера, поэтому он сам понимает некоторые "параметры DHCP", даже если они технически не отправляются через DHCP.

Я полагаю, что для того, чтобы это работало, мой (VPN) сервер также должен быть DNS-сервером. Но нужно ли это?

Да, это. (В частности, вам нужен распознаватель - Unbound, dnsmasq, Bind9 будет работать, но NSD не будет, так как он только для полномочий.)

Почему сервер VPN не может обрабатывать перенаправленные DNS-запросы через свой resolv.conf (не будучи DNS-сервером, так же, как он обрабатывает все остальное, не будучи сервером всего остального)?

Это даже близко не одно и то же - сервер VPN не обрабатывает "все остальное", он просто перенаправляет IP-пакеты.

Например, если клиент подключается к Google или использует 8.8.8.8 качестве DNS-сервера, VPN-сервер видит только, что это пакет IPv4 для чужого IP-адреса. Таким образом, VPN-сервер не пытается понять содержимое пакета - просто отправляет его к следующему маршрутизатору и так далее, пока пакет в конечном итоге не достигнет реального места назначения.

Но если вы хотите, чтобы VPN-сервер соблюдал свой resolv.conf , он должен понимать, как он связан с полученными пакетами и какие ответы следует генерировать, и для этого ему нужны две вещи:

  • Для начала ваши клиенты должны использовать собственный адрес VPN-сервера в качестве своего «DNS-сервера», чтобы сервер воспринимал себя как конечное назначение пакетов и фактически интерпретировал их содержимое (как UDP), а не перенаправлял их куда-либо еще.

    (Это означает, что «resolv.conf на стороне клиента (устанавливается вручную, никогда не изменяется)» является проблемой. Если push опцию DNS-сервер, клиент OpenVPN поймет его , и он должен попытаться обновить resolv.conf клиента, но это зависит от системы.)

  • Теперь VPN-сервер получает пакеты на UDP-порт 53, но все еще не может автоматически понять, какие данные они содержат. Так же, как вам нужен веб-сервер для понимания HTTP-запросов, вам также нужен DNS-сервер для понимания DNS-запросов и для правильного ответа на них.


Технически, вы можете обойти 1-е требование, используя iptables на VPN-сервере для перенаправления всех пакетов UDP/53 на себя - я думаю, это называется "прозрачный прокси" или -j REDIRECT в различных руководствах.

Но я советую делать это только тогда, когда вы хорошо разберетесь в разнице между пересылкой пакетов вашим сервером и их обработкой. В противном случае это только добавит путаницы.

1

Вам необходимо использовать подходящий сценарий оболочки, чтобы связать параметры, переданные вам OpenVPN (две push dhcp-options... , которые отлично подходят) с файлом resolv.conf через пакет resolvconf , который вы должны были установить с помощью дефолт.

У меня в /etc/openvpn на клиенте есть файл (не моя работа!) называется /etc/openvpn/update-resolv-conf , который вызывается в файле конфигурации клиента следующим образом:

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

Я уверен, что сценарий оболочки широко доступен в Интернете, но если вы не сможете его найти, вот оно:

#!/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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .