117 lines
3.5 KiB
Bash
Executable file
117 lines
3.5 KiB
Bash
Executable file
#!/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 <remote_host_fqdn>"
|
|
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
|