Kategória: OpenWrt

Zmenené: 1. október 2010

Blokovanie reklamy

Už dávnejšie využívam zabudovanú vlastnosť prehliadača Opera na to, aby som ušetril jednak sieťovú prevádzku a jednak svoje nervy. Touto zabudovanou vlastnosťou je „Blokovanie obsahu“. Zvykol som si na to do takej miery, že som pri inom stroji veľmi nemilo prekvapený množstvom podsúvanej reklamy.

Ale riešenie Opery je pre jedného používateľa, tak som sa rozhodol urobiť to nejako centrálne, a využil som na to DNS server dnsmasq. O filtrovaní webových stránok sú popísané na internete celé litánie. Väčšina popisovaných riešení je však do „veľkých“ strojov, a tak ma veľmi potešil článok na flexioon.org, ktorý popisuje, okrem základného nastavenia DNS servera dnsmasq, aj spôsob ako ho použiť na blokovanie reklám. Po prečítaní článku som bol samozrejme zvedavý, či by sa to dalo urobiť aj v X-Wrt na Asuse. No a … dá sa to!

V článku popisovaný spôsob používa jednu vlastnosť dnsmasq, ktorá umožňuje tomuto drobcovi priamo nastaviť adresu doménových mien (čo inak nie je jeho úloha, pretože je určený na správu jednej lokálnej domény). Takže pomocou tohoto nastavenia presmerováva preklad mien zadaných domén na lokálnu IP adresu, na ktorej beží jednoúčelový webový server, ktorý na každú požiadavku odpovedá obrázkom o veľkosti 1 (jediného) pixela. Pôvodné riešenie odkazuje na pixelserv, ktorý je však napísaný v perle a inštalovať do Asusu perl ma nijako nelákalo. Nepodarilo sa mi síce nájsť inštalačný balík pre X-Wrt, ale zato sa mi podarilo nájsť predkompilovanú verziu, ktorá na X-Wrt Kamikaze beží. Ale poďme pekne poporiadku.

Presun WebIf

Rada

Ak nepoužívate WebIf, tak túto časť prosto preskočte…

Prvá úloha, ktorá predo mnou stála, bolo odsunutie webového rozhrania WebIf na iný port. Nie je to náročná úloha, len mi chvíľu trvalo, kým som našiel kde sa to nastavuje. Nakoniec stačilo otvoriť súbor /etc/config/httpd a v ňom zmeniť nastavenie voľby port, napríklad na hodnotu 8080:

config 'httpd'
    option 'home' '/www'
    option 'port' '8080'

Netreba zabudnúť ani na firewall, v ktorom som samozrejme port 8080 nemal povolený, takže som do súboru /etc/config/firewall pridal nové pravidlo:

config 'rule'
    option 'src' 'lan'
    option 'src_ip' 'IP.ADR.SIE.TE'
    option 'proto' 'tcp'
    option 'dest_port' '8080'
    option 'target' 'ACCEPT'

Tip

Nezabudnite si nastaviť svoj rozsah IP adries vo voľbe src_ip.

Teraz možno reštartovať firewall a potom i webový server:

/etc/init.d/firewall restart
/etc/init.d/httpd restart

A pre istotu skontrolovať, či všetko beží ako má:

netstat -tnl | grep 80
tcp        0      0 0.0.0.0:80            0.0.0.0:*               LISTEN

Inštalácia pixelserv

Nasleduje inštalácia jednopixelového servera, ktorý si môžete stiahnuť pomocou wget:

wget http://wd.mirmana.com/pixelserv -O /usr/sbin/pixelserv

Nepokúšajte sa stiahnuť ho pomocou webového prehliadača, nepôjde to…

Aby sa tento server spúšťal pri štarte, je potrebný štartovací skript, nazval som ho „inovatívne” pixelserv a umiestnil do /etc/init.d:

#!/bin/sh /etc/rc.common

START=50
PIXSRV="/usr/sbin/pixelserv"

start() {
    [ -x "$PIXSRV" ] || return 1
    unset args
    append args "IP.AD.RE.SA"
    eval "$PIXSRV $args"
}

stop() {
    killall pixelserv
}

Samozrejme, skriptu je potrebné nastaviť práva na spustenie (755), povoliť jeho automatické štartovanie a spustiť server:

/etc/init.d/pixelserv enable
/etc/init.d/pixelserv start

Pomocou vyššie spomenutého príkazu netstat si skontrolujte, že sa naozaj rozbehol:

netstat -tnl | grep 80
tcp        0      0 192.168.0.254:80        0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN

Ak vám to všetko beží, máte polovicu hotovú.

Získavanie zoznamu reklám

Samozrejme, celé toto hranie sa by bolo na nič, keď nebude nejaký zoznam domén, ktoré sú zdrojom reklám. Existuje však služba, ktorá tento zoznam ponúka. Nie, netreba sa báť ručného sťahovania zoznamu, urobí to celé skript, najmä preto, aby to mohol robiť pravidelne cez cron . Takže jednoduchý skript /usr/sbin/get_adblock.sh:

#!/bin/sh

TMP_FILE="/tmp/adblock.tmp"
CFG_DIR="/etc/"
CFG_FILE="adblock.conf"
IP_ADDR="192.168.0.254"

# Down the DNSmasq formatted ad block list
wget "http://pgl.yoyo.org/adservers/serverlist.php?hostformat=dnsmasq&showintro=0&mimetype=plaintext" -O $TMP_FILE

# Replace all occurrences of 127.0.0.1 with the IP address our ad block server is listening on.
sed -i "s/127.0.0.1/$IP_ADDR/g" $TMP_FILE
mv $TMP_FILE $CFG_DIR$CFG_FILE

# Restart DNSmasq
/etc/init.d/dnsmasq restart

Väčšina skriptu je z pôvodného článku, len som v ňom trochu upravil manipuláciu so stiahnutým súborom a nahradil konkrétne mená súborov, či IP adresu, premennými. Samozrejme, ak máte vlastný zoznam (najmä našich a českých) reklamných serverov, pridajte si na koniec skriptu, aby tento zoznam pripájal k výslednému súboru /etc/adblock.conf.

Ostáva už len nastaviť cron tak, aby tento zoznam aktualizoval napríklad raz za týždeň, takže do súboru /etc/config/crontabs pridajte:

config 'crontab'
    option 'minutes' '30'
    option 'hours' '19'
    option 'days' '*'
    option 'months' '*'
    option 'weekdays' '5'
    option 'command' '/usr/sbin/get_adblock.sh'
    option 'enabled' '1'

Takto bude zoznam aktualizovaný každý piatok o 19:30. Ak nemáte cron nastavený, proste tento príkaz raz za čas spusťte.

Nastavenie dnsmasq

Vraví sa „To najlepšie na koniec“. Ak sa vám podarilo všetko nastaviť, ostáva teda posledná úloha, ktorou je presvedčiť dnsmasq, aby tento súbor používal, a tým zaistil filtrovanie reklamy. Tu sa mi nepodarilo nájsť žiadny štandardný spôsob (pre X-Wrt), ako dnsmasq presvedčiť, že má načítať konfiguráciu z konfiguračného súboru, preto som to vyriešil úpravou štartovacieho skriptu. Nie je nijako zložitá a spočíva v pridaní jednej voľby do príkazu, ktorý spúšťa DNS server.

Aby ste to dosiahli i vy, proste si otvorte súbor /etc/init.d/dnsmasq a nájdite v ňom riadok:

/usr/sbin/dnsmasq $args && {

ktorý zmeňte na:

/usr/sbin/dnsmasq $args -C /etc/adblock.conf && {

DNS server reštartuje a tešte sa!

Záver

Na záver už len dodám, že toto riešenie nenahradí úplne blokovanie reklamy z Opery, pretože umožňuje len blokovanie celých reklamných domén, pričom v opere sú možnosti trochu širšie, keďže dokáže blokovať aj konkrétnu cestu na serveri…

No a možno zistíte, že nie je dobrý nápad presmerovávať reklamu na adresu v lokálnej sieti, pretože napríklad Opera zobrazuje varovanie o používaní lokálnej adresy. V takom prípade použite na presmerovanie adresu z iného lokálneho rozsahu (ja som zvolil 192.168.0.254.254), ktorú potom na Asuse presmerovávam. A je po upozornení…