… bananig, fruchtig, gut!

Besuch von Außerhalb

Mai 4th, 2011 Friedemann

Ich hätte es nicht für möglich gehalten, aber am gestrigen Abend um 22:52 war es soweit:  Torben machte mich darauf aufmerksam, dass die Domain bananasoft.org nicht mehr erreichbar sei. Nach einigen Recherchen in den Log-Files stellte sich heraus, dass wir Besuch aus China bekamen. Ein gewisser User / Server mit der IP-Adresse „218.57.146.156“ stattete uns einen weniger erfreulichen Besuch ab. Durch eine Kombination aus DDos und versuchtem Knacken von Passwörtern und / oder von „unbesetzten“ Passwörtern von Standard-Daemons wurde unser Server lahmgelegt…

Woher der Besuch stammte, konnte durch eine einfache „whois“-Abfrage geklärt werden:

person:       ChinaUnicom Hostmaster
nic-hdl:      CH1302-AP
e-mail:       abuse@chinaunicom.cn
address:      No.21,Jin-Rong Street
address:      Beijing,100140
address:      P.R.China
phone:        +86-10-66259940
fax-no:       +86-10-66259764
country:      CN
changed:      abuse@chinaunicom.cn 20090408
mnt-by:       MAINT-CNCGROUP
source:       APNIC

Interessant! Besuch auch China! Die wollten bestimmt nur das Beste von uns… Unseren Server! Da ich gerade keine Lust hatte denen ein Fax zu schicken oder anzurufen und mich zu beschweren (mein Chinesisch ist auch nicht gerade das Beste… quasi nicht-existent), habe ich dem Server einfach kurzerhand gesagt: „Ähm, den wollen wir nicht haben. Hau dem mit einem schönen, massiven Holzbrett mal so richtig eins vor die Glocke, wenn er das nächste mal vorbei kommt.“

Kurzum: Ich habe

iptables

dazu veranlasst einfach die IP-Adresse in Zukunft zu droppen:

iptables -I INPUT -s 218.57.146.156 -j DROP

Damit wäre die erste Gefahr zumindest vorläufig gebannt worden…

Im zweiten Schritt wurde die Überlegung angestellt, ob man überhaupt den Mitmenschen aus China das Deutsch dieser Webseite zutrauen will. Ich entschied mich für ein ganz klares „Deren Deutsch wird im Durchschnitt so gut sein wie mein Chinesisch“ und habe mich für eine verschärfte Form der Sippenhaft entschieden. Das ganze Land wird ab sofort geblockt. Auf eine Seite mehr oder weniger kommt es bei den Chinesen ja leider nicht wirklich an (Alternativ könnte man auch einen Dolmetscher damit beauftragen, Regime-kritische Texte hier zu veröffentlichen – dann würde uns die chinesische Regierung vermutlich eine Menge Arbeit abnehmen… Zurück zum Thema!).

Nach Recherchen im Netz bin ich auf folgendes bash-Skript gestoßen, das es ermöglicht, IP-Bereiche aus Ländern zu blocken, die für Spam / Scam und viele andere böse Sachen berühmt berüchtigt sind:

#!/bin/bash
### Block all traffic from AFGHANISTAN (af) and CHINA (CN). Use ISO code ###
ISO="af cn" 

### Set PATH ###
IPT=/sbin/iptables
WGET=/usr/bin/wget
EGREP=/bin/egrep

### No editing below ###
CBLIST="countrydrop"
ZONEROOT="/var/iptables"
IPTCBRESTORE="/etc/sysconfig/iptables.cb"
ALLOWPORTS=80,443
MAXZONEAGE=7
DLROOT="http://www.ipdeny.com/ipblocks/data/countries"

cleanOldRules(){
    $IPT -L $CBLIST > /dev/null 2>&1
    if [ $? = 0 ] ; then
	$IPT -D INPUT -j $CBLIST
	$IPT -D OUTPUT -j $CBLIST
	$IPT -D FORWARD -j $CBLIST
    fi
    TOPIP=`$IPT -L -n | grep Chain | cut -f 2 -d ' ' | grep '\-$CBLIST'`
    for i  in $TOPIP
    do
	$IPT -F ${i}
	$IPT -X ${i}
    done
    $IPT -X $CBLIST
}

