Listen von blocklist in eigene Firewall importieren

Anleitungen zu Fail2Ban, blocklist.de und x-arf
Antworten
Benutzeravatar
Martin
Beiträge: 397
Registriert: 14. Sep 2010, 11:54
Kontaktdaten:

Listen von blocklist in eigene Firewall importieren

Beitrag von Martin » 12. Nov 2011, 21:05

Hallo,

ein User von blocklist, an dieser Stelle noch mal ein recht herzliches Dankeschön!, hat uns ein Skript zur Verfügung gestellt, worüber man als Cronjob die aktuellen Listen von blocklist abholen und in die eigene Firewall importieren kann:

Code: Alles auswählen

#!/bin/bash
IPT="/sbin/iptables"
#WARNING !!!!READ THE FILE!!!!
#Get Blocklist from blocklist.de
#rember to use cronjob
#use all,ssh,mail,apache,ftp,asterisk,bots
#see http://blocklist.de for more info.
ID=all
URL=https://www.blocklist.de/lists/$ID.txt -O /etc/blocked.fw
clear
echo "Starting IPv4 Wall..."
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X
modprobe ip_conntrack

BADIPS=$(egrep -v -E "^#|^$" /etc/blocked.fw)
PUB_IF="eth0"

#unlimited
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# DROP all incomming traffic
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

# block all bad ips
for ip in $BADIPS
do
    $IPT -A INPUT -s $ip -j DROP
    $IPT -A OUTPUT -d $ip -j DROP
done

# sync
$IPT -A INPUT -i ${PUB_IF} -p tcp ! --syn -m state --state NEW  -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Drop Syn"
$IPT -A INPUT -i ${PUB_IF} -p tcp ! --syn -m state --state NEW -j DROP

# Fragments
$IPT -A INPUT -i ${PUB_IF} -f  -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fragments Packets"
$IPT -A INPUT -i ${PUB_IF} -f -j DROP

# block bad stuff
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL ALL -j DROP

$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL NONE -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "NULL Packets"
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL NONE -j DROP # NULL packets

$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "XMAS Packets"
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP #XMAS

$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags FIN,ACK FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fin Packets Scan"
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags FIN,ACK FIN -j DROP # FIN packet scans

$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

# Allow full outgoing connection but no incomming stuff
$IPT -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#// allow Services
#SSH
$IPT -A INPUT -p tcp --destination-port 22 -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 22 -j ACCEPT
#OPENVPN
#$IPT -A INPUT -p tcp --destination-port 943 -j ACCEPT
#$IPT -A OUTPUT -p tcp --sport 943 -j ACCEPT
#SMTP
#$IPT -A INPUT -p tcp --destination-port 25 -j ACCEPT
#$IPT -A OUTPUT -p tcp --sport 25 -j ACCEPT
#POP3
#$IPT -A INPUT -p tcp --destination-port 110 -j ACCEPT
#$IPT -A OUTPUT -p tcp --sport 110 -j ACCEPT
#IMAP
#$IPT -A INPUT -p tcp --destination-port 139 -j ACCEPT
#$IPT -A OUTPUT -p tcp --sport 139 -j ACCEPT
#APACHE2
#$IPT -A INPUT -p tcp --destination-port 80 -j ACCEPT
#$IPT -A OUTPUT -p tcp --sport 80 -j ACCEPT

#// Drop/block Services
#SMB
$IPT -A INPUT -p tcp -i eth0 --dport 137:139 -j REJECT
$IPT -A INPUT -p udp -i eth0 --dport 137:139 -j REJECT
#PING
$IPT -A OUTPUT -p icmp --icmp-type echo-request -j DROP
#PORT SCANNING
$IPT -A INPUT -p tcp –tcp-flags ALL FIN -j DROP
$IPT -A INPUT -p tcp –tcp-flags ALL NONE -j DROP
$IPT -A INPUT -p tcp –tcp-flags ALL ALL -j DROP
$IPT -A INPUT -p tcp –tcp-flags ALL FIN,PSH,URG -j DROP

