Fritz Box External IP

From JoBaPedia
Revision as of 10:29, 30 July 2020 by Joachim (talk | contribs) (Created page with "= DynDNS = Recently dyndns updates on external IP changes did not always work. This should make it more robust. IP from fritzbox taken from https://wiki.ubuntuusers.de/Fritz...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

DynDNS

Recently dyndns updates on external IP changes did not always work. This should make it more robust.

IP from fritzbox taken from https://wiki.ubuntuusers.de/FritzBox/Skripte/

Read external IP from Fritzbox

/usr/local/bin/fb-ip.sh

#!/bin/bash

if [ "$1" == "" ]; then
  FB="fritz.box"
else
  FB="$1"
fi

curl "http://${FB}:49000/igdupnp/control/WANIPConn1" \
  -H "Content-Type: text/xml; charset="utf-8"" \
  -H "SoapAction:urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress" \
  -d "<?xml version='1.0' encoding='utf-8'?> 
      <s:Envelope 
        s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'> 
        <s:Body> 
          <u:GetExternalIPAddress xmlns:u='urn:schemas-upnp-org:service:WANIPConnection:1' /> 
        </s:Body> 
      </s:Envelope>" \
  -s | grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>'

Compare external IP with DNS entry

/usr/local/bin/check-ip.sh

#!/bin/bash

if [ "$1" == "" ]; then
  CN="banzhaf.chickenkiller.com"
else
  CN="$1"
fi

if [ "$2" == "" ]; then
  FB="fritz.box"
else
  FB="$2"
fi

XIP=`/usr/local/bin/fb-ip.sh "$FB"`
DIP=`dig +short "$CN"`
if [ "$XIP" == "$DIP" ]; then
  echo "OK"
  exit 0
fi
echo "ERROR"
exit 1

Update DynDNS if external IP does not match DNS entry

if there is a mismatch between external IP and DNS, give it some time and then fix it

/usr/local/bin/ensure-ip.sh

#!/bin/bash

DELAY_S=120

if [ "$1" == "" ]; then
  CN="banzhaf.chickenkiller.com"
else
  CN="$1"
fi

if [ "$2" == "" ]; then
  FB="fritz.box"
else
  FB="$2"
fi

if ! check-ip.sh "$CN" "$FB" >/dev/null; then
  echo "Check IP failed. Waiting to settle"
  SINCE=$SECONDS
  while [ $((SECONDS - SINCE)) -lt $DELAY_S ]; do
    sleep 1
    if check-ip.sh "$CN" "$FB" >/dev/null; then
      echo "Check IP recovered."
      exit 0
    fi
  done
  echo "Check IP still fails. Updating DNS"
  update-dns.sh
  SINCE=$SECONDS
  while [ $((SECONDS - SINCE)) -lt $DELAY_S ]; do
    sleep 1
    if check-ip.sh "$CN" "$FB" >/dev/null; then
      echo "IP updated."
      exit 0
    fi
  done
  echo "Updating DNS failed"
  exit 1
fi