updateZoneFiles() {
    ZONEARCH=${ZONEROOT}/arch
    mkdir -p ${ZONEARCH}
    find ${ZONEROOT} -maxdepth 1 -mindepth 1 -ctime +${MAXZONEAGE} -exec mv {} ${ZONEARCH} \;

    for c  in $ISO
    do
	# local zone file
	tDB=$ZONEROOT/$c.zone

	if [ -f $tDB ] ; then
	    printf "Zone file %s is new enough - no update required.\n" $tDB
	else
	    # get fresh zone file if it is newer than MAXZONEAGE days
	    $WGET -O $tDB $DLROOT/$c.zone
	fi
    done
    oldzones=`find ${ZONEROOT} -mindepth 1 -maxdepth 1 -type f -exec basename {} \; | cut -f 1 -d '.'`
    # Archive old zones no longer blocked
    for z in $oldzones ; do
	archme=${c}
	for c  in $ISO ; do
	    if [ $c = $z ] ; then archme="X"; fi
	done
	if [ $archme = $z ] ; then
	    mv ${archme} ${ZONEARCH}
	else
	    printf "Working from previous zone file for %s\n" ${z}
	fi
    done
}

createIPTLoadFile() {
    printf "# Generated by %s on" $0 > ${IPTCBRESTORE}
    printf "%s " `date` >> ${IPTCBRESTORE}
    printf "\n*filter\n" >> ${IPTCBRESTORE}
    # Create CBLIST chain
    printf ":$CBLIST - [0:0]\n" >> ${IPTCBRESTORE}
    printf "%s INPUT -j $CBLIST\n" "-I" > ${IPTCBRESTORE}.tmp
    printf "%s OUTPUT -j $CBLIST\n" "-I" >> ${IPTCBRESTORE}.tmp
    printf "%s FORWARD -j $CBLIST\n" "-I" >> ${IPTCBRESTORE}.tmp

    if [ "Z${ALLOWPORTS}" = "Z" ] ; then
	printf "Blocking all traffic from country - no ports allowed\n"
    else
	printf "%s $CBLIST -p tcp -m multiport ! --dports ${ALLOWPORTS} -j RETURN\n" "-I">> ${IPTCBRESTORE}.tmp
    fi

    for c  in $ISO
    do
	# local zone file
	tDB=$ZONEROOT/$c.zone

	# country specific log message
	SPAMDROPMSG="$c Country Drop"

        # Create drop chain for identified packets
	CBLISTDROP=${c}-${CBLIST}-DROP
	printf ":${CBLISTDROP} - [0:0]\n" >> ${IPTCBRESTORE}
	printf "%s ${CBLISTDROP} -j LOG --log-prefix \"$SPAMDROPMSG\"\n" "-A" >> ${IPTCBRESTORE}.tmp
	printf "%s ${CBLISTDROP} -j DROP\n" "-A" >> ${IPTCBRESTORE}.tmp

	# Load IP ranges into chains correlating to first octet
	BADIPS=$(egrep -v "^#|^$" $tDB)
	for ipblock in $BADIPS
	do
	    topip=`echo $ipblock | cut -f 1 -d '.'`
	    chainExists=`grep -c :${topip}-${CBLIST} ${IPTCBRESTORE}`
	    if [ $chainExists = 0 ] ; then
		printf "Creating chain for octet %s\n" ${topip}
		printf ":$topip-$CBLIST - [0:0]\n" >> ${IPTCBRESTORE}
		sip=${topip}.0.0.0/8
		printf "%s $CBLIST -s ${sip} -j $topip-$CBLIST\n" "-A" >> ${IPTCBRESTORE}.tmp
	    fi
	    printf "  Adding rule for %s to chain for octet %s\n" ${ipblock} ${topip}
	    printf "%s $topip-$CBLIST -s $ipblock -j ${CBLISTDROP}\n" "-A" >> ${IPTCBRESTORE}.tmp
	done
    done
    cat ${IPTCBRESTORE}.tmp >> ${IPTCBRESTORE} && rm -f ${IPTCBRESTORE}.tmp
    printf "COMMIT\n# Completed on " >> ${IPTCBRESTORE}
    printf "%s " `date` >> ${IPTCBRESTORE}
    printf "\n" >> ${IPTCBRESTORE}
}

