[Proof of Concept] Ad Blocking durch Freetz!

meilon

Neuer User
Mitglied seit
5 Jan 2006
Beiträge
149
Punkte für Reaktionen
0
Punkte
16
Hallo!

Ich denke viele von uns nutzen irgendwelche Ad Block Software auf ihren Rechnern (ich nutze Ad Block Plus in Firefox und Kaspersky Internet Security bietet auch ein klein wenig weiteren Schutz), aber an meinem iPhone ist das nur umständlich und vor allem nur mit einem Jailbreak möglich. Zudem wäre es ja praktisch, wenn einfach alle Clients ohne Konfiguration keine nervige Werbung sehen.

Vor einiger Zeit gab es einen Artikel bei Lifehacker, der mich auf die Idee brachte. Das verlinkte Script dort ist für die Tomato gemoddeten Linksys WRT54G etc. Router, aber nach ein paar Quick & Dirty Anpassungen funktioniert es auch auf meinem Speedport.

Hier erstmal mein modifiziertes Script:
Code:
#!/bin/sh
## Adblock script [Version 2.1 | 08 July 2008 | 3778 bytes]
##
## Created by Adrian Jon Kriel: root-AT-extremecooling-DOT-org
##
## Freetz Mod by meilon
##
## 0 = disable
## 1 = enable
## (1) = default value
## optimising of dnsmasq, (1)
eval OPTDNSMASQ="1"
## MVPS HOSTS ~18,500 lines, 680 Kbyte, (1)
eval MVPSSOURCE="1"
## pgl.yoyo.org ~2,200 lines, 68 Kbyte, (1)
eval PGLSOURCE="1"
## hosts-file.net ~53,000 lines, 1.5 Mbyte, (0)
eval HSFSOURCE="0"
## Hosts File Project ~102,000 lines, 3.0 Mbyte ***6+mb free memory***, (0)
eval HFPSOURCE="0"
##
## varibles
## location of temp file, (/tmp/hosts)
eval GENFILE="/var/tmp/hosts"
## redirect ip, (0.0.0.0)
eval REDIRECTIP="0.0.0.0"
## sources
eval MVPSOURCEFILE="http://www.mvps.org/winhelp2002/hosts.txt"
eval PGLSOURCEFILE="http://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts"
eval HSFSOURCEFILE="http://www.it-mate.co.uk/downloads/hosts.txt"
eval HFPSOURCEFILE="http://hostsfile.mine.nu/Hosts"

if ping -c 1 google.de ; then

eval GOTSOURCE="0"
echo "" > $GENFILE
## download 
if [ "$MVPSSOURCE" = "1" ]  ; then
if wget $MVPSOURCEFILE -O - >> $GENFILE ; then
logger ADBLOCK Downloaded $MVPSOURCEFILE
eval GOTSOURCE="1"
else
logger ADBLOCK Failed $MVPSOURCEFILE
fi
fi
if [ "$PGLSOURCE" = "1" ]  ; then
if wget $PGLSOURCEFILE -O - >> $GENFILE ; then
logger ADBLOCK Load $PGLSOURCEFILE
eval GOTSOURCE="1"
else
logger ADBLOCK Fail $PGLSOURCEFILE
fi
fi
if [ "$HSFSOURCE" = "1" ]  ; then
if wget $HSFSOURCEFILE -O - >> $GENFILE ; then
logger ADBLOCK load $HSFSOURCEFILE
eval GOTSOURCE="1"
else
logger ADBLOCK Fail $HSFSOURCEFILE
fi
fi
if [ "$HFPSOURCE" = "1" ]  ; then
if wget $HFPSOURCEFILE -O - >> $GENFILE ; then
logger ADBLOCK Load $HFPSOURCEFILE
eval GOTSOURCE="1"
else
logger ADBLOCK Fail $HFPSOURCEFILE
fi
fi

if [ "$GOTSOURCE" = "1" ]; then
logger ADBLOCK Got Source Files
#FREE MEMORY!
/etc/init.d/rc.dnsmasq stop
killall -9 dnsmasq
logger ADBLOCK Ignor Fail Safe
##strip source file
sed -i -e '/^[0-9A-Za-z]/!d' $GENFILE
sed -i -e '/%/d' $GENFILE
sed -i -e 's/[[:cntrl:][:blank:]]//g' $GENFILE
sed -i -e 's/^[ \t]*//;s/[ \t]*$//' $GENFILE

## dnsmasq, sanitize, optimised
sed -i -e 's/[[:space:]]*\[.*$//'  $GENFILE
sed -i -e 's/[[:space:]]*\].*$//'  $GENFILE
sed -i -e '/[[:space:]]*#.*$/ s/[[:space:]]*#.*$//'  $GENFILE		
sed -i -e '/^$/d' $GENFILE
sed -i -e '/127.0.0.1/ s/127.0.0.1//'  $GENFILE		
sed -i -e '/^www[0-9]./ s/^www[0-9].//'  $GENFILE		
sed -i -e '/^www./ s/^www.//' $GENFILE
## remove duplicates (resource friendly)	
cat $GENFILE | sort -u > $GENFILE.new
mv $GENFILE.new $GENFILE
## format
sed -i -e 's|$|/'$REDIRECTIP'|' $GENFILE
sed -i -e 's|^|address=/|' $GENFILE
## load values from dnsmasq config
cat /var/mod/etc/dnsmasq.conf >> $GENFILE
## optimise dnsmasq
if [ "$OPTDNSMASQ" = "1" ] ; then
cat >> $GENFILE <<EOF
cache-size=2048
log-async=5
EOF
fi

