.titleBar { margin-bottom: 5px!important; }

[Proof of Concept] Ad Blocking durch Freetz!

Dieses Thema im Forum "Freetz" wurde erstellt von meilon, 5 Dez. 2008.

  1. meilon

    meilon Neuer User

    Registriert seit:
    5 Jan. 2006
    Beiträge:
    149
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  2. RalfFriedl

    RalfFriedl IPPF-Urgestein

    Registriert seit:
    22 Apr. 2007
    Beiträge:
    12,343
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ist das Skript von Dir?

    Wenn ja, was tut Deiner Meinung nach "eval", bzw. warum ist es notwendig?
     
  3. meilon

    meilon Neuer User

    Registriert seit:
    5 Jan. 2006
    Beiträge:
    149
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.
     
  4. RalfFriedl

    RalfFriedl IPPF-Urgestein

    Registriert seit:
    22 Apr. 2007
    Beiträge:
    12,343
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ich denke auch, daß das eval hier unnötig ist. Es ist nur bei sehr speziellen Konstruktionen notwendig.