Adblock w OpenWrt / Gargoyle / LEDE

Adblock w OpenWrt / Gargoyle / LEDE – tytuł wpisu sugeruje, że artykuł będzie o blokowaniu reklam na routerze z alternatywnym firmwarem OpenWrt / Gargoyle. Tak, owszem będzie o blokowaniu reklam, ale bezpośrednią inspiracją do jego powitania była lektura artykułu o nowych serwisach działających w pobieraczkowym stylu – Uwaga na internetowych oszustów!. Jako że dziecka w domu rosną, ani chybi w końcu któreś trafi na jeden z takich serwisów i się nieświadome konsekwencji zarejestruje. Kierując się przysłowiem, że lepiej jest zapobiegać niż leczyć, postanowiłem wyciąć te serwisy już na routerze. Takie rozwiązanie ma tą niezaprzeczalną zaletę, że dzięki temu strony te blokowane będą niezależnie od tego jakie urządzenie podłączymy do naszej sieci domowej, z jakim systemem operacyjnym czy z jaką przeglądarką WWW. W ten sposób powstał mój mały plik w formacie HOSTS dostępny pod adresem http://jazz.tvtom.pl/download/hosts.txt. Dopiero potem przyszedł mi pomysł, żeby przy okazji blokowania pobieraczkowych serwisów zablokować także reklamy, serwisy śledzące, spyware czy wszystko inne znajdujące się na dostępnych w internecie czarnych listach. Skutkiem blokowania reklam uzyskanym niejako przy okazji, będzie przyśpieszenie wczytywania stron pozbawionych balastu reklam.

Ostatnia zmiana w skryptach – na prośbę Łukasza – teraz białą listę adblock ściąga z zewnętrznej lokalizacji.

Realizacja tego pomysłu na routerze wyposażonym w alternatywny firmware OpenWrt / Gargoyle jest banalnie prosta. Właściwie wszystko, co potrzebujemy dostajemy out of the box, a naszą rzeczą jest jedynie dokonanie prostej konfiguracji.

Adblock (curl version) w LEDE / OpenWrt / Gargoyle

Do blokowania adresów wykorzystamy Dnsmasq – prosty serwer zabudowany w OpenWrt / Gargoyle służący do realizacji usług: DNS, DHCP i TFTP w małych sieciach. Wszystko co musimy zrobić to:

  • w pliku /etc/config/dhcp w sekcji config dnsmasq dopisać lokalizację pliku z adresami do zablokowania, np:. list addnhosts '/mnt/sda3/hosts/hosts.deny';
  • stworzyć ów plik /mnt/sda3/hosts/hosts.deny (ze względu na objętość tego pliku koniecznie na zewnętrznym nośniku USB);
  • zrestartować Dnsmasq.

Poniżej prezentuję mały skrypt, który zautomatyzuje powyższe 3 kroki. Skrypt do działania wymaga doinstalowania 2 pakiety: curl i ca-certificates:

Potrzebne są one do ściągania czarnych list. Skrypt aktualnie obsługuje czarne listy w 3 formatach:

  1. klasycznym formacie HOSTS – np. 127.0.0.1 090.waw.pl,
  2. formacie HOSTS ze zmodyfikowanym IP – np. 0.0.0.0 fr.a2dfp.net,
  3. czystej liście domen – np. arta.romail3arnest.info.

Skrypt przetworzy też pliki w formacie Adblocka / μBlocka, jednakże w tym przypadku zalecam BARDZO DALEKO IDĄCĄ OSTROŻNOŚĆ, np. taka sobie reguła ukrywająca reklamy google.pl##.ads-ad po przetworzeniu zablokuje całą google.pl. Jeśli więc komuś nie wystarczają listy z domyślnej wersji skryptu i ma nieodpartą potrzebę dodania listy Adblocka / μBlocka musi ją bardzo dokładnie przeanalizować i zdawać sobie sprawę, że może zablokować więcej niż by chciał.