directLoadTables() {
    # Create CBLIST chain
    $IPT -N $CBLIST
    $IPT -I INPUT -j $CBLIST
    $IPT -I OUTPUT -j $CBLIST
    $IPT -I FORWARD -j $CBLIST

    if [ "Z${ALLOWPORTS}" = "Z" ] ; then
	printf "Blocking all traffic from country - no ports allowed\n"
    else
	$IPT -I $CBLIST -p tcp -m multiport ! --dports ${ALLOWPORTS} -j RETURN
    fi

    for c  in $ISO
    do
	# local zone file
	tDB=$ZONEROOT/$c.zone

	# country specific log message
	SPAMDROPMSG="$c Country Drop"

        # Create drop chain for identified packets
	CBLISTDROP=${c}-${CBLIST}-DROP
	$IPT -N ${CBLISTDROP}
	$IPT -A ${CBLISTDROP} -j LOG --log-prefix "$SPAMDROPMSG"
	$IPT -A ${CBLISTDROP} -j DROP

	# Load IP ranges into chains correlating to first octet
	BADIPS=$(egrep -v "^#|^$" $tDB)
	for ipblock in $BADIPS
	do
	    topip=`echo $ipblock | cut -f 1 -d '.'`
	    $IPT -L $topip-$CBLIST > /dev/null 2>&1
	    if [ $? = 1 ] ; then
		printf "Creating chain for octet %s\n" ${topip}
		$IPT -N $topip-$CBLIST
		sip=${topip}.0.0.0/8
		$IPT -A $CBLIST -s ${sip} -j $topip-$CBLIST
	    fi
	    printf "  Adding rule for %s to chain for octet %s\n" ${ipblock} ${topip}
	    $IPT -A $topip-$CBLIST -s $ipblock -j ${CBLISTDROP}
	done
    done
}

loadTables() {
    createIPTLoadFile
    ${IPT}-restore -n ${IPTCBRESTORE}
    #directLoadTables
}

# create a dir
[ ! -d $ZONEROOT ] && /bin/mkdir -p $ZONEROOT

# clean old rules
cleanOldRules

# update zone files as needed
updateZoneFiles

# create a new iptables list
loadTables

exit 0

Quelle: Kommentar von David Picard weiter unten

In diesem Codeschnipsel würden die Afghanen gleich mit ausgesperrt. Wir lassen natürlich die Afghanen weiter unseren hochinteressanten Blogeinträge lesen. Sie haben uns ja nichts getan.

Das Skript wird nun übrigens wöchentlich bei uns ausgeführt und aktualisiert dann die zu blockenden IP-Adressen. Ein entsprechnder Cronjob wurde auch angelegt:

@weekly bash /path/to/bad_ip_iptables.sh

Ich hoffe einfach mal, dass wir nun – erstmal – vor Hackern und Möchtegernhackern verschont bleiben.

Bis demnächst!

Friedemann

4 Responses to “Besuch von Außerhalb”

  1. Sehr geil ^^

  2. […] Nachdem ich mich in letzter Zeit mit so interessanten Sachen wie dem TOR-Projekt auseinandergesetzt (und lieben gelernt habe!), habe ich mich dazu entschlossen, den lieben Chinesen wieder Zugang zu unserer Seite zu gewähren, da vermutlich “nur” ein Scriptkiddie unterwegs war. Und da Sippenhaftung nun wirklich nicht mehr zeitgemäß ist, ist die Sperre (vorläufig) wieder entfernt worden. Sollte der Server wieder in die Knie gehen, so weiß ich ja, welche Befehle ich eingeben muss, um die entsprechenden Individuen auszusperren. […]

  3. […] und anderen Ländern per iptables zu blocken. Dazu habe ich folgendes Script angelegt (Quelle: bananasoft.org): #!/bin/bash ### Block all traffic from AFGHANISTAN (af) and CHINA (CN). Use ISO code ### […]

  4. Hi,
    das Script funktioniert bei mir nicht mehr. Muss bei der aktuellen Debian Jessie Version was angepasst werden?
    Fehler:

    „cut: Trenner muss ein einzelnes Zeichen sein
    „cut –help“ liefert weitere Informationen.
    iptables: No chain/target/match by that name.
    „Zone„Zonecut: Trenner muss ein einzelnes Zeichen sein
    „cut –help“ liefert weitere Informationen.
    find: Prozeß „basename“ wurde durch das Signal 13 abgebrochen.
    find: Prozeß „basename“ wurde durch das Signal 13 abgebrochen.

Leave a Reply

I accept that my given data and my IP address is sent to a server in the USA only for the purpose of spam prevention through the Akismet program.More information on Akismet and GDPR.