Uruchomienie bezpiecznej usługi DDNS na serwerze BIND

Jeżeli nie posiadasz statycznego adresu IP w domu, a potrzebujesz dostęp do nich stały dostęp w łatwy sposób możesz osiągnać swój cel posiadając serwer DNS.

Po stronie klienta generujemy klucze:

# zastąp keyname dowolną nazwą
dnssec-keygen -a HMAC-MD5 -b 512 -r /dev/urandom -n HOST keyname

Spowoduje to utworzenie plików Kkeyname.***.key i Kkeyname.***.private, z pliku*.private należy skopiować klucz, który będzie wyglądać podobny:

Key: pRP5FapFoJ95JEL06sv4PQ==

Po stronie serwera, należy wyedytować plik konfiguracyjny BIND (np. named.conf or named.conf.local) i dodać:

key "keyname." {
  algorithm hmac-md5;
  secret "pRP5FapFoJ95JEL06sv4PQ==";
};

Następnie zezwalamy na aktualizację stref poprzez dodanie do pliku konfiguracyjnego strefy wpis dotyczący allow-update:

zone "example.com" {
  type master;
  file "master/db.example.com";
  allow-update { key "keyname."; };
};

Na koniec restartujemy usługę BIND.

 

Po stronie klienta potrzebujemy czegoś co będzie w stanie wysyłać prośby o aktualizację wpisu dns (np. nsupdate). Poniżej przykładowany scrypt. Należy pamiętać o edycji KEY oraz SERVER

#!/bin/bash
# Script to update DNS zones on a remote server
# Copyright © 2005-2007 - Julien Valroff <julien@kirya.net>
# Parts of the script Copyright © 2001-2002 - Dag Wieers <dag@wieers.com>
 
KEY="/root/Kkeyname.+157+29630.private"
SERVER="ns.domain.com"
LOGFILE="/var/log/syslog"
PPP_IFACE="ppp0"
 
if [ "$PPP_LOCAL" != '' ]; then
   if [ "$PPP_IFACE" != "$PPP_IFACE" ]; then
      echo "$(LANG=C date +'%b %e %X') $(hostname) ddupdate[$$]: ABORTED: Not updating dynamic IP \
        address $PPP_LOCAL (already done for $(ip addr show $PPP_IFACE | awk '/inet/ { print $2 }'))" >>$LOGFILE 2>&1
      exit 0
   fi
   IPADDR=$PPP_LOCAL
   sleep 3
else
   IPADDR=$(ip addr show $PPP_IFACE | awk '/inet/ { print $2 }')
fi
 
(
cat <<EOF | nsupdate -k "$KEY"
server $SERVER
zone example.com
update delete example.com. A
update add example.com. 60 A $IPADDR
update delete mail.example.com. A
update add mail.example.com. 60 A $IPADDR
send
EOF
 
  RC=$?
 
  if [ $RC != 0 ]; then
    echo "$(LANG=C date +'%b %e %X') $(hostname) ddupdate[$$]: FAILURE: Updating dynamic IP $IPADDR on $SERVER failed (RC=$RC)"
    (
        echo "Subject: DDNS update failed"
        echo
        echo "Updating dynamic IP $IPADDR on $SERVER failed (RC=$RC)"
    ) | /usr/sbin/sendmail root
  else
    echo "$(LANG=C date +'%b %e %X') $(hostname) ddupdate[$$]: SUCCESS: Updating dynamic IP $IPADDR on $SERVER succeeded"
  fi
) >>$LOGFILE 2>&1
 
exit $RC

 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*