# Log everything else
# *** Required for psad ****
$IPT -A INPUT -j LOG
$IPT -A FORWARD -j LOG
$IPT -A INPUT -j DROP

# Start ipv6 firewall
# echo "Starting IPv6 Wall..."
#/root/scripts/start6.fw

exit 0
Bitte prüft ob eure eigenen Regeln dort noch hinzugefügt werden müssen, da diese sonst gelöscht werden.
Falls jemand weitere Skripte hat, kann er diese gerne hier einfügen.
Ich werden in den nächsten Wochen den Text ums Skript übersetzten.... sollte aber sonst selbsterklärend sein.

script hier downloaden
Mfg Martin
http://www.blocklist.de/de/ Fail2Ban Reporting Service

Harald
Beiträge: 5
Registriert: 17. Feb 2013, 14:47

Re: Listen von blocklist in eigene Firewall importieren

Beitrag von Harald » 18. Feb 2013, 09:37

Hallo,

ich habe das Import-Script bei mir getestet. Bei 20.000-25.000 IP-Adressen die in der Blocklist all.txt stehen, läuft das bei mir zwischen 1 und 2 Stunden. Wärend dem Lauf bekam ich Fehlermeldungen von IPTables angezeigt, u.a. "iptables: Resource temporarily unavailable". Das liegt wohl daran, dass mehrere unterschiedliche Prozesse die IPTables manipulieren. Nachdem ich fail2ban gestoppt und die IPTables initialierst habe, lief das Script jedenfalls ohne Fehler durch, allerdings immer noch mit der stattlichen Laufzeit von Stunden.

Dies hat mich dazu bewegt mir über einen etwas anderen Lösungsansatz Gedanken zu machen.

Näheres folgt in Kürze.

VG Harald

Benutzeravatar
Martin
Beiträge: 397
Registriert: 14. Sep 2010, 11:54
Kontaktdaten:

Re: Listen von blocklist in eigene Firewall importieren

Beitrag von Martin » 19. Feb 2013, 04:21

Hallo Harald,

Die Fehlermeldung kann kommen, wenn z.b. der Ram voll ist oder die Limits des Servers überschritten wurden (bei V-Servern können manchmal nur x-tausend IPs geblockt werden).
Ansonsten kann das blockieren von nur den aktuellen IPs für z.B. nur SSH/FTP/imap helfen:
viewtopic.php?f=11&t=107
Mfg Martin
http://www.blocklist.de/de/ Fail2Ban Reporting Service

Harald
Beiträge: 5
Registriert: 17. Feb 2013, 14:47

Re: Listen von blocklist in eigene Firewall importieren

Beitrag von Harald » 19. Feb 2013, 21:59

Hier ist mein Lösungsvorschlag:

Mit zu IPTables gehören auch die Programme iptables-save und iptables-restore. Das Speichern und Wiederherstellen, auch großer IP-Tables Regelsätze, dauert dabei nur Sekunden.

Hier meine Variante die all.txt zu verarbeiten.

Das Shellscript sichert zunächt die bestehenden IPTables-Regeln. Dann werden die Ketten blocklist-all-in und blocklist-all-out gelöscht, neu erstellt und
gesichert. Diese Datei wird mit dem php-script: blocklist-all.php bearbeitet, um die validierten IP-Adressen der all.txt erweitert und gespeichert.
Iptables-restore verarbeitet diese Datei und wir haben innerhalb von wenigen Sekunden die komplette Liste all.txt verarbeitet.

Code: Alles auswählen

#!/bin/bash
IPT="/sbin/iptables"
#see http://blocklist.de for more info.

# 1. Save the actual iptables ruleset
/sbin/iptables-save > iptruleset-all

# 2. Delete chain blocklist-all-in and -out
$IPT -D INPUT -p tcp -j blocklist-all-in
$IPT -F blocklist-all-in
$IPT -X blocklist-all-in
$IPT -D OUTPUT -p tcp -j blocklist-all-out
$IPT -F blocklist-all-out
$IPT -X blocklist-all-out

