#!/bin/bash # This script is used to automatically generate the GRE tunnel between two hosts based on FQDN # CONSTANTS # If not defined in the environment, the following variables will be used if [[ -z $GRE_TUNNEL_NAME ]]; then GRE_TUNNEL_NAME="gre1" GRE_LOCAL_IP="45.13.XX.XX" GRE_LAN_IP_4="192.168.100.1/24" GRE_LAN_IP_6="2a0e:fd45:2a0c::1/64" FQDN="remote.example.com" fi # FUNCTIONS function usage() { echo "Usage: $0 " exit 1 } function check_root() { if [[ $EUID -ne 0 ]]; then echo "This script must be run as root" exit 1 fi } function get_current_ip() { # Get the dst IP on the GRE tunnel CURRENT_IP=$(ip addr show $GRE_TUNNEL_NAME | grep -Po 'peer \K[\d.]+') if [[ -z $CURRENT_IP ]]; then echo "GRE tunnel is down or not configured" # Create the GRE tunnel CURRENT_IP="" fi } function get_remote_ip() { # Get the remote IP on the GRE tunnel REMOTE_IP=$(dig +short $FQDN | tail -n1) if [[ -z $REMOTE_IP ]]; then echo "Failed to resolve the remote host FQDN ($FQDN)" exit 1 fi } function check_gre_tunnel() { # Check if the GRE tunnel is up if [[ -z $CURRENT_IP ]]; then echo "GRE tunnel is down or not configured" # Return 1 to indicate that the GRE tunnel is down return 1 fi } function configure_gre_tunnel() { # Configure the GRE tunnel # Delete the GRE tunnel if it exists echo "LOG - $(date) - REMOTE IP: $REMOTE_IP" echo "ip link del $GRE_TUNNEL_NAME" ip link del $GRE_TUNNEL_NAME # Create the GRE tunnel echo "ip link add $GRE_TUNNEL_NAME type gre remote $REMOTE_IP local $GRE_LOCAL_IP ttl 255" ip link add $GRE_TUNNEL_NAME type gre remote $REMOTE_IP local $GRE_LOCAL_IP ttl 255 echo "ip link set $GRE_TUNNEL_NAME up" ip link set $GRE_TUNNEL_NAME up echo "ip addr add $GRE_LAN_IP_4 dev $GRE_TUNNEL_NAME" ip addr add $GRE_LAN_IP_4 dev $GRE_TUNNEL_NAME echo "ip addr add $GRE_LAN_IP_6 dev $GRE_TUNNEL_NAME" ip addr add $GRE_LAN_IP_6 dev $GRE_TUNNEL_NAME } function check_remote_ip() { # Check if the remote IP is the same as the one configured on the GRE tunnel if [[ $REMOTE_IP == $CURRENT_IP ]]; then echo "GRE tunnel is already configured with the right remote IP" # Return 0 to indicate that the GRE tunnel is already configured exit 0 else echo "GRE tunnel is configured with the wrong remote IP" configure_gre_tunnel echo "Updated GRE tunnel with the right remote IP" exit 0 fi } # MAIN function main() { check_root echo "LOG - $(date) - Starting autogre.sh" echo "LOG - $(date) - FQDN: $FQDN" echo "LOG - $(date) - GRE_TUNNEL_NAME: $GRE_TUNNEL_NAME" echo "LOG - $(date) - GRE_LOCAL_IP: $GRE_LOCAL_IP" echo "LOG - $(date) - GRE_LAN_IP_4: $GRE_LAN_IP_4" echo "LOG - $(date) - GRE_LAN_IP_6: $GRE_LAN_IP_6" echo "LOG - $(date) - Checking if the GRE tunnel is configured" get_current_ip echo "LOG - $(date) - Checking if the remote IP is the same as the one configured on the GRE tunnel" get_remote_ip echo "LOG - $(date) - Checking if the GRE tunnel is up" if check_gre_tunnel ; then echo "LOG - $(date) - GRE tunnel is up" check_remote_ip echo "LOG - $(date) - GRE tunnel is configured with the right remote IP" else echo "LOG - $(date) - GRE tunnel is down" configure_gre_tunnel echo "LOG - $(date) - Updated GRE tunnel with the right remote IP" fi } main