Blokowanie niechcianych stron
Ostatnia zmiana: 2016-05-24 18:58

Praktycznie każda nowoczesna przeglądarka posiada odpowiednie rozszerzenie pozwalające na blokowanie reklam (np. słynny AdBlock). Umożliwia to pozbycie się natrętnych reklam, przeładowania stron zbędnymi obrazkami oraz pozwala na zmniejszenie transferu. Ale...

Na routerach zwykle korzystamy z wbudowanego serwera cache dnsmasq, który odpowiada na rozwiązywanie nazw DNS w sieci. Można do wykorzystać także do blokowania niechcianych serwerów, w szczególności serwerów reklamowych, portali społecznościowych i innych. Zasada działa jest bardzo prosta - podsuwany dnsmasq spis adresów wraz innymi IP niż faktycznie posiadają - np. 127.0.0.1, przez co dane z tych serwisów nie będą pobierane bo wskazują host lokalny.

W przeciwieństwie do rozszerzeń w przeglądarkach ten sposób nie przeogranizuje wyglądu strony - najczęściej przeglądarka wyświetli puste miejsce zamiast reklamy. Poniższy przykład prezentuje działanie takiego rozwiązania (na podstawie http://onet.pl) - przed włączeniem i po włączeniu:



To co będzie blokowane zależy do podania konkretnych adresów w pliku konfiguracyjnym. Dostępne jest kilka serwisów udostępniających bezpłatnie spis takich adresów które zostaną wykorzystane w tym projekcie; oczywiście nic nie stoi na przeszkodzie aby taki spis aktualizować i utrzymywać samemu.

Opracowano na podstawie https://forum.openwrt.org/viewtopic.php?id=35023 choć to pomysł tak stary jak świat.

Lista adresów

Do działania niezbędna będzie lista adresów. Tworzymy plik /tmp/block.hosts o następującej zawartości:


    127.0.0.1 ads.ak.facebook.com
    127.0.0.1 creative.ak.facebook.com

itd, gdzie jako adres podajemy 127.0.0.1, jako nazwę - adres blokowanej domeny.

Skrypty

Tworzenie takiej listy z adresami można wykonać we własnym zakresie, ale może to być pracochłonne. Skorzystamy więc z kilku serwisów które takie dane już oferują. Tworzymy plik /usr/bin/adblock.sh o zawartości:


    #!/bin/sh
    rm -f /tmp/block.hosts

    wget -qO- "http://www.mvps.org/winhelp2002/hosts.txt" | grep "^127.0.0.1" > /tmp/block.build.list
    wget -qO- "http://www.malwaredomainlist.com/hostslist/hosts.txt" | grep "^127.0.0.1" >> /tmp/block.build.list
    wget -qO- "http://hosts-file.net/.\ad_servers.txt" | grep "^127.0.0.1" >> /tmp/block.build.list
    wget -qO- "http://adaway.org/hosts.txt" | grep "^127.0.0.1" >> /tmp/block.build.list
    wget -qO- "http://pgl.yoyo.org/as/serverlist.php?showintro=0;hostformat=hosts" | grep "^127.0.0.1" >> /tmp/block.build.list

    awk '{$1=$1}{gsub(/\r/,"")}{print }' /tmp/block.build.list|sort|uniq > /tmp/block.build.before
    rm -f /tmp/block.build.list

    grep -vf /etc/white.list /tmp/block.build.before > /tmp/block.hosts
    rm -f /tmp/block.build.before

    /etc/init.d/dnsmasq restart

    exit 0

(nie zapominamy o nadaniu uprawnień: chmod 755 /usr/bin/adblock.sh). Można też pobrać gotowy plik:


    # wget http://dl.eko.one.pl/projekty/adblock.sx -O /usr/bin//adblock.sh
    # chmod 755 /usr/bin/adblock.sh

Do poprawnego działania niezbędne jest jeszcze wskazanie dnsmasq że ma korzystać z utworzonego pliku blokad:


    # uci add_list dhcp.@dnsmasq[0].addnhosts=/tmp/block.hosts
    # uci commit dhcp

Dodatkowo niezbędne jest przygotowanie pliku "whitelisty", czyli spisu serwisów które nie będą blokowane:


    # touch /etc/white.list
    # echo "eko.one.pl" >> /etc/white.list

Uruchomienie

Wystarczy teraz po prostu wykonać ten skrypt:


    # adblock.sh

aby zostały pobrane odpowiednie dane, wygenerowany plik z listą hostów i zrestartowany dnsmasq. W logach systemowych (logread) powinna pojawić się informacja o wczytaniu tego pliku przez dnsmasq:


    ...
    Oct 30 08:25:40 OpenWrt daemon.info dnsmasq[3277]: read /tmp/block.hosts - 30353 addresses
    ...

Zakończenie

Pobieranie listy można w prosty sposób zautomatyzować przez crona (np. pobieranie raz dziennie) oraz dodać do skryptów startowych (np. do /etc/rc.local) aby wykonało się przy starcie routera.
Prezentowane rozwiązanie sprawdzi się jeżeli komputery korzystają z routera jako serwera dns. Można wymusić to (w Gargoyle - odpowiednia opcja dostępna jest gui) dodając odpowiednią regułę przekierowania np.


    iptables -t nat -I PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53
    iptables -t nat -I PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53

w pliku /etc/firewall.user.

Chaos Calmer 15.05.1

W tym wydaniu OpenWrt pojawił się pakiet automatyzujący w/w czynności. Instalacja adblocka sprowadza się do instalacji pakietu o takiej nazwie:


    # opkg udpate
    # opkg install adblock uhttpd

Następnie należy włączyć źródła adresów w pliku /etc/config/adblock, każda sekcja z listą adresów ma swoją opcję enabled którą można przestawić na 1. Domyślnie włączone są tylko niektóre z nich, można włączyć wszystkie oraz dodać własne źródła. Należy pamiętać że listy plików trzymane są pamięci ram (w katalogu /tmp/dnsmasq.d), więc jeżeli mamy jej mało (np. tylko 32MB) to należy rozsądnie zarządzać źródłami plików. Przy większej ilości dostępnej pamięci (powyżej 64MB lub przy włączonym swapie) zostaną także usunięte duplikaty wpisów z list, o ile takie istnieją.

Adblock realizuje także:
- przekierowanie dns (domyślnie włączone - opcja adb_forcedns), która zmusza hosty w naszej sieci do używania wbudowanego w routerze serwera dns
- uruchomienie pixservera - czyli udostępnia własną grafikę którą można zastąpić reklamy na stronie. Adblock domyślnie samodzielnie uruchamia uhttpd na odpowiednim porcie (domyślnie: 65535), należy tylko ustawić adres IP tego serwera:


    # uci set adblock.global.adb_nullipv4='192.168.1.1'
    # uci commit adblock

(uwaga: może to spowodować zablokowanie LuCI jeżeli używamy tego gui na tym samym adresie)
Później wystarczy tylko ściągnąć odpowiednie listy przez wydanie poleceń:


    # /etc/init.d/adblock enable
    # /etc/init.d/adblock start

Jeżeli używamy środowiska graficznego LuCI to można doinstalować odpowiedni dodatek:


    # opkg install luci-app-adblock

i tym samym można aktywne listy wyklikać z GUI.

W katalogu /etc/adblock w odpowiednich plikach jest możliwość umieszczenia własnych list adresów zablokowanych i dozwolonych.