Как я могу обновить записи DNS-сервера A, отличного от Windows, с DHCP на NAS-устройстве Synology - PullRequest
0 голосов
/ 06 ноября 2018

Фон Я хочу динамически обновлять записи DNS A с моего DHCP-сервера, которые работают на одном и том же NAS-устройстве Synology. К сожалению, Synology (до сих пор) не предоставила для этого рабочего решения.

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

Так ..

1 Ответ

0 голосов
/ 10 ноября 2018

Не берите в голову, я нашел другой способ, чем c # и mono, динамически обновлять мой локальный DNS.

Сначала я попробовал скрипт, который нашел здесь , но через пару дней мои локальные DNS-запросы больше не работали по неизвестной причине.

Как выясняется, сервер dhcp на моем NAS-устройстве Synology (DS214Play) вызывает сценарий bash после изменения аренды, в расположении /usr/share/dhcpd/dhcpd-script.sh

После того, как я узнал, что вы можете легко изменить свои (локальные) записи DNS с помощью команды nsupdate, я обновил существующий скрипт до приведенного ниже. Строки, которые я добавил, помечены моими инициалами ЧЧ.

Что касается безопасности при обновлении DNS: я не использовал ключ, так как мой DNS-сервер все равно принимает обновления только из внутренней сети и локального хоста.

Если вы нашли мой ответ полезным, пожалуйста, также поставьте вопрос, если он все еще отрицательный. (Я сам ответил)

#!/bin/sh
# Copyright (c) 2000-2013 Synology Inc. All rights reserved.
# HH20181109 Updated for dynamic DNS updates

DHCPD_DIR="/etc/dhcpd/"
LEASE_FILE="${DHCPD_DIR}/dhcpd.conf.leases"
LOG_FILE="${DHCPD_DIR}/dhcpd-leases.log"
TMP_FILE="${DHCPD_DIR}/tmp-dhcpd-leases.log"

# define the zone (local domain name) here, but without a trailing point
ZONE_NAME="hhbhasenack.local"

# Prepare a file for updating the DNS through the nsupdate command
TMP_NSUPDATE="${DHCPD_DIR}/tmp-nsupdate.log"
NSUPDATE_LOG_FILE="${DHCPD_DIR}/nsupdate.log"
echo "server 127.0.0.1" > ${TMP_NSUPDATE}
echo "zone ${ZONE_NAME}." >> ${TMP_NSUPDATE}


del_leases() { # $2: mac
    local mac=$2
    grep -v "${mac}" ${LOG_FILE} > ${TMP_FILE}
    cp ${TMP_FILE} ${LOG_FILE}
# HH:prep dns update command
    local ip="$3"
    local hostname="$4"
    echo "update delete ${hostname}.${ZONE_NAME}" >> ${TMP_NSUPDATE}
}

renew_record() { # $1: expired $2 mac $3 ip $4 hostname $5 iface
    local record=$@
    local mac=$2
    local iface=$5

    grep -v "${mac}" ${LOG_FILE} > ${TMP_FILE}
    echo "${record}" >> ${TMP_FILE}
    cp ${TMP_FILE} ${LOG_FILE}

# HH:prep dns update command
    local ip="$3"
    local hostname="$4"
    echo "update delete ${hostname}.${ZONE_NAME} A"  >> ${TMP_NSUPDATE}
    echo "update add ${hostname}.${ZONE_NAME} 3600 A ${ip}" >> ${TMP_NSUPDATE}

}

add_new_record() {
    local record="$@"
    local mac=$2

    # when disable dhcp-server and any lease is expired, then next time the dhcp client
    # renew the lease the action will be add, so remove the old record has same MAC address
    grep -v "${mac}" ${LOG_FILE} > ${TMP_FILE}
    cp ${TMP_FILE} ${LOG_FILE}

    if [ -s ${LOG_FILE} ]; then
        sed -i "1 i${record}" ${LOG_FILE}
    else
        echo ${record} >> ${LOG_FILE}
    fi

# HH:prep dns update command
    local ip="$3"
    local hostname="$4"
    echo "update add ${hostname}.${ZONE_NAME} 3600 A ${ip}" >> ${TMP_NSUPDATE}
}

get_hostname_from_logfile() {
    local mac="$1"
    local filename="";
    local line="`grep \"${mac}\" ${LOG_FILE}`"
    local tokens=( $line )

    if [ 5 -eq ${#tokens[@]} ]; then
        filename=${tokens[3]}
    fi

    echo $filename
}

get_new_record() {
    local mac="$2"
    local ip="$3"
    local hostname="$4"
    local fileHostname=$(get_hostname_from_logfile $mac)

    if [ "x" = "x${hostname}" ] && [ "xold" = "x${ACTION}" ];then
        if [ "x" != "x${DNSMASQ_SUPPLIED_HOSTNAME}" ]; then
            hostname=${DNSMASQ_SUPPLIED_HOSTNAME}
        elif [ "x" != "x${fileHostname}" ]; then
            hostname=${fileHostname}
        fi
    fi

    NEW_RECORD="${DNSMASQ_LEASE_EXPIRES} ${mac} ${ip} ${hostname} ${DNSMASQ_INTERFACE}"
}

# record format: action mac ip hostname
NEW_RECORD=$@
ACTION=`echo ${NEW_RECORD} | awk '{print $1}'`

if [ "${DNSMASQ_INTERFACE}" = "" ]; then
    exit 0
fi
get_new_record ${NEW_RECORD}

case "${ACTION}" in
    old)
        renew_record ${NEW_RECORD}
        ;;
    add)
        add_new_record ${NEW_RECORD}
        ;;
    del)
        del_leases ${NEW_RECORD}
        ;;
    *)
        ;;
esac

# HH:complete command file for nsupdate with a send command
echo "send" >> ${TMP_NSUPDATE}
# HH: actually execute the nsupdate command
nsupdate ${TMP_NSUPDATE} >>${NSUPDATE_LOG_FILE}



exit 0
...