Включить разрешение имен DNS-узлов с помощью OpenVPN и DNSMasq

0

Я настроил OpenVPN как сервер для размещения своей собственной VPN, и я хочу использовать DNSMasq для разрешения имен хостов в VPN.

Допустим, у меня есть сервер OpenVPN, два компьютера во внутренней сети и один снаружи, все клиенты для VPN (192.168.254.0/24)

  • Внутренняя сеть: 192.168.1.0/24
    • сервер : IP: 192.168.1.1
    • : IP: 192.168.1.2, VPN: 192.168.254.2
    • В : IP: 192.168.1.3, VPN: 192.168.254.3
  • Внешняя сеть: 192.168.2.0/24
    • С : IP: 192.168.2.1, VPN: 192.168.254.4

С моей текущей настройкой оба а также В можно разрешить их имена хостов через DNSMasq во внутренней сети. И все , В , а также С можно получить доступ друг к другу по прямому IP. Но я хочу разрешить С чтобы получить доступ а также В по имени хоста (разрешение DNS, а не NetBIOS) без направления всего сетевого трафика через VPN.

Конфигурация OpenVPN:

proto tcp
dev tap
server 192.168.254.0 255.255.255.0
client-to-client
persist-key
persist-tun

Нужно ли также настроить VPN-сервер в качестве клиента? Нужно ли выдвигать домен из внутренней сети через VPN? Что мне нужно сделать?

palswim
источник

Ответы:

0

С большой сложностью у меня есть что-то, приближающее DNS через VPN.

Сначала мне нужно было запустить скрипт при добавлении адреса в OpenVPN. В конфигурации сервера:

ifconfig-pool-persist ip-pool # Store mappings of CN,IP, 1 per line
script-security 2             # Allow OpenVPN to run user scripts
learn-address /path/to/learn-address.sh

Я начал с learn-address.sh скрипт из старого потока OpenVPN , но так как я запускал интерфейс TAP, мне пришлось добавить скрипт для ip-pool файл также:

#!/bin/sh
# openvpn learn-address script to manage a hosts-like file
# - intended to allow dnsmasq to resolve openvpn clients
#   addn-hosts=/etc/hosts.openvpn-clients
#
# Changelog
# 2006-10-13 BDL original
# 2018-12-10 Palswim change to query OpenVPN Persistent pool for TAP interfaces

# replace with a sub-domain of your domain, use a sub-domain to
# prevent VPN clients from stealing existing names
DOMAIN=example

HOSTS=/etc/openvpn/hosts

h="hosts-openvpn-$DOMAIN"
LOCKFILE="/var/run/$h.lock"

IP="$2"
CN="$3"

if [ -z "$IP" ]; then
    echo "$0: IP not provided" >&2
    exit 1
else
    # In TAP mode, OpenVPN passes MAC instead of IP, since with TAP, clients can use protocols other than IP
    MAC="$IP"
    IP=$(grep "^$CN[[:space:]]*," ip-pool | head -n 1 | cut -d, -f 2)
    if [ -z "$IP" ]; then
        echo "$0: Failed to find IP in ipconfig-pool" >&2
        exit 0
    else
        echo "$0: Translated MAC ($MAC) to IP ($IP)"
    fi
fi

case "$1" in
    add|update)
        if [ -z "$CN" ]; then
            echo "$0: Common Name not provided" >&2
            exit 0
        fi
    ;;
    delete)
    ;;
    *)
        echo "$0: unknown operation [$1]" >&2
        exit 1
    ;;
esac

# serialise concurrent accesses
[ -x /bin/lock ] && /bin/lock "$LOCKFILE"

# clean up IP if we can
[ -x /bin/ipcalc ] && eval $(ipcalc "$IP")

FQDN="$CN"

# busybox mktemp must have exactly six X's
t=$(/bin/mktemp "/run/shm/$h.XXXXXX")
if [ $? -ne 0 ]; then
    echo "$0: mktemp failed" >&2
    exit 1
fi


case "$1" in
    add|update)
        /usr/bin/awk '
            # update/uncomment address|FQDN with new record, drop any duplicates:
            $1 == "'"$IP"'" || $1 == "#'"$IP"'" || $2 == "'"$FQDN"'" \
            { if (!m) print "'"$IP"'\t'"$FQDN"'"; m=1; next }
            { print }
            END { if (!m) print "'"$IP"'\t'"$FQDN"'" }           # add new address to end
        ' "$HOSTS" > "$t" && cat "$t" > "$HOSTS"
    ;;

    delete)
            /usr/bin/awk '
            # no FQDN, comment out all matching addresses (should only be one)
            $1 == "'"$IP"'" { print "#" $0; next }
            { print }
        ' "$HOSTS" > "$t" && cat "$t" > "$HOSTS"
    ;;

esac

# signal dnsmasq to reread hosts file
kill -HUP $(cat /var/run/dnsmasq/dnsmasq.pid)

rm "$t"

[ -x /bin/lock ] && /bin/lock -u "$LOCKFILE"
exit 0

Я запустил DNSMasq один сервер для своей локальной сети, а другой сервер для VPN. Мне пришлось обновить мою конфигурацию ( /etc/dnsmasq.conf ):

no-resolv                    # Didn't want to serve anything but VPN requests
interface=tap0
no-hosts                     # Don't use /etc/hosts
add-hosts=/etc/openvpn/hosts # Target the output of the learn-address.sh script
expand-hosts
domain=example

Как только у меня это получилось, мне пришлось выдвинуть несколько вариантов через DHCP-сервер OpenVPN. Опять же, в конфигурации сервера OpenVPN:

server 192.168.254.0 255.255.255.0 # Assuming this VPN network
push "dhcp-option DNS 192.168.254.1"
push "dhcp-option DOMAIN example"  # Push domain to clients

К сожалению, только версия OpenVPN для Windows поддерживает автоматическую настройку этих параметров. Клиенты Linux должны будут настроить скрипты для запуска при подключении вверх / вниз. Если ваша система Linux использует /etc/resolv.confв конечном итоге вам нужно, чтобы ваш VPN-домен появился в вашем search список и IP-адрес вашего сервера, чтобы отображаться как nameserver:

search example # you may have other strings here too, separated by a space
# ... other nameservers, then:
nameserver 192.168.254.1
palswim
источник