1 votes

Activer la résolution des noms d'hôtes DNS avec OpenVPN et DNSMasq

J'ai configuré OpenVPN comme serveur pour héberger mon propre VPN et je veux utiliser DNSMasq pour résoudre les noms d'hôtes sur le VPN.

Disons que j'ai le serveur OpenVPN, deux ordinateurs sur le réseau interne, et un à l'extérieur, tous clients pour le VPN (192.168.254.0/24) :

  • Réseau interne : 192.168.1.0/24
    • serveur : IP : 192.168.1.1
    • A : IP : 192.168.1.2, VPN : 192.168.254.2
    • B : IP : 192.168.1.3, VPN : 192.168.254.3
  • Réseau externe : 192.168.2.0/24
    • C : IP : 192.168.2.1, VPN : 192.168.254.4

Avec ma configuration actuelle, les deux A y B peuvent résoudre leurs noms d'hôtes via DNSMasq sur le réseau interne. Et, tous les A , B y C peuvent accéder les uns aux autres par IP direct. Mais, je veux permettre C d'accéder A y B par nom d'hôte (résolution DNS, pas NetBIOS) sans faire transiter tout le trafic réseau par le VPN.

Configuration de l'OpenVPN :

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

Dois-je également configurer le serveur VPN en tant que client ? Dois-je pousser le domaine du réseau interne à travers le VPN ? Que dois-je faire ?

1voto

Chris Nava Points 4048

Avec une grande complexité, j'ai quelque chose qui ressemble à un DNS sur le VPN.

Tout d'abord, je devais exécuter un script lors de l'ajout d'une adresse à OpenVPN. Dans la configuration du serveur :

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

J'ai commencé par le site learn-address.sh script d'un ancien fil de discussion OpenVPN mais étant donné que j'utilisais une interface TAP, j'ai dû ajouter script pour analyser le fichier ip-pool également :

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

J'ai fini par exécuter DNSMasq sur un serveur pour mon propre réseau local et sur un autre serveur pour le VPN. J'ai dû mettre à jour ma configuration ( /etc/dnsmasq.conf ) sur le serveur DNS du VPN :

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

Une fois que je l'ai eu, j'ai dû pousser quelques options via le serveur DHCP d'OpenVPN. Encore une fois, dans la configuration du serveur 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

Malheureusement, seule la version Windows d'OpenVPN permet de définir ces options automatiquement. Les clients Linux devront configurer les scripts pour qu'ils s'exécutent lors de la montée/descente de la connexion. Si votre système Linux utilise /etc/resolv.conf En fin de compte, vous avez besoin que votre domaine VPN apparaisse dans votre page d'accueil. search et l'IP de votre serveur apparaîtra comme une nameserver :

search example # you may have other strings here too, separated by a space
# ... other nameservers, then:
nameserver 192.168.254.1

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X