BLog

ImprintImpressum
PrivacyDatenschutz
DisclaimerHaftung
Downloads 

Dynamische IP Adresse einer bei AWS gehosteten Domain für den FreeBSD-Home-Server automatisch aktualisieren

Ich habe alle meine Domains nach AWS-Route-53 umgezogen, und eine Sub-Domain soll auf den FreeBSD-Home-Server zeigen. Als die Domains noch bei Strato lagen, hatte ich die Adresse über das von Strato zu diesem Zweck vorgesehene DynDNS-Protokoll automatisch aktualisiert. AWS-Route-53 kann alles nur nicht DynDNS. Hier zeige ich, wie die Aktualisierung mit dem Kommandozeilen-Tool awscli funktioniert.

Inzwischen wurde meine Internet-Anbindung zu Hause auch von Kabel auf Glasfaser umgestellt, und die dynamische Adresse wird nun via PPPoE und nicht mehr DHCP zugewiesen. Für PPPoE benutze ich mpd5(8). In den Einstellungen unter /usr/local/etc/mpd5/mpd.conf gibt man dann ein Script an, das aufgerufen werden soll, sobald die Verbindung steht.

Die MPD5-Einstellungen /usr/local/etc/mpd5/mpd.conf:

pppoe_client:
   create bundle static B_pppoe
   set iface name ppp0
   set iface description WAN
   set iface up-script "/root/config/ppp-up.sh"
   set iface enable tcpmssfix
   set iface route default
   set ipcp ranges 0.0.0.0/0 0.0.0.0/0
   set ipcp disable vjcomp

   create link static L_pppoe pppoe
   set link action bundle B_pppoe
   set auth authname <PPPoE-Benutzer>
   set auth password <PPPoE-Passwort>
   set link disable protocomp
   set link max-redial 0
   set link keep-alive 10 60
   set pppoe iface re0
   set pppoe service ""
   open

Das PPP-Up-Script /root/config/ppp-up.sh:

#!/bin/sh

if [ "$2" == "inet6" ]; then
   exit 0
fi

/root/config/ipfw.reload

NEWIP=`echo $3 | cut -d/ -f1`
/root/config/awsr53-update.sh $NEWIP

Das PPP-Up-Script lädt die Firewall-Regeln neu und ruft danach ein weiteres Script auf, das den A-Record der Sub-Domain bei AWS-Route 53 mit der neuen IP-Adresse aktualisiert.

Hierzu muß das Kommandozeilen-Tool awscli installiert sein:
   pkg install awscli

Nun müssen noch die AWS-Credentials hinterlegt werden:
   aws configure

In der AWS-Console unter Route 53 > Hosted Zones erfahren wir die ID der Zone, in der die betreffende Domain aufgeführt ist, in meinem Fall so ähnlich wie Z056735201OFuHv20rMLl.

Das AWS-Route-53-Update-Script /root/config/awsr53-update.sh:

#!/bin/sh

arg1=$1
arg2=$2

for iface in `/sbin/ifconfig -l` ; do
   desc=`/sbin/ifconfig $iface | /usr/bin/sed -n '/.description: /{s///;s/ .*//;p;}'`
   if [ "$desc" == "WAN" ] ; then
      WAN=$iface
   fi
done

if [ -e /var/tmp/currentIP ] ; then
   currentIP=`/bin/cat /var/tmp/currentIP`
else
   currentIP=
fi

if [ "$arg1" == "" ] || [ "$arg1" == "force" ] ; then
   if [ "$WAN" != "" ] ; then
      newIP=`/sbin/ifconfig $WAN | /usr/bin/sed -n '/.inet /{s///;s/ .*//;p;}'`
   fi
else
    newIP=$arg1
    arg1=$arg2
fi

# unlike in C, && and || share the same precedence and are evaluated from left to the rigth
if [ "$newIP" != "" ] && [ "$newIP" != "$currentIP" ] || [ "$arg1" == "force" ] ; then
   if [ "$currentIP" = "" ] ; then
      echo "awsr53: updating to $newIP"
   else
      echo "awsr53: updating from $currentIP to $newIP"
   fi

   HOME=/root
   /usr/local/bin/aws route53 change-resource-record-sets --output text --hosted-zone-id Z056735201OFuHv20rMLl --change-batch "`/usr/bin/sed \"s/NEWIP/$newIP/\" /root/config/awsr53-example.com.json`" > /var/tmp/awsr53.log 2>&1

   if [ "$?" == "0" ] ; then
      echo "$newIP" > /var/tmp/currentIP
   else
      echo "$?: `/usr/bin/sed \"s/NEWIP/$newIP/\" /root/config/awsr53-example.com.json`" >> /var/tmp/awsr53.log
   fi

else
   echo "awsr53: nochg $currentIP"
fi

Das Kommando aws route53 change-resource-record-sets ... lädt den neuen A-Record als JSON-Datei hoch. Die JSON-Datei ist /root/config/awsr53-example.com.json:

{
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "subdom.example.com",
        "Type": "A",
        "TTL": 300,
        "ResourceRecords": [
          {
            "Value": "NEWIP"
          }
        ]
      }
    }
  ]
}

Das funktioniert genauso problemlos wie zuvor das DynDNS-IP-Update bei Strato.

Copyright © Dr. Rolf Jansen - 2022-08-15 23:09:09

Diskussion auf Twitter: 1559324385902731270