!/bin/bash¶
Configuration¶
API_KEY="" # Laisse vide pour 50k requêtes/mois gratuit sur ipinfo.io OUTPUT_DIR="/home/loic/ban-reports" mkdir -p $OUTPUT_DIR
echo "=== Extraction des IPs bannies ==="
Récupérer toutes les IPs bannies par jail¶
ALL_IPS="" for jail in $(sudo fail2ban-client status | grep 'Jail list:' | sed 's/.://;s/,//g'); do IPS=$(sudo fail2ban-client status $jail | grep 'Banned IP' | sed 's/.://;s/^ //') if [ ! -z "$IPS" ]; then echo "Jail $jail : $IPS" ALL_IPS="$ALL_IPS $IPS" fi done
Dédupliquer¶
UNIQUE_IPS=$(echo $ALL_IPS | tr ' ' '\n' | sort -u | grep -v '^$') TOTAL=$(echo "$UNIQUE_IPS" | wc -l) echo "" echo "Total IPs uniques bannies : $TOTAL" echo ""
Fichiers temporaires¶
COUNTRY_FILE="$OUTPUT_DIR/countries.txt" ORG_FILE="$OUTPUT_DIR/orgs.txt" CITY_FILE="$OUTPUT_DIR/cities.txt"
$COUNTRY_FILE $ORG_FILE $CITY_FILE
echo "=== Géolocalisation des IPs ===" COUNT=0 for ip in $UNIQUE_IPS; do COUNT=$((COUNT+1)) echo -n "[$COUNT/$TOTAL] $ip ... "
if [ -z "$API_KEY" ]; then
INFO=$(curl -s "https://ipinfo.io/$ip/json")
else
INFO=$(curl -s "https://ipinfo.io/$ip?token=$API_KEY")
fi
COUNTRY=$(echo "$INFO" | jq -r '.country // "Unknown"')
ORG=$(echo "$INFO" | jq -r '.org // "Unknown"')
CITY=$(echo "$INFO" | jq -r '.city // "Unknown"')
echo "$COUNTRY" >> $COUNTRY_FILE
echo "$ORG" >> $ORG_FILE
echo "$CITY" >> $CITY_FILE
echo "$COUNTRY | $CITY | $ORG"
sleep 0.2 # Éviter le rate limiting
done
echo "" echo "=== RAPPORT FINAL ===" echo "" echo "--- Top 10 Pays ---" sort $COUNTRY_FILE | uniq -c | sort -rn | head -10
echo "" echo "--- Top 10 Organisations ---" sort $ORG_FILE | uniq -c | sort -rn | head -10
echo "" echo "--- Top 10 Villes ---" sort $CITY_FILE | uniq -c | sort -rn | head -10
echo "" echo "Rapport complet sauvegardé dans $OUTPUT_DIR"