Ja nie chcę, więc zdecydowałem usunąć z domyślnej wersji skryptu listy:

  1. http://hostsfile.mine.nu/Hosts,
  2. http://optimate.dl.sourceforge.net/project/adzhosts/HOSTS.txt,
  3. http://securemecca.com/Downloads/hosts.txt;

gdyż zawierały one zbyt dużo “dobrych” stron. Listy te były najobszerniejsze ze wszystkich testowanych przez mnie, wniosek z tego płynie dość oczywisty – trudno zapanować nad ogromną listą, lepiej więc skorzystać z wielu mniejszych list niż jednej obszernej

Data ostatniej modyfikacji skryptu adblock-curl to 11.02.2018

Działanie skryptu kontrolowane jest przez 4 parametry:

  • WORKDIR – wskazuje katalog, gdzie zapisywane są czarne listy, zarówno tymczasowe jak i ostatecznie wygenerowana;
  • BLACKLISTS – zawiera adresy URL list serwerów do zablokowania;
  • WHITELIST – zawiera adres URL białej listy czyli listy adresów, które z jakiś względów nie powinny być zablokowane. Zawsze lepiej jest zablokować mniej niż za dużo. Tworząc białą listę możemy posiłkować się wyrażeniami regularnymi.
  • IP – domyślnie niebezpieczne serwery przekierowywane są na adres 127.0.0.1 czyli localhost, jeśli chcemy dokonać przekierowania pod inny adres IP podajemy go w tej zmiennej, jeśli nie – pozostawiamy pustą. Ciekawą propozycją jest podanie adresu IP pixelserv, o instalacji którego będzie pod koniec wpisu.

Adblock (wget version) w LEDE / OpenWrt / Gargoyle

Jeśli z jakiś względów wolisz starszą, oryginalną wersję skryptu opartą na wget poniżej ją prezentuję. Skrypt do działania wymaga doinstalowania 2 pakiety: wget i ca-certificates:

Jedyną różnicą w stosunku do wersji bazującej na curl jest to, że czarne listy są ścigane przy każdej aktualizacji, niezależenie czy na serwerach uległy zmianie czy nie.

Data ostatniej modyfikacji skryptu adblock-wget to 11.02.2018

Działanie skryptu kontrolowane jest przez 5 parametrów, 3 z nich BLACKLISTS, WHITELIST oraz IP zostały omówione powyżej, więc nie będę się powtarzał. Natomiast zamiast WORKDIR mamy:

  • HOSTSDENY – wskazuje lokalizację pliku z listą serwerów do zablokowania;
  • HOSTSTEMP – wskazuje tymczasową lokalizację pliku z listą serwerów do zablokowania;

Instalacja skryptu oraz aktualizacja

Niezależnie od wybranej wersji dalsze postępowanie będzie identyczne. Skrypt zapisujemy w wybranej przez nas lokalizacji np. /mnt/sda3/bin. Nadajemy mu prawa wykonywania:

Skrypt adblock wywołujemy z odpowiednim parametrem:

  • start lub enable – włącza blokowanie stron,
  • stop – zatrzymuje blokowanie stron,
  • reload – uaktualnia listę blokowanych stron,
  • restart – restartuje Dnsmasq,
  • disable – zatrzymuje blokowanie stron i usuwa wszystkie pliki stworzone przez skrypt.

Na koniec możemy zadbać o automatyczną aktualizację pliku hosts.deny, w tym celu posłużymy się oczywiście cron-em:

i dopisujemy na końcu linijkę:

Jak widać sugeruję aktualizację raz w tygodniu w godzinach nocnych.

