PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Script für iptables


Cerberus
04.04.2013, 12:52
Aus gegebenem Anlass habe ich mal ein kleines Script gebaut, mit welchem man aus den Log-Files IP-Adressen "rausfummelt" und diese dann per Block in die iptables reinschreibt ...

#!/bin/bash

#Settings und Einstellungen
log_file="/var/log/nginx/access.log"
such_str="w00tw00t"
count=0

# in {print $1} steht die Position der IP-Adresse :)
for ip in `cat $log_file | grep $such_str | awk '{print $1}' | sed 's/]//g' | sort -ug` ; do
count=$[$count+1]

#Prüfen, ob die IP schon enthalten ist
if [ "iptables -L INPUT -v -n | grep '$ip'" == "" ]; then
iptables -I INPUT -s $ip -j DROP
iptables -I OUTPUT -s $ip -j DROP

echo $ip hinzugefügt
else
echo $ip gefunden
fi
done

#Abschliessende Statusmitteilung ausgeben
if [ "$count" -gt 0 ]; then
echo $count Einträge bearbeitet
else
echo keine Einträge
fi

Oben im config-Teil die entsprechende LOG angeben und die $-Variable in der FOR-Schleife anpassen.
Den entsprechenden Suchstring nicht vergessen....
Dann sollte das auch sauber laufen ....

bl0bb
04.04.2013, 13:04
Wäre interessant zu erfahren wo der Nutzen liegt. Ich meine wenn ich die IP kenne, brauche ich die nicht in einer Log suchen lassen ;)

Cerberus
04.04.2013, 13:26
ich habe das gebaut, weil auf dem Server um den es geht zu viele Anfragen von denen kommen ...
und damit wäre ich im "Hand-Modus" Stunden beschäftigt ....

so bügelt das Script drüber und fertig is die Lauge

bl0bb
04.04.2013, 18:02
Ach seh grad, du suchst ja gar nicht mit einer IP als Suchstring, sondern nach diesem w00tw00t. Hehe, dachte das is nur deine Art von "Platzhalter" ;)
OK, dann sehe ich jetzt den Sinn :)


EDIT
Wußte das mir w00tw00t bekannt vorkommt. Habe mal eben in meine Firewall geschaut. Einfach diese Regel adden und schon ist das Skript obsolet.

$IPT -A INPUT -d <EIGENE_SERVER_IP> -p tcp --dport 80 -m string --to 70 --algo bm --string 'GET /w00tw00t.at.ISC.SANS.' -j DROP

Flori12345
25.09.2019, 10:22
Moin,
müsste das Skript die Ip´s nicht eigentlich automatich sperren ?
bei mir steht immer nur gefunden, die IP ist aber noch net gesperrt.

tantetoni2
26.09.2019, 14:09
Warum so unbequem?

Jedes mal ins File rein um nach was bestimmten zu suchen ist doch kacke^^

#!/bin/bash

# IP tables
IPT=$(which iptables)
IPT6=$(which ip6tables)


# Settings und Einstellungen
log_file="/var/log/nginx/access.log"
such_str=${1:-} #first bash param file.sh param1
count=0

[ -z "$such_str" ] && echo "missing search string" && exit 0;

# in {print $1} steht die Position der IP-Adresse :)
for ip in `cat $log_file | grep "$such_str" | awk '{print $1}' | sed 's/]//g' | sort -ug` ; do
((++count)) # increment

# IPv6 check
if [[ ! -z "$IPT6" && "$ip" =~ ^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$ ]]; then
IPT="$IPT6"
fi

echo "using $IPT"

if [ -z $($IPT -L INPUT -v -n | grep '$ip') ]; then
$IPT -I INPUT -s $ip -j DROP
$IPT -I OUTPUT -s $ip -j DROP

echo "$ip hinzugefügt"
else
echo "$ip gefunden"
fi

done

#Abschliessende Statusmitteilung ausgeben
([ "$count" -gt 0 ] && echo "$count Einträge bearbeitet") || echo "keine Einträge"

call ./script.sh suchstring oder wenn leerzeichen ./script.sh "wort1 wort2"

Ein paar Punkte :D


Bei echos ohne Quote kann einiges kaputt gehen
increment in bach geht unter anderem so ((++var))
besser mit [ -z "$var" ] prüfen ob eine var leer ist == ist ein alias für = dem Stringvergleich in Bash, kann also unter bestimmten Voraussetzungen wenn man Zahlen erwartet daneben gehen
mit zb ${1:-"default"} kann man das erster Argument abfragen, wenn nicht gesetzt dann nimm den default wert nach :- ${2:-"default2"} wäre zb für Argument 2



IPv6 haste vergessen ;)

Flori12345
28.10.2019, 22:27
@tantetoni2 (http://www.netvision-technik.de/forum/member.php?u=398) kannst du dir das nochmal bitte anschauen.
Die IPs die schon gesperrt wurden, werden bei nochmaligen ausführen des scriptes nochmal gesperrt.
is das normal oder soll das so sein



lg