# 2. Create two new blank chains blocklist-all-in and -out.
$IPT -N blocklist-all-in
$IPT -A blocklist-all-in -j RETURN
$IPT -I INPUT -p tcp -j blocklist-all-in
$IPT -N blocklist-all-out
$IPT -A blocklist-all-out -j RETURN
$IPT -I OUTPUT -p tcp -j blocklist-all-out

# 3. Save this ruleset
/sbin/iptables-save > iptruleset

# 4. The php-script modifies iptruleset to iptruleset-all with blocklist.de/all.txt
/usr/bin/php blocklist-all.php
.
# 5. Restore the iptables ruleset.
/sbin/iptables-restore < iptruleset-all

exit 0
blocklist-all.php

Code: Alles auswählen

<?php

$src = file_get_contents("http://list.blocklist.de/lists/all.txt");
$arr = explode("\n",$src);
$in = "";
$out = "";

foreach($arr as $ip) {
    if(trim($ip)=="") continue;
    if(filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV4)) {
        $in .= "-A blocklist-all-in -s $ip/32 -j DROP".chr(32).chr(10);
        $out .= "-A blocklist-all-out -s $ip/32 -j DROP".chr(32).chr(10);
    }
}

$iprs = file_get_contents("iptruleset");
$arr2 = explode("\n",$iprs);

# delete COMMIT.
unset($arr2[count($arr2)-3]);

$iprs = implode("\n",$arr2);

file_put_contents("iptruleset-all", $iprs.$in.$out."COMMIT".chr(10));

?>
Das läuft bei mir seit einigen Tagen problemlos, auch mit durchlaufendem fail2ban.

VG Harald

Harald
Beiträge: 5
Registriert: 17. Feb 2013, 14:47

Re: Listen von blocklist in eigene Firewall importieren

Beitrag von Harald » 22. Feb 2013, 13:17

Heute Nacht ist der Import mit iptables-restore das erste mal gescheitert. :cry: Insgesamt sollten über 66000 Regeln importiert werden. Nach dem Entfernen der blocklist-all-out Kette, konnte der Import durchgeführt werden. Also ein Mengenproblem.

Lösung:
Ich habe das blocklist-all.php Skript etwas modifiziert. Die IP-Adressen werden jetzt vorher sortiert und gezählt wieviel ips aus einem Subnetz stammen, wird die Anzahl von $minsubcount erreicht, wird das gesamte Subnetz mit nur einer Regel geblockt. Der Einsparung ist erheblich, zumal sich der Effekt verdoppelt (-in und -out). Die Dateigröße liegt ungefähr bei der Hälfte. Diese Variante kann allerdings dazu führen, das IPs geblockt werden, die nicht in der all.txt enthalten sind. Wer das vermeiden will, kann den Wert von $minsubcount auf 254 setzen.

blocklist-all.php

Code: Alles auswählen

<?php

# wenn [1-254] oder mehr ips aus dem selben Subnetz stammen wird das gesamte Subnetz geblockt
# x.x.x.0/24
$minsubcount=230;

$src = file_get_contents("http://list.blocklist.de/lists/all.txt");
$arr = explode("\n",$src);

# wird für die Endverarbetung der Schleife benötigt
array_push($arr, "255.255.255.255");

$in = "";
$out = "";

natsort($arr);

$oldip=current($arr);
$oldiparr=explode(".",current($arr));
$c=0;
$in="";
$out="";
$insub="";
$outsub="";

$i=0;
$i1=0;
$i2=0;
$c2=0;

