NAS-script: Check extern IP-adres – Versie 1.3

Status: Dit is de laatste versie van dit script.

Beschrijving

Script om te controleren of je externe IP-adres is gewijzigd (aangezien dit door je Internet Service Provider lang niet altijd wordt gecommuniceerd als dit gebeurd). Het gevolg van een wijziging zijn dat bijvoorbeeld DNS-records en Firewall-autorisaties op basis van IP-adres niet meer correct zijn.

Het script controleert het bestand check_ip.txt op het laatst bekende IP-adres. Bestaat dit bestand nog niet, dan wordt dit aangemaakt en wordt hierin het huidige IP-adres opgeslagen. Bestaat dit bestand wel, en bevat dit een ander IP-adres dan het huidige IP-adres, dan wordt een notificatie e-mail uitgestuurd en wordt het bestand geüpdate met het nieuwe IP-adres.

Update

Verbeterde versie van versie 1.1 van dit script (versie 1.2 is hier nooit gepubliceerd). Twee grote wijzigingen;

  1. Voor het versturen van de mail wordt nu specifiek PHP7.4 gebruikt, deze dient dus ook geïnstalleerd te zijn. Aanleiding hiervoor is dat de nieuwere NAS-modellen van Synology standaard PHP8 draaien, en deze format e-mails op een verkeerde manier.
  2. Standaard wordt ipinfo.io gebruikt om het externe IP-adres te achterhalen. In het uitzonderlijke geval dat deze niet bereikbaar is, werd leeg ip-adres weggeschreven, wat tevens werd gezien als gewijzigd IP-adres. Nu ipify.org als backup toegevoegd om de kans op dit scenario te verkleinen. Wordt alsnog geen ip-adres achterhaald, dan wordt er verder geen actie ondernomen om een leeg ip-adres, en de daarbij foutieve e-mails te voorkomen.

Code

# Steenderen.NET
# NAS-script: Check extern IP-adres - Versie 1.3
# Dependency: PHP7.4 must be installed, PHP8.0 not yet supported because of mail misformatting.

IFS="`printf '\n\t'`"

# Setup
MAIL_FROM="mail@provider.com"
MAIL_TO="mail@provider.com"
MAIL_OLD_IP="Oude IP-adres"
MAIL_CURRENT_IP="Huidige IP-adres"
MAIL_SUBJECT_CHANGED="Extern IP-adres is gewijzigd"
MAIL_BODY_START_CHANGED="Beste gebruiker,\n\nHet externe IP-adres waarop uw NAS is aangesloten is gewijzigd."
MAIL_BODY_END_CHANGED="Voor een juiste werking kan het o.a. nodig zijn om DNS-records en firewall-autorisaties aan te passen naar het nieuwe IP-adres."
MAIL_SUBJECT_MONTHLY="Herinnering extern IP-adres"
MAIL_BODY_START_MONTHLY="Beste gebruiker,\n\nDit is de maandelijkse herinnering aan het externe IP-adres waarop uw NAS is aangesloten."
MAIL_BODY_END_MONTHLY="Er is geen wijziging geconstateerd, er hoeft verder geen actie te worden ondernomen."
MAIL_SIGNATURE="Met vriendelijke groeten,\nSynology DiskStation"

# No need to edit below here.
echo "Start running External IP address check script."

# Get directory where script is run from
CURRENT_DIR=$(cd `dirname $0` && pwd)

# Lookup current external IP addres using ipinfo.io
echo "- Getting IP address from ipinfo.io."
CURRENT_IP_ADDRESS="$(curl -silent -L ipinfo.io/ip|tail -n 1)"

# If lookup via ipinfo.io fails, ipify.org will be used as second try.
if [ -z "$CURRENT_IP_ADDRESS" ]; then
	echo "- Failed getting IP address, retrying with ipify.org."
	CURRENT_IP_ADDRESS="$(curl -silent -L https://api.ipify.org|tail -n 1)"
fi

# Only if IP addres was found, further actions will be taken.
if [ -z "$CURRENT_IP_ADDRESS" ]; then
	php74 -r 'mail("'$MAIL_TO'", "'$MAIL_SUBJECT_WARNING'", "'$MAIL_BODY_WARNING'\n\n'$MAIL_SIGNATURE'", "From: '$MAIL_FROM'");';
	echo "- IP address was not found, warning e-mail was sent."
	/usr/syno/bin/synologset1 sys info 0x11100000 "External IP address check: Could not get IP address from ipinfo.io and ipify.org, warning e-mail was sent.";
else
	# The last known IP address is stored in check_external_ip.txt.
	# Check if check_external_ip.txt already exists, if not create it for the first time.
	if [[ ! -f "$CURRENT_DIR/check_external_ip.txt" ]]; then
		echo "- File $CURRENT_DIR/check_external_ip.txt does not exist, external IP address is looked up for first time."
	
		echo $CURRENT_IP_ADDRESS > $CURRENT_DIR/check_external_ip.txt
	
		echo "- External IP address is " $CURRENT_IP_ADDRESS " and now for first time stored in $CURRENT_DIR/check_external_ip.txt to compare to the next time."
		/usr/syno/bin/synologset1 sys info 0x11100000 "External IP address check: IP address is "$CURRENT_IP_ADDRESS" and now for first time stored in "$CURRENT_DIR"/check_external_ip.txt to compare to the next time";

	# If check_external_ip.txt does exists, compare stored IP address with current IP address.
	else
		echo "- $CURRENT_IP_ADDRESS found as current IP address."

		LAST_IP_ADDRESS="$(cat $CURRENT_DIR/check_external_ip.txt)"
		echo "- $LAST_IP_ADDRESS found as last known IP address in $CURRENT_DIR/check_external_ip.txt."
	
		if [[ "$CURRENT_IP_ADDRESS" == "$LAST_IP_ADDRESS" ]]; then
			if [[ `date +%d` == "01" ]]; then
				php74 -r 'mail("'$MAIL_TO'", "'$MAIL_SUBJECT_MONTHLY'", "'$MAIL_BODY_START_MONTHLY'\n\n'$MAIL_CURRENT_IP': '$CURRENT_IP_ADDRESS'\n\n'$MAIL_BODY_END_MONTHLY'\n\n'$MAIL_SIGNATURE'", "From: '$MAIL_FROM'");';
				echo "- IP address was not changed, but it is the first of the month so monthly e-mail was sent."
				/usr/syno/bin/synologset1 sys info 0x11100000 "External IP address check: IP address ("$LAST_IP_ADDRESS") was not changed, but it is the first of the month so monthly e-mail was sent.";			
			else
				echo "- IP address was not changed, no further action taken."
				/usr/syno/bin/synologset1 sys info 0x11100000 "External IP address check: IP address ("$LAST_IP_ADDRESS") was not changed, no further action taken";
			fi
		else
			php74 -r 'mail("'$MAIL_TO'", "'$MAIL_SUBJECT_CHANGED'", "'$MAIL_BODY_START_CHANGED'\n\n'$MAIL_OLD_IP': '$LAST_IP_ADDRESS'\n'$MAIL_CURRENT_IP': '$CURRENT_IP_ADDRESS'\n\n'$MAIL_BODY_END_CHANGED'\n\n'$MAIL_SIGNATURE'", "From: '$MAIL_FROM'");';
			echo "- IP address was changed, notification e-mail was sent."
			/usr/syno/bin/synologset1 sys info 0x11100000 "External IP address check: IP address was changed from "$LAST_IP_ADDRESS" to "$CURRENT_IP_ADDRESS", notification e-mail was sent.";
	
			echo $CURRENT_IP_ADDRESS > $CURRENT_DIR/check_external_ip.txt
			echo "- New IP address stored in check_external_ip.txt to compare to next time."
		fi
	fi
fi

# Done!
echo "Done running check ip address script."

Installatie-instructies

Sla het script op in een nieuw bestand met de naam check_ip.sh en plaats deze op. Op dezelfde locatie wordt bij de eerste keer uitvoeren van het script het bestand check_ip.txt aangemaakt.

Vul in het script, onder #Setup, ten minste de eerste twee variabelen in m.b.t. de te verzenden notificatie e-mails.

Plan het script in om dagelijks te draaien via de Taakplanner in het Configuratiescherm van je NAS. Ik heb ‘m zelf om 23:59 uur draaien, een minuut voordat mijn backup naar een externe locatie begint. Mocht mijn IP-adres gewijzigd zijn, dan kan dat de oorzaak zijn waarom een backup mislukt. Door de e-mail die dit script verstuurt is dat dan gelijk duidelijk.

Let er bij het inplannen op dat je het volledige pad gebruikt naar de locatie waar je het script het opgeslagen, dit is bijvoorbeeld /volume1/beheer/check_ip.sh

Opmerkingen

Aangezien dit een redelijk standaard script is, zou dit in principe op ieder Linux apparaat (bijv. ook een Raspberry Pi) moeten draaien. Inplannen doe je dan uiteraard via Crontab.

2 reacties

  1. hi
    ik heb wat problemen met je script ik krijg de volgende fout meldingen bij het uitvoeren:

    /volume1/pi_data/check_extern_IP/check_ip.sh: line 4: $’\r’: command not found
    /volume1/pi_data/check_extern_IP/check_ip.sh: line 6: $’\r’: command not found
    /volume1/pi_data/check_extern_IP/check_ip.sh: line 19: $’\r’: command not found
    Start running External IP address check script.
    /volume1/pi_data/check_extern_IP/check_ip.sh: line 22: $’\r’: command not found
    /volume1/pi_data/check_extern_IP/check_ip.sh: line 25: $’\r’: command not found
    – Getting IP address from ipinfo.io.
    /volume1/pi_data/check_extern_IP/check_ip.sh: line 29: $’\r’: command not found
    /volume1/pi_data/check_extern_IP/check_ip.sh: line 81: syntax error: unexpected end of file

    mijn nas is een DS718 met DSM 7.1.1-42962 update 6
    met Python 3.9 + ontwikkeltools en Python 2 + ontwikkeltools en PHP 7.0, 7.2, 7.3 en7.4 + ontwikkeltools 7.3 en 7.4 (ontwikkeltools 8.0 heb ik ge deinstalleerd)
    kan je me helpen

    • Op welke manier heb je gekopieerd en geplakt? Voor de zekerheid kan je ‘m anders eerst even plakken in bijvoorbeeld Notepad++ en van daaruit opnieuw kopieren en plakken. Dat haalt eventueel onbedoelde opmaak eruit en zorgt mogelijk dat ie wel goed draait. Komt helaas vaker voor…

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.