Besuch von Außerhalb
Mai 4th, 2011 FriedemannIch 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
Mai 14th, 2011 at 21:36
Sehr geil ^^
Juni 11th, 2011 at 00:35
[…] 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. […]
Oktober 13th, 2011 at 20:15
[…] 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 ### […]
Februar 17th, 2017 at 20:36
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.