#!/bin/bash # T&M Hansson IT AB © - 2020, https://www.hanssonit.se/ # Copyright © 2020 Simon Lindner (https://github.com/szaimen) true SCRIPT_NAME="GeoBlock" SCRIPT_EXPLAINER="This script lets you restrict access to your server, only allowing the countries you choose." # shellcheck source=lib.sh source /var/scripts/fetch_lib.sh || source <(curl -sL https://raw.githubusercontent.com/nextcloud/vm/master/lib.sh) # Check for errors + debug code and abort if something isn't right # 1 = ON # 0 = OFF DEBUG=0 debug_mode # Must be root root_check # Check if it is already configured if ! grep -q "^#Geoip-block" /etc/apache2/apache2.conf then # Ask for installing install_popup "$SCRIPT_NAME" else # Ask for removal or reinstallation reinstall_remove_menu "$SCRIPT_NAME" # Removal find /var/scripts -type f -regex \ "$SCRIPTS/202[0-9]-[01][0-9]-Maxmind-Country-IPv[46]\.dat" -delete if is_this_installed jq then apt purge jq -y fi if is_this_installed libapache2-mod-geoip then a2dismod geoip apt purge libapache2-mod-geoip -y fi apt autoremove -y sed -i "/^#Geoip-block-start/,/^#Geoip-block-end/d" /etc/apache2/apache2.conf check_command systemctl restart apache2 # Show successful uninstall if applicable removal_popup "$SCRIPT_NAME" fi # Install needed tools install_if_not libapache2-mod-geoip # Enable apache mod check_command a2enmod geoip rewrite check_command systemctl restart apache2 # Download newest dat files find /var/scripts -type f -regex \ "$SCRIPTS/202[0-9]-[01][0-9]-Maxmind-Country-IPv[46]\.dat" -delete get_newest_dat_files # Restrict to countries and/or continents choice=$(whiptail --title "$TITLE" --checklist \ "Do you want to restrict to countries and/or continents? $CHECKLIST_GUIDE\n\n$RUN_LATER_GUIDE" "$WT_HEIGHT" "$WT_WIDTH" 4 \ "Countries" "" ON \ "Continents" "" ON 3>&1 1>&2 2>&3) if [ -z "$choice" ] then exit 1 fi # Countries if [[ "$choice" = *"Countries"* ]] then # Download csv file if ! curl_to_dir "https://dev.maxmind.com/static/csv/codes" "iso3166.csv" "$SCRIPTS" then msg_box "Could not download the iso3166.csv file. Please report this to $ISSUES" exit 1 fi # Get country names COUNTRY_NAMES=$(sed 's|.*,"||;s|"$||' "$SCRIPTS/iso3166.csv") mapfile -t COUNTRY_NAMES <<< "$COUNTRY_NAMES" # Get country codes COUNTRY_CODES=$(sed 's|,.*||' "$SCRIPTS/iso3166.csv") mapfile -t COUNTRY_CODES <<< "$COUNTRY_CODES" # Remove the csv file since no longer needed check_command rm "$SCRIPTS/iso3166.csv" # Check if both arrays match if [ "${#COUNTRY_NAMES[@]}" != "${#COUNTRY_CODES[@]}" ] then msg_box "Somethings is wrong. The names length is not equal to the codes length. Please report this to $ISSUES" exit 1 fi # Create checklist args=(whiptail --title "$TITLE - $SUBTITLE" --separate-output --checklist \ "Please select all countries that shall have access to your server. All countries that aren't selected will *not* have access to your server. \ To allow them you have to choose the specific continent. $CHECKLIST_GUIDE\n\n$RUN_LATER_GUIDE" "$WT_HEIGHT" "$WT_WIDTH" 4) count=0 while [ "$count" -lt "${#COUNTRY_NAMES[@]}" ] do args+=("${COUNTRY_CODES[$count]}" "${COUNTRY_NAMES[$count]}" OFF) ((count++)) done # Let the user choose the countries selected_options=$("${args[@]}" 3>&1 1>&2 2>&3) if [ -z "$selected_options" ] then unset selected_options fi fi # Continents if [[ "$choice" = *"Continents"* ]] then # Restrict to continents choice=$(whiptail --title "$TITLE" --separate-output --checklist \ "Please choose all continents that shall have access to your server. All countries on not selected continents will not have access to your server \ if you haven't explicitly chosen them in the countries menu before. $CHECKLIST_GUIDE\n\n$RUN_LATER_GUIDE" "$WT_HEIGHT" "$WT_WIDTH" 4 \ "AF" "Africa" OFF \ "AN" "Antarctica" OFF \ "AS" "Asia" OFF \ "EU" "Europe" OFF \ "NA" "North America" OFF \ "OC" "Oceania" OFF \ "SA" "South America" OFF 3>&1 1>&2 2>&3) if [ -z "$choice" ] then unset choice fi else unset choice fi # Exit if nothing chosen if [ -z "$selected_options" ] && [ -z "$choice" ] then exit 1 fi # Convert to array if [ -n "$selected_options" ] then mapfile -t selected_options <<< "$selected_options" fi if [ -n "$choice" ] then mapfile -t choice <<< "$choice" fi GEOIP_CONF="#Geoip-block-start - Please don't remove or change this line GeoIPEnable On GeoIPDBFile /usr/share/GeoIP/GeoIP.dat GeoIPDBFile /usr/share/GeoIP/GeoIPv6.dat \n" for continent in "${choice[@]}" do GEOIP_CONF+=" SetEnvIf GEOIP_CONTINENT_CODE $continent AllowCountryOrContinent\n" GEOIP_CONF+=" SetEnvIf GEOIP_CONTINENT_CODE_V6 $continent AllowCountryOrContinent\n" done for country in "${selected_options[@]}" do GEOIP_CONF+=" SetEnvIf GEOIP_COUNTRY_CODE $country AllowCountryOrContinent\n" GEOIP_CONF+=" SetEnvIf GEOIP_COUNTRY_CODE_V6 $country AllowCountryOrContinent\n" done GEOIP_CONF+=" Allow from env=AllowCountryOrContinent Allow from 127.0.0.1/8 Allow from 192.168.0.0/16 Allow from 172.16.0.0/12 Allow from 10.0.0.0/8 Order Deny,Allow Deny from all #Geoip-block-end - Please don't remove or change this line" # Write everything to the file echo -e "$GEOIP_CONF" >> /etc/apache2/apache2.conf check_command systemctl restart apache2 msg_box "GeoBlock was successfully configured" exit