commit b4fdbf02f088c596f33c28cc61ad117d128ad64e Author: Fincer Date: Tue Oct 30 01:27:33 2018 +0200 Initial commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..a708503 --- /dev/null +++ b/README.md @@ -0,0 +1,68 @@ +# WAN IP checker + +WAN IPv4 checker & email notifier for server environments behind dynamic DHCP. + +## About + +This repository contains a systemd service file & a simple bash script to refresh current WAN IPv4 of a server, and notify server admin for any changes in the server WAN (Internet) address. This helps in several issues: + + - Server admin is always aware of the current server IPv4 address, whether the address is dynamic or not. + + - Server admin is able to remotely connect to the server environment although the server IP may have been changed. This is possible because the admin is notified about any WAN IPv4 address changes via email by the server itself, automatically. + +In many home networks, WAN (Wide Area Network) IP addresses are dynamically allocated by a local ISP. Usually this is okay in common household/home use, but not in server use. + +In most server environments, static DHCP lease/static IP address is a mandatory requirement. However, static IPs are usually offered only for corporate environments, and not everyone wants to pay extra for such in order to establish a simple server environment in home. + +## Requirements + +- A server computer of any kind + +- Linux OS + + - systemd - service file + + - [SSMTP](https://wiki.archlinux.org/index.php/SSMTP) - email client + + - bash + + - awk + +## Contents + +- systemd **user** service file: `wanip-checker@.service` + +- bash script: `wanip-checker.sh` + +## Installation + +**1)** Insert `wanip-checker@.service` into `/usr/lib/systemd/user/` folder + + - WAN IP check interval is customizable in systemd service file. Default value is `60` (1 min) + +**2)** Insert `wanip-checker.sh` into your `/home/myuser/` folder + +**3)** Configure your email address and message form in `wanip-checker.sh` file + +**3)** Install `ssmtp`, and configure files `/etc/ssmtp/revaliases` and `/etc/ssmtp/ssmtp.conf` as described on [SSMTP Arch Wiki site](https://wiki.archlinux.org/index.php/SSMTP). + +**4)** Run + +``` +systemctl --user enable wanip-checker@myusername.service && \ +systemctl --user start wanip-checker@myusername.service && \ +systemctl --user daemon-reload + +``` + +**NOTE:** If you change the script contents, make sure to run `systemctl --user restart wanip-checker@myusername.service` afterwards. + +## Images + +When server computer discovers changes in WAN IPv4, it automatically sends an email notification for system administrators: + +![](images/wanip_email.png) + +Additionally, server computer keeps a log file which include WAN IPv4 changes and corresponding timestamps: + +![](images/wanip_log.png) diff --git a/images/wanip_email.png b/images/wanip_email.png new file mode 100644 index 0000000..e0e9b1d Binary files /dev/null and b/images/wanip_email.png differ diff --git a/images/wanip_log.png b/images/wanip_log.png new file mode 100644 index 0000000..3967a60 Binary files /dev/null and b/images/wanip_log.png differ diff --git a/wanip-checker.sh b/wanip-checker.sh new file mode 100644 index 0000000..b901550 --- /dev/null +++ b/wanip-checker.sh @@ -0,0 +1,140 @@ +#!/bin/env bash + +# WAN IP Checker - Whenever server WAN IP address changes, inform admins via email +# Copyright (C) 2018 Pekka Helenius +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +########################################################### + +# A script for remote server environments which are behind +# dynamic (non-static) DHCP. Usually these dynamic IPs are +# used in common household networks in non-corporate +# environments. + +########################################################### + +# Script requirements +# +# SSMTP + +# https://wiki.archlinux.org/index.php/SSMTP +# Relevant conf files +# /etc/ssmtp/revaliases +# /etc/ssmtp/ssmtp.conf + +# Because your email password is stored as cleartext in /etc/ssmtp/ssmtp.conf, it is important that this file +# is secure. By default, the entire /etc/ssmtp directory is accessible only by root and the mail group. +# The /usr/bin/ssmtp binary runs as the mail group and can read this file. There is no reason to add +# yourself or other users to the mail group. + +########################################################### + +# Some lines below are commented out because the timer is handled by systemd service file +# If you don't use provided systemd service file, re-enable the relevant lines below + +function checkWANIP() { + + # Command to resolve the current IPv4 WAN address + local WANIP_CURRENT="dig +short myip.opendns.com @resolver1.opendns.com" + +############################ + + # If we are connected to internet... + # There's no point to do WAN IP check if we can't establish connection to WAN/Internet at all + # In addition, do not generate any network related variables if the connection + # can't be established. Therefore, include variable defitions inside this if statement. + if [[ $(printf $(eval ${WANIP_CURRENT} &> /dev/null)$?) -eq 0 ]]; then + + # Check interval in minutes + # local CHECK_INTERVAL=5 + +############################ + + # Cache/Log directory of the script + local WANIP_DIR="$HOME" + + # Log file for checked/resolved IPv4 WAN addresses: + local WANIP_LOG="$WANIP_DIR/.ip_wan.log" + + if [[ ! -d ${WANIP_DIR} ]]; then + mkdir -p ${WANIP_DIR} + fi + + if [[ ! -f ${WANIP_LOG} ]]; then + printf 'Time\t\t\t\tWAN IPv4\n' > ${WANIP_LOG} + fi + +############################ + + # Log file timestamp format + local TIMESTAMP=$(date '+%d-%m-%Y, %X') + +############################ + + # Email to send notify to + local EMAIL_RECIPIENT="mymail@hotmail.com" + + # Email subject/title + local SUBJECT_EMAIL="WAN IP address change (Helsinki, $(tail -1 ${WANIP_LOG} | awk '{print $NF}') -> $(eval ${WANIP_CURRENT}))" + + # Email message/body contents + local MESSAGE_EMAIL="${TIMESTAMP}: WAN address of the server (Helsinki) has been changed from $(tail -1 ${WANIP_LOG} | awk '{print $NF}') to $(eval ${WANIP_CURRENT})" + + # Message to server stdout + local MESSAGE_STDOUT="$(echo ${TIMESTAMP}) - WAN address of this server has been changed from $(tail -1 ${WANIP_LOG} | awk '{print $NF}') to $(eval ${WANIP_CURRENT})" + +############################ + + # Email send command + local MAIL_SEND="echo -e \"To: ${EMAIL_RECIPIENT}\nFrom: ${EMAIL_RECIPIENT}\nSubject: ${SUBJECT_EMAIL}\n\n${MESSAGE_EMAIL}\" | sendmail -v ${EMAIL_RECIPIENT}" + + # Log write command + local LOG_WRITE="printf '%s %s\t\t%s\n' $(echo $TIMESTAMP) $(eval $WANIP_CURRENT) >> $WANIP_LOG" + +############################ + + # If the log file has no previous IPv4 entries + if [[ $(cat $WANIP_LOG | wc -l) -le 1 ]]; then + eval ${LOG_WRITE} + fi + +# local i=0 +# while true; do + +# if [[ $i -ne 0 ]]; then +# sleep $(( ${CHECK_INTERVAL} * 60 )) +# fi + +# if [[ -f $WANIP_LOG ]]; then + + # The log file must include more than just the header line + if [[ $(cat $WANIP_LOG | wc -l) -gt 1 ]]; then + + if [[ $(tail -1 $WANIP_LOG | awk '{print $NF}') != $(printf '%s' $(eval $WANIP_CURRENT)) ]]; then + + echo -e ${MESSAGE_STDOUT} + eval ${MAIL_SEND} + eval ${LOG_WRITE} + + fi + fi + fi +# let i++ +# done +} + +############################ + +checkWANIP diff --git a/wanip-checker@.service b/wanip-checker@.service new file mode 100644 index 0000000..a9ffa57 --- /dev/null +++ b/wanip-checker@.service @@ -0,0 +1,25 @@ +# Should be placed to /usr/lib/systemd/user/ + +#### +# Usage + +# systemctl --user enable wanip-checker@.service && \ +# systemctl --user start wanip-checker@.service && \ +# systemctl --user daemon-reload + +[Unit] +Description=WAN IPv4 checker & email sender for dynamic IPv4 server environments +After=network-online.target + +[Service] +ExecStart=/usr/bin/bash /home/%i/wanip-checker.sh + +# Restart (check) every 1 minute (60 seconds) +RestartSec=60 +Restart=always + +# Emailing fails if this is enabled +#NoNewPrivileges=true + +[Install] +WantedBy=default.target