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.