Gotowy plik hosts.deny (oczywiście z domyślnym IP 127.0.0.1) dostępny jest na mojej stronie pod adresem http://jazz.tvtom.pl/download/hosts. Aktualizowany jest zgodnie z powyższym harmonogramem. Plik ten możesz wykorzystać wprost w programach blokujących reklamy działających w oparciu o pliki HOSTS. Przykładem może tu być aplikacja AdAway działająca pod kontrolą systemu operacyjnego Android. AdAway nie jest dostępna w sklepie Google Play, ale możesz ją ściągnąć z repozytoriów F-Droid.

AdAway - Hosts sources

AdAway – Hosts sources

Pixelserv – eliminujemy komunikaty przeglądarek

Pixelserv do poprawnego działania Adblocka nie jest konieczny, jednakże jak słusznie zauważył w komentarzu kolega daro, niektóre strony z zablokowanymi reklamami nie wyglądają za dobrze – w miejscu reklamy pojawia się komunikat, że dana strona nie jest dostępna. Wygląd tego komunikatu zależy jest od przeglądarki. Jeśli nie chcesz ich oglądać, pomocny będzie pixelserv – czyli serwer WWW, którego jedynym zadaniem jest zaserwowanie jednopixelowego pliku GIF.

Konfigurację OpenWrt / Gargoyle zaczniemy od dodania aliasu adresu IP dla naszego routera, na który to adres przekierowywać będziemy żądania wyświetlania reklamy (parametr IP w skrypcie). Wybieramy zatem jakiś pierwszy, lepszy, nieużynany w naszej sieci lokalnej adres IP np. 192.168.1.2. W skrypcie ustawiamy ten adres w w parametrze IP.

W tej chwili nasz router powinien być widocznym pod dwoma adresami, sprawdzimy to wchodząc na stronę routera pod adresem http://192.168.1.2/.

Teraz zajmiemy się instalacją pixelserv, serwującego jednopixelowy plik GIF jako stronę komunikatu błędu, nasłuchującego na porcie 81. Do tego oczywiście potrzebujemy samego pliku GIF, który ściągnąć możemy z tego bloga. Mamy to do wyboru aż cztery propozycje. Ja wybrałem pierwszą, czyli przeźroczysty obrazek zgodny ze specyfikacją GIF89a. Plik ten umieściłem w katalogu /www_vargalex, gdyż używam OpenWrt vargalex build, Wy możecie go umieścić w katalogu /www lub utworzyć nowy np. /www_pixelserv, tak jak to zostało pokazane poniżej.

Drugim plikiem jaki powinniśmy utworzyć w katalogu naszego Pixelserv to plik index.html, który będzie informował użytkownika zablokowanej strony dlaczego jej nie widzi, przykładowa najprostsza strona:

Nasze dalsze postępowanie zależne będzie od tego jaki serwer WWW mamy już zainstalowany na routerze, i tak w przypadku OpenWrt z LuCI musimy skonfigurować nową instancję serwera uHTTPd:

Natomiast w przypadku Gargoyle, nową instancję serwera httpd_gargoyle uruchomimy komendą:

którą warto dopisać do pliku /etc/rc.local oczywiście przed ostatnią komendą exit 0, aby pixelserv startował automatycznie po restarcie routera.

Pora na kolejny test – pod adresem http://192.168.1.2:81/jakaś_nieistniejąca_podstrona (lub http://192.168.1.1:81/jakaś_nieistniejąca_podstrona powinien znajdować się nasz jednopixelowy GIF.

Na koniec musimy jeszcze dodać do naszego firewalla regułkę przekierowującą żądania wyświetlania reklamy z 192.168.1.2:80 na adres pixelserv 192.168.1.2:81 (lub 192.168.1.1:81).

Teraz jednopixelowy GIF powinien być już pod adresem http://192.168.1.2/jakaś_nieistniejąca_podstrona.

Na koniec nie pozostaje mi nic innego jak tylko przekonać nieprzekonanych poniższym zrzutem ekranu.

Adblock w OpenWrt / Gargoyle działa

Adblock w OpenWrt / Gargoyle działa

Skryptowi Adblock poświęcony jest wątek na polskim forum Gargoyle.