foreach($arr as $ip) {
    if(trim($ip)=="") continue;
        if(filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV4)) {
            $i++;
            $iparr = explode(".",$ip);
            if (($iparr[0]==$oldiparr[0]) and ($iparr[1]==$oldiparr[1]) and ($iparr[2]==$oldiparr[2])) {
                $c++;
                $c2++;
                $insub .= "-A blocklist-all-in -s $oldip/32 -j DROP".chr(32).chr(10);
                $outsub .= "-A blocklist-all-out -s $oldip/32 -j DROP".chr(32).chr(10);
            } else {
                if ($c >= $minsubcount) {
                    # gesamtes Subnetz sperren
                    $i1++;
                    $in .= "-A blocklist-all-in -s $oldiparr[0].$oldiparr[1].$oldiparr[2].0/24 -j DROP".chr(32).chr(10);
                    $out .= "-A blocklist-all-out -s $oldiparr[0].$oldiparr[1].$oldiparr[2].0/24 -j DROP".chr(32).chr(10);
                } else {
                    # einzelne ips sperren
                    $i2++;
                    if($c2 < $minsubcount) $i2=$i2+$c2;
                    $c2=0;
                    $insub .= "-A blocklist-all-in -s $oldip/32 -j DROP".chr(32).chr(10);
                    $outsub .= "-A blocklist-all-out -s $oldip/32 -j DROP".chr(32).chr(10);
                    $in .= $insub;
                    $out .= $outsub;
                }
                $c=0;
                $insub="";
                $outsub="";
            }
            $oldip=$ip;
            $oldiparr=explode(".",$ip);
        }
    }

$iprs = file_get_contents("iptruleset");
$arr2 = explode("\n",$iprs);

# delete COMMIT

unset($arr2[count($arr2)-3]);
#unset($arr2[count($arr2)-2]);

$iprs = implode("\n",$arr2);

file_put_contents("iptruleset-all", $iprs.$in.$out."COMMIT".chr(10));

# Die Differenz resultiert aus Dubletten und ggf. Subnetzten, die nicht komplett enthalten sind
$m="Gesamt: ".$i." Einzel-IPs: ".$i2." Subnetze: ".$i1." * 255 = ".($i1*255)." + ".$i2." = ".($i1*255+$i2);
syslog(LOG_NOTICE,"blocklist-all.php verarbeitet. ".$m);

?>
Happy blocking :)
Harald

Nachtrag vom 23.02.2013: hab noch ein paar Bugs aus dem Code eliminiert.
24.02.2013: Code nochmals verändert.

SnakeZZ
Beiträge: 1
Registriert: 3. Mai 2014, 19:35

Re: Listen von blocklist in eigene Firewall importieren

Beitrag von SnakeZZ » 3. Mai 2014, 19:51

Hallo!

Vielen Dank erstmal für die Scripte!
Ich habe allerdings das Gefühl, dass die Pakete bei mir nicht gedroppt werden, denn ich habe immer noch syslog-messages von Attackern mit IPs, die auf der blocklist stehen.
Ich bin leider etwas zu blöd für iptables...
Muss ich die blocklist-all-in und blocklist-all-out tables noch irgendwie in die Chains hängen?

Ein iptables -L -n sieht bei mir wie folgt aus:
Chain INPUT (policy ACCEPT)
target prot opt source destination
blocklist-all-in tcp -- 0.0.0.0/0 0.0.0.0/0
fail2ban-dovecot tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 25,465,143,220,993,110,995
fail2ban-sasl tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 25,465,143,220,993,110,995
fail2ban-postfix tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 25,465
fail2ban-apache tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443
fail2ban-ssh-ddos tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 23
fail2ban-ssh tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 23

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
blocklist-all-out tcp -- 0.0.0.0/0 0.0.0.0/0

Chain blocklist-all-in (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 1.10.236.145 0.0.0.0/0
DROP all -- 1.10.236.145 0.0.0.0/0
DROP all -- 1.11.68.242 0.0.0.0/0
DROP all -- 1.11.75.146 0.0.0.0/0
DROP all -- 1.22.44.235 0.0.0.0/0
DROP all -- 1.22.172.142 0.0.0.0/0
DROP all -- 1.23.164.38 0.0.0.0/0
[...]
DROP all -- 223.240.233.63 0.0.0.0/0
DROP all -- 223.244.233.188 0.0.0.0/0

Chain blocklist-all-out (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 1.10.236.145 0.0.0.0/0
DROP all -- 1.10.236.145 0.0.0.0/0
[...]
DROP all -- 223.240.135.60 0.0.0.0/0
DROP all -- 223.240.229.77 0.0.0.0/0
DROP all -- 223.240.233.63 0.0.0.0/0
DROP all -- 223.244.233.188 0.0.0.0/0

Chain fail2ban-apache (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0

Chain fail2ban-dovecot (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0

Chain fail2ban-postfix (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0

Chain fail2ban-sasl (1 references)
target prot opt source destination
DROP all -- 182.74.24.90 0.0.0.0/0
DROP all -- 105.237.137.36 0.0.0.0/0
DROP all -- 196.28.31.245 0.0.0.0/0
DROP all -- 188.85.27.189 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0

Chain fail2ban-ssh (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0

Chain fail2ban-ssh-ddos (1 references)
target prot opt source destination
DROP all -- 125.92.85.124 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Beste Grüße,

SnakeZZ

Virus2500@me.com
Beiträge: 8
Registriert: 26. Mai 2011, 01:54

Re: Listen von blocklist in eigene Firewall importieren

Beitrag von Virus2500@me.com » 5. Mai 2014, 23:13

Hello Leute,

kann es sein das hier das RETURN einfach zu frueh getriggert wird?

Chain blocklist-all-out (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 1.10.236.145 0.0.0.0/0
DROP all -- 1.10.236.145 0.0.0.0/0

Sollte das nicht
Chain blocklist-all-out (1 references)
target prot opt source destination
DROP all -- 1.10.236.145 0.0.0.0/0
DROP all -- 1.10.236.145 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0

so rum sein?
Schaetze mal hier gehoert bei der foreach schleife das -A gegen ein -I ausgetauscht.

lg
Mike

sk007carter
Beiträge: 2
Registriert: 30. Nov 2015, 11:31

Re: Listen von blocklist in eigene Firewall importieren

Beitrag von sk007carter » 4. Dez 2015, 12:25

Ich habe ein Script entwickelt, dass auf meinem Server nur ca. 2-3 Sekunden braucht um 30000 Chains zu verarbeiten und in die IP-Tables einzufügen.
Erforderlich ist dafür iptables-persistent. getestet wurde das ganze unter Debian. Mit ziemlicher Sicherheit ist mein kleines Tutorial aber auch auf Ubuntu übertragbar.

1. "iptables-persistent" installieren über
apt-get install iptables-persistent
2. Über
service iptables-persistent save
könnt ihr nun eure vorhandenen Chains sichern und nach bedarf aus "/etc/iptables/rules.v4" den Anfang und das Ende plus eventuell wichtiger Chains in zwei Dateien sichern. Diese können dann später vor bzw. nach den automatisch eingefügten Chains eingefügt werden. Alternativ könnt ihr auch die von mir bereitgestellten Dateien benutzen.

3. Jetzt müsst ihr das Script auf eurem Server platzieren. Ich habe das ganze in dem ordner /root/scripts/php/ abgelegt. Bei bedarf könnt ihr das aber abändern.
banlist_act.php

Code: Alles auswählen

<?php
<?php
$start_file=__DIR__."/start.txt";                               //Datei welche vor allen automatisch generierten Rules eingefügt wird
$end_file=__DIR__."/end.txt";                                   //Datei welche nach allen automatisch generierten Rules eingefügt wird
$save_file="/etc/iptables/rules.v4";
$countlog="/var/log/ban_ip_count.log";                          //In diesem Logfile wird nur eine Statistik mit Datum und der Anzahl gebannter IP-Adressen festgehalten. Wenn nic$
//$banlists[]="http://lists.blocklist.de/lists/all.txt";        //Wenn aktiviert, können alle anderen Listen auskommentiert werden.
$banlists[]="http://lists.blocklist.de/lists/ssh.txt";
$banlists[]="http://lists.blocklist.de/lists/mail.txt";
$banlists[]="http://lists.blocklist.de/lists/apache.txt";
$banlists[]="http://lists.blocklist.de/lists/imap.txt";
$banlists[]="http://lists.blocklist.de/lists/postfix.txt";
$banlists[]="http://lists.blocklist.de/lists/ftp.txt";
$banlists[]="http://lists.blocklist.de/lists/strongips.txt";
$banlists[]="http://lists.blocklist.de/lists/bruteforcelogin.txt";
//$banlists[]="http://lists.blocklist.de/lists/bots.txt";
//$banlists[]="http://lists.blocklist.de/lists/ircbot.txt";
//$banlists[]="http://lists.blocklist.de/lists/sip.txt";
//$banlists[]="/tmp/tmp_ban_ips";                                 //Eigene IP-Listen hinzufügen


//PROGRAMMSTART
$rules_start=file($start_file,FILE_IGNORE_NEW_LINES);
$rules_end=file($end_file,FILE_IGNORE_NEW_LINES);

$rules_generated=[];
$listed_ips=[];
$ips_count=0;
foreach($banlists as $banlist)
{
        $banlist_content=[];
        if(url_exists($banlist)||file_exists($banlist))$banlist_content=file($banlist,FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
        foreach($banlist_content as $ip)
        {
                if(strpos($ip,":")===false)
                {
                        if(!isset($listed_ips[$ip])) $listed_ips[$ip]=$ip;
                }
        }
}
$ips_count=count($listed_ips);
$rules=implode("\n",$rules_start)."\n";
$rules.="-A INPUT -s ".implode("/32 -j DROP\n-A INPUT -s ",$listed_ips)."/32 -j DROP\n";
$rules.=implode("\n",$rules_end);
file_put_contents($save_file,$rules);
file_put_contents($countlog,date(DATE_RFC822)." = ".$ips_count."\n",FILE_APPEND);

function url_exists($url) {
     // Version 4.x supported
     $handle   = curl_init($url);
     if (false === $handle)
     {
         return false;
     }
     curl_setopt($handle, CURLOPT_HEADER, false);
     curl_setopt($handle, CURLOPT_FAILONERROR, true);  // this works
     curl_setopt($handle, CURLOPT_HTTPHEADER, Array("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15") ); // request as $
     curl_setopt($handle, CURLOPT_NOBODY, true);
     curl_setopt($handle, CURLOPT_RETURNTRANSFER, false);
     $connectable = curl_exec($handle);
     curl_close($handle);
     return $connectable;
 }
?>
exec.sh

Code: Alles auswählen

#! /bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
php /root/scripts/php/banlist_act.php >/dev/null 2>&1
service iptables-persistent reload >/dev/null 2>&1
start.txt

Code: Alles auswählen

# Generated by iptables-save v1.4.14 on Wed Dec  2 11:17:44 2015
*security
:INPUT ACCEPT [1334:151557]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1270:191079]
COMMIT
# Completed on Wed Dec  2 11:17:44 2015
# Generated by iptables-save v1.4.14 on Wed Dec  2 11:17:44 2015
*raw
:PREROUTING ACCEPT [1334:151557]
:OUTPUT ACCEPT [1270:191079]
COMMIT
# Completed on Wed Dec  2 11:17:44 2015
# Generated by iptables-save v1.4.14 on Wed Dec  2 11:17:44 2015
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [121:7740]
:POSTROUTING ACCEPT [121:7740]
COMMIT
# Completed on Wed Dec  2 11:17:44 2015
# Generated by iptables-save v1.4.14 on Wed Dec  2 11:17:44 2015
*mangle
:PREROUTING ACCEPT [1334:151557]
:INPUT ACCEPT [1334:151557]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1270:191079]
:POSTROUTING ACCEPT [1270:191079]
COMMIT
# Completed on Wed Dec  2 11:17:44 2015
# Generated by iptables-save v1.4.14 on Wed Dec  2 11:17:44 2015
*filter
:INPUT ACCEPT [292:34713]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [295:45091]
end.txt

Code: Alles auswählen

COMMIT
# Completed on Wed Dec  2 11:17:44 2015
4. Anpassungen an den Scripten und Dateien:
- Bitte passt das Script ("banlist_act.php") bis zu der Zeile mit dem Inhalt "//PROGRAMMSTART" an eure Bedürfnisse an und speichert es ab.
- In dem Shellscript ("exec.sh") solltet ihr die PATH-Variable an euer System anpassen. Dazu gebt ihr auf der Kommandozeile
echo $PATH
ein und ändert den Wert in der Datei entsprechend ab. Außerdem solltet ihr bei bedarf den Pfad zu eurem Script anpassen.
- Die Dateien "start.txt" und "end.txt" könnt ihr nach belieben anpassen und abspeichern.
Bitte bedenkt, dass ihr bei einer Nutzung von Fail2Ban auf jeden Fall die beiden Dateien "start.txt" und "end.txt" noch anpassen müsst. seht dazu bitte in der "/etc/iptables/rules.v4" nach, die ihr bei schritt 2. erzeugt habt. Dort sollten die entsprechenden Zeilen auftauchen. Notfalls ein
service fail2ban restart
durchführen und danach erneut Schritt 2 durchführen.

5. Das Shellscript muss noch das Recht zum Ausführen bekommen. Dazu führen wir folgenden Befehl aus:
chmod 755 /root/scripts/php/exec.sh
6. Nun muss nur noch die Datei "exec.sh" in einem Chronjob aufgerufen werden (ich mache das alle 5 Minuten) und eure iptables sollten immer gut gefüllt sein! ;-)

Wenn ihr noch Verbesserungsvorschläge habt, immer her damit! ;-)

Gruß SK007

Benutzeravatar
Martin
Beiträge: 397
Registriert: 14. Sep 2010, 11:54
Kontaktdaten:

Re: Listen von blocklist in eigene Firewall importieren

Beitrag von Martin » 4. Dez 2015, 12:48

Hallo SK007, vielen Dank für dein Beitrag und Skript.
Ich hätte so aktuell nur eine Anmerkung :-)
Der Download der Listen alle 5 Minuten ist nicht nötig, da die nur alle 30 bis 60 Minuten neu generiert werden. Man könnte aber z.B. beim Curl sich den last-modified Header ausgeben lassen und vergleichen, ob er sich geändert.
Mfg Martin
http://www.blocklist.de/de/ Fail2Ban Reporting Service

sk007carter
Beiträge: 2
Registriert: 30. Nov 2015, 11:31

Re: Listen von blocklist in eigene Firewall importieren

Beitrag von sk007carter » 9. Dez 2015, 12:34

Hallo Martin,

Ich habe mir jetzt mal eben das Log-File angesehen und kann grob sagen, dass die Einträge sich in 80% verändern. Zumindest ist die Anzahl der importierten IPs unterschiedlich. Ich vermute, dass das dadurch zustande kommt, dass ich auf mehrere verschiedene Listen (momentan ausschließlich von blocklist.de) zugreife.
Außerdem bin ich da ganz ehrlich... bei 2-4 Sek. pro Import mache ich da nicht großartig rum! :D
Vermutlich könnte man es aber tatsächlich auf 10 Min. umstellen. Alleine um euren Server etwas zu entlasten. Ich will da ja nicht irgendwann bei euch auf der Blacklist landen! :lol:
Das mit CURL wäre zwar noch eine Idee, aber ich vermute, dass die Funktion dahinter relativ komplex wird, wenn mehrere Listen zum Einsatz kommen sollen. Entweder werden zu wenige IPs importiert, oder aber man müsste IPs zwischenspeichern oder abfragen, ob sie bereits gebannt sind. Die beiden letzten Möglichkeiten würden vermutlich wieder zu einer längeren Laufzeit führen.
Momentan bin ich mit dem Ergebnis aber absolut zufrieden. Seit der Aktivierung hatte ich im Prinzip nur noch einen einzigen Angriff auf meinem Webserver. Es waren zwar auch vorher durch meine Sicherheitsregeln verhältnismäßig wenige (2-3 pro Tag), aber so wenige wie jetzt hatte ich noch nie! ;)

Antworten