## remove/whitelist websites
## removes 3 websites (aa.com, bb.com, cc.com) 
## remove the # and edit the website urls.
sed -i -e '/aa.com/d' $GENFILE
sed -i -e '/bb.com/d' $GENFILE
sed -i -e '/cc.com/d' $GENFILE

## Start dnsmasq with the new blacklist
export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/mod/sbin:/mod/bin:/mod/usr/sbin:/mod/usr/bin
export LD_LIBRARY_PATH=/mod/lib

DAEMON=dnsmasq

. /etc/init.d/modlibrc

# Do we have a UPnP server (igdd) or was ist stripped from the firmware?
_igdd=$(basename $(which igdd) 2> /dev/null)
# Does a multid option to start without UPnP device (-u) exist?
_multid_upnp=$(/sbin/multid -? 2>&1 | grep upnp)
# Set multid "no UPnP" option, if
#   a) it has the parameter at all AND
#   b) igdd binary does *not* exist
[ "$_multid_upnp" ] && [ ! "$_igdd" ] && MULTIDPARAM="-u"
local lease

modlib_addgroup nobody
modlib_adduser nobody -s /bin/false -D -S -H -G nobody -g 'nobody'

(
		if [ -x "/tmp/flash/${DAEMON}_conf" ]; then
				/tmp/flash/${DAEMON}_conf
		else
				/mod/etc/default.$DAEMON/${DAEMON}_conf
		fi

		if [ -r "/tmp/flash/${DAEMON}.extra" ]; then
				cat /tmp/flash/${DAEMON}.extra
		fi
) > /mod/etc/$DAEMON.conf

echo -n 'Starting dnsmasq...'
if [ "$1" != "nomultid" ]; then
		multid -s > /dev/null 2>&1
fi
OPTIONS="$DNSMASQ_OPTIONS"
if [ "$DNSMASQ_DNS_PORT" ]; then
		OPTIONS="$OPTIONS -p \"$DNSMASQ_DNS_PORT\""
fi
eval "$DAEMON $OPTIONS --conf-file=$GENFILE"
exitval=$?

if [ "$1" != "nomultid" ]; then
		multid $MULTIDPARAM > /dev/null 2>&1
		# protect against dnsmasq crash
		[ -f /var/tmp/avm-resolv.conf -a ! -L /var/tmp/avm-resolv.conf ] &&
				mv /var/tmp/avm-resolv.conf /var/tmp/resolv.conf
		ln -s resolv.conf /var/tmp/avm-resolv.conf
fi

if [ ! -L "/var/flash/multid.leases" -a "$DNSMASQ_DHCP" = "yes" ]; then
		rm -f /var/flash/multid.leases
		touch /var/tmp/multid.leases
		ln -s /var/tmp/multid.leases /var/flash/multid.leases
fi

# this could pose problems when a client comes too fast
for lease in /var/tmp/multid.leases /var/tmp/dnsmasq.leases; do
		if [ -f $lease ]; then
				chmod 0664 $lease
				chown root:nobody $lease
		fi
done

if [ "$exitval" -eq 0 ]; then
		echo 'done.'
else
		echo 'failed.'
		exit $exitval
fi

## dev info
logger ADBLOCK Unique Hosts Blocked $(awk 'END { print NR }' $GENFILE)
else
logger ADBLOCK Error Not Downloaded
fi
else
logger ADBLOCK Error No Internet
fi
## remove the generated files
rm $GENFILE*
## the end

Im Grunde werden von vorgefertigten hosts-Listen kopien auf die Freetz geladen und diese dann als Ersatzhosts verwendet. Beim Auflösen einer der "bösen" Domains wird 0.0.0.0 zurück gesendet, wodurch erst gar keine Verbindung zum "bösen" Host aufgebaut wird.

Leider habe ich nur Basiswissen, was Linux Scripting angeht, daher auch der "geklaute" Start-Teil aus der /etc/init.d/rs.dnsmasq. Eine direkte Integrierung in das dnsmasq Paket ist für euch Profis doch sicherlich kein Problem, ich denke, dass eine solche Funktion doch ganz praktisch wäre, oder? Bisher habe ich mir nur das Script eben gerade zum Testen in /var/tmp gepackt und manuell ausgeführt.

TODO:
- In das dnsmasq Paket integrieren
- WebIf anpassen (aktivieren/deaktivieren und Serverlisteneditor (Checkboxen und/oder Textdatei mit zeilenweisen URLs?))
- dnsmasq muss auch starten, wenn kein Internet verfügbar ist

Was haltet ihr davon?

Beste Grüße
meilon
 
Wie ja schon im Header des Scripts steht, ist das Script im original nicht von mir, sondern für Linksys WRT54G mit tomato Software gedacht. Hier ist der original Thread dazu.

Und wie ich schon sagte, ich kenne gerade mal die Basics vom Shell Scripting, ob es nötig ist, weiß ich nicht, denke aber, dass das auch ohne funktionieren würde. Habe es aber nicht getestet.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.