Не берите в голову, я нашел другой способ, чем 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