Blokátor reklamy dnes považuji za jeden ze základních prvků internetové bezpečnosti. O tom, proč tomu tak je, jsem před časem věnoval celý článek. Blokování reklamy v prohlížečích dnes nestačí. Platí to obzvlášť pro mobily, kde může zobrazovat reklamy a šmírovat prakticky každá aplikace. Už delší dobu jsem měl proto na mobilu nastavené blokování na úrovni DNS pomocí veřejného DNS serveru AdGuard.
Říkal jsem si ale, že by to chtělo nějakou systematičtější a plošnější ochranu. Existují služby, které toto poskytují, např. NextDNS a již zmíněný Adguard, ale mě zajímalo řešení, které bych si mohl provozovat sám. Něco jako Pi-hole, ale s tím rozdílem, že bych to nemusel provozovat doma, ale na vlastním serveru v datacentru. Nemáme doma zrovna nejrychlejší připojení a při jednom DNS dotazu z mobilu v terénu by přes něj informace putovaly hned čtyřikrát: z mobilu na Pi-hole, z Pi-hole na primární DNS server, pak zpět do Pi-hole a z něj do mobilu. To by zbytečně prodlužovalo odezvu, která je u DNS klíčová. Navíc by všechna zařízení musela být trvale na VPN, což také není dvakrát praktické.
Když jsem takové řešení začal hledat, rychle jsem zjistil, že řešení má pro mě opět AdGuard. Ten totiž vyvíjí open-source nástroj AdGuard Home, který umožňuje provozovat to, co nabízí jako službu, ve vlastní režii. Vůči AdGuardu panuje určitá nedůvěra kvůli jeho původu v Rusku. Dnes operuje z Kypru, vývoj má také v EU a v Rusku byl několikrát blokován, ale část zaměstnanců v Rusku údajně pořád má. U služby v jejich režii by to u mě asi určité obavy vyvolávalo, ale u softwaru s otevřeným zdrojovým kódem, který si provozuju ve vlastní režii, to pro mě problém asi nepředstavuje.
Adguard Home není plnohodnotným DNS resolverem, funguje jako DNS forwarder s možností filtrování. To znamená, že když přijme DNS dotaz, sám na něj neodpoví, ale přepošle ho na vybraný DNS server a odpovědi zpracovává a filtruje dle nastavených pravidel a následně posílá zpět klientům. Dá se tedy používat k blokování reklamy a škodlivých stránek a k rodičovské kontrole na úrovni DNS.
Je třeba dodat, že blokování pomocí filtrování odpovědí z DNS serverů není neprůstřelné. Nefunguje tam, kde je blokovaný obsah servírovaný ze stejné domény jako zbytek obsahu (YouTube) nebo kde se volá přímo IP adresa nebo si aplikace řeší překlad adresy svépomocí. Dle mých zkušeností se ale jedná spíše o výjimky a blokování na úrovni DNS je velmi efektivní a na rozdíl od adblocků v prohlížečích opravdu plošné. Navzájem se tyto dvě formy blokování nevylučují; naopak se doporučují kombinovat pro co nejlepší výsledek.
Instalace a nastavení
AdGuard Home je napsaný v Go a nemá žádné externí závislosti. Díky tomu je jeho instalace jednoduchá. K dispozici je v podobě obrazu pro Docker, snapu nebo třeba addonu pro Home Assistant. Já jsem se ho ale kvůli omezeným systémovým zdrojům na serveru rozhodl instalovat klasicky přímo do systému. Při spuštění typicky narazíte na konflikt se systemd-resolved na portu 53, které budete muset vypnout, pokud chcete, aby vám AdGuard Home obsluhoval DNS dotazy přes UDP na portu k tomu standardně určeném.
Webové rozhraní běží ve výchozím nastavení na portu 3000 a můžete v něm dokončit úvodní nastavení. Já jsem následně přesunul AdGuard Home za reverzní proxy, aby nemusel pracovat s certifikáty (ale nakonec jsem se tomu stejně nevyhnul).
Dle mých zkušeností není nijak zásadně náročný na systémové prostředky. V paměti zabírá 60-70 MB a čtyřjádrové CPU zatěžuje maximálně v jednotkách procent.

Podporované protokoly
DNS
AdGuard samozřejmě podporuje klasický DNS protokol a naslouchá na portu 53. Není ale dobré ho mít jen tak otevřený do Internetu, protože se dá zneužít k útokům typu amplification. O tom jsem se rychle přesvědčil, když jsem při konfiguraci nechal port omylem otevřený a po hodině na něm měl provoz 300 tisíc dotazů za hodinu (i při zapnutém omezení 20 dotazů za sekundu na IP adresu). Rychle jsme ho zase zavřel, jinak bych měl brzo ve schránce email od NÚKIBu. Port 53 mám otevřený pouze do VPN, kterou mám propojený server s domácím routerem. AdGuard Home je tak přes klasický DNS protokol dostupný pouze zařízením v domácí síti.
DNS over TLS
Nedostatkem tradičního DNS protokolu je to, že není nijak šifrovaný. Vaše dotazy na DNS server tak může někdo odchytávat a na základě toho rekonstruovat, na jaké webové stránky chodíte. Případně vám může pod danou doménou podvrhnout jinou cílovou adresu. Proto vznikl protokol DNS over TLS (DoT), který zabaluje dotazy a odpovědi DNS do šifrovaného protokolu TLS a který běží na portu 853. AdGuard Home ho také podporuje. Hodí se obzvláště na Androidu, kde funkce soukromého DNS vyžaduje právě DoT.
Nastavování DoT byl také ten moment, kdy jsem zjistil, že s reverzní proxy si nevystačím a AdGuard Home bude muset s certifikáty k mé doméně pracovat napřímo. Potřebuje je totiž k TLS. Když jsem AdGuard Home nastavoval tak, aby mohl běžet pod běžným uživatelem, musel jsem vymyslet i mechanismus, jak se s těmito právy dostane k certifikátům. Pokud používáte reverzní proxy, je komplikací i to, že když chcete zapnout šifrování pro DoT, musíte jej zapnout i pro HTTPS. Musel jsem tedy pro HTTPS nastavit jiný port než 443, na kterém už mi běží webový server poskytující reverzní proxy. Tento port mám zároveň zakázaný ve firewallu, aby provoz přes HTTPS putoval k Adguard Home i nadále pouze přes reverzní proxy.
Dobrou zprávou je, že DoT můžu mít otevřený do Internetu, aby se k němu dostala mobilní zařízení v terénu. Na rozdíl od klasického DNS ho nikdo nezneužívá. Ani po měsících provozu jsem tam nepozoroval žádné požadavky z cizích zařízení. I tak jsem se ale nakonec rozhodl přístup omezit pouze pro povolené klienty.
DNS over HTTPS
DNS lze šifrovat nejen pomocí TLS, ale také pomocí protokolu HTTPS. Výhodou oproti DoT je to, že nepoužívá vlastní port, ale je schovaný mezi další šifrovanou komunikací na portu 443. To se může hodit třeba v hotelových sítích s velmi restriktivně nastaveným firewallem. I když má HTTPS teoreticky vyšší režii než TLS, v praxi má DoH nižší odezvu a v nestabilních sítích dokáže překovat i DNS přes UDP. Je to díky jeho schopnosti déle udržet a využít již existující spojení. TLS umí také využít již existující spojení, ale v praxi dochází k rozpadu a potřebě vytvořit nové spojení, s čímž je spojená největší režie, častěji.
DoH využijete v prohlížečích jako Firefox nebo Chromium, které DoT neumí. Já se snažím DNS řešit na systémové úrovni a pro DoT mluví to, že pokud si chcete v Androidu nastavit libovolné DNS, je podporovaný jen tento protokol. DoH můžete použít jen s několika předvolenými poskytovateli DNS.
DNS over QUIC
Nejžhavější novinkou je DNS over QUIC. QUIC je protokol vyvinutý společností Google v roce 2012. Jeho cílem je na transportní vrstvě nahradit TCP. Měl by poskytovat lepší výkon, lépe si poradit s problémy jako blokování čela fronty. Před třemi lety bylo DNS over QUIC navrženo jako standard a Adguard si od něj hodně slibuje a podporuje ho ve svých produktech. Podporuje ho i Adguard Home, ale osobně s ním nemám zkušenosti, protože podpora na straně klientů je pořád slabá. Na Androidu bych musel používat aplikaci přímo od Adguardu, která je ale dostupná pouze s předplatným.
Upstreamové DNS servery
Jak už jsem v úvahu článku psal, AdGuard Home není plnohodnotným DNS resolverem, ale jen DNS forwarderem, takže ke svému běhu potřebuje DNS servery, kterých se může dotazovat. Výhodou z pohledu soukromí a odolnosti je to, že to nemusí být jeden server, ale klidně skupina serverů, mezi které se dotazy rozdělují na základě vybraného algoritmu.
Výchozí volbou, které se držím, je posílat vždy jen jeden dotaz a četnost, s jakou se servery oslovují, se odvozuje od spolehlivosti a rychlosti odpovědí. Tím by se mělo dosahovat nižší průměrné odezvy. Tu snižuje i to, že si AdGuard Home udržuje cache s posledními dotazy a neptá se tak upstreamových DNS pokaždé.
To lze ještě zlepšit tzv. optimistickým ukládáním do cache. Když se klient dotáže na záznam, kterému už vypršela životnost (time-to-live), AdGuard Home tento záznam klientovi pořád odešle, ale zkrátí TTL na 10 sekund, aby se klient brzo zeptal znovu, a on čas do dalšího dotazu využije k obnově záznamu. Se zapnutým optimistickým ukládáním v mém případě klesá poměr „dotazy na upstreamový DNS server/odpovědi klientům“ pod 1/10.
K balancování dotazů mezi upstreamovými DNS servery dochází neustále a AdGuard Home se tak snaží zajišťovat co nejnižší odezvu. Kvůli balancování si vede statistiku průměrné doby odezvy a z ní jde vyčíst, že odezva u veřejných DNS se v čase mění. U některých docela výrazně. Pokud má nějaký slabší období nebo je prostě problém ve směrování dotazů, AdGuard Home ho dočasně upozadí. Vždy se ale snaží zachovat diverzitu. Při pěti nastavených DNS serverech se ten nejrychlejší dostane maximálně na podíl 40 % dotazů.
Já aktuálně používám právě pět upstreamových DNS serverů a jeden jako zálohu pro velmi nepravděpodobný případ, že by všech pět vypadlo. Za etalon rychlosti se považuje Cloudflare a jeho 1.1.1.1, ale podle dlouhodobých statistik je při dotazech z mého serveru až o 30 % rychlejší DNS4EU, což asi není úplně překvapivé, protože je provozováno českou společností Whalebone, která tu má nejvíc infrastruktury. Bude to ale asi hodně individuální v závislosti na geolokaci a směrování dotazů. Hodně lidí si pochvaluje švýcarský Quad9 (9.9.9.9), ale v mém případě byl tak pomalý, že jsem ho přestal používat úplně.
AdGuard Home umožňuje zapnout DNSSEC, takže pokud to podporuje dotazovaný DNS server a daná doména, AdGuard Home provede ověření přes DNSSEC. Zvyšuje to průměrný čas odbavení dotazu, ale díky cache to nemá na reálnou rychlost takový dopad. Nicméně nemá to ani výrazný dopad na praktickou bezpečnost.
Mezi českými doménami je DNSSEC díky CZ.NIC celkem rozšířený, ale u zahraničních domén je naopak spíše výjimkou, takže jej nemůžete reálně vynucovat, protože byste se na většinu webů nedostali. V protokolu dotazů můžete vidět, který dotaz byl ověřen pomocí DNSSEC, ale pro uživatele tohle zůstává nedostupné a musí se tak spokojit s určitou nejasně zvýšenou bezpečností, kdy část dotazů byla ověřena, ale neví, kterých domén se to týká.

Filtrování
Filtrování DNS dotazů je hlavním přínosem AdGuard Home a vlastně důvodem, proč vznikl. Pokud vám jde jen o základní blokování, můžete používat veřejný DNS server AdGuard a víc neřešit. Přidanou hodnotou AdGuard Home je větší kontrola a možnost úprav. Ve výchozím stavu pracuje se seznamem blokovaných domén spravovaným AdGuardem, kterým se řídí i jejich veřejný DNS server. Zároveň je přednastavený, ale ve výchozím nastavení nepovolený seznam od AdWay.
Můžete si k nim přidat další seznamy, případně vytvářet pravidla, která ta ze seznamů přepíší. Např. povolit domény, které jsou jinak na seznamu blokovaných, případně seznamy doplnit o individuální domény a pravidla. Ve výchozím nastavení odpoví na dotaz s blokovanou doménou AdGuard Home nulovou IP adresou (0.0.0.0), což je standardní chování mezi blokátory reklam. Můžete si ale nastavit, že dotaz odmítne, dotaz přesměruje na vybranou IP adresu, kde budete mít třeba stránku s informacemi o blokování, aby uživatel věděl, proč se mu to nenačetlo.

Klienti
Adguard Home umožňuje pracovat s jednotlivými klienty a pro ně mít na míru upravené filtrování. Díky tomu může fungovat jako rodičovská kontrola, která vám umožňuje zablokovat třeba stránky pro dospělé na zařízeních dětí. Jak to ale vlastně funguje, když DNS nemá žádný autentizační mechanismus?
U prostého DNS můžete používat jako identifikátor IP adresu, což je ale dost hrubý způsob, např. když vám DNS dotazy přeposílá domácí router a všechny chodí ze stejné IP adresy. Pokud vám Adguard Home běží v domácí síti a používáte jej taky jako DHCP server, můžete jako identifikátor použít také MAC adresu.
U pokročilejších protokolů DoT, DoH a DoQ se klienti rozlišují podle toho, na jakou adresu posílají dotazy. U DoH je to https://example.org/dns-query/identifikator-klienta/. U DoT a DoQ to potom je tls://identifikator-klienta.example.org/, respektive quic://identifikator-klienta.example.org/. V posledních dvou případech je potřeba si nastavit wildcard certifikát *.example.org, což bohužel u Let’s Encrypt není maličkost, protože u wildcard certifikátu vyžaduje ověření přes zápis do DNS záznamů, který neautomatizujete, pokud poskytovatel, u kterého máte zaparkované domény, nemá přístup přes API. Já tak momentálně obnovuji certifikát každé tři měsíce ručně. Dobré je, že Adguard Home vás sám upozorní, že používaný certifikát brzo vyprší.
Možná si říkáte, jak si AdGuard Home přeloží adresy DNS serverů, když jsou definované doménou a ne IP adresou, jak je na příkladech výše. Pracuje s tzv. bootstrap DNS servery, kterým posílá jen dotazy, které se týkají upstreamových DNS serverů. Ve výchozím stavu se dotazuje DNS serverů Quad9.
U každého klienta si můžete nastavit vlastní filtrování. Ať už pomocí předdefinovaných režimů Bezpečné prohlížení nebo Rodičovská kontrola, nebo blokováním konkrétních služeb/webů. Můžete nastavit taky časové plány blokování. Pokud nechcete, aby děti do noci hleděly na Youtube nebo Netflix, můžete nastavit jejich blokování třeba od deváté večer. Na rozdíl od rodičovské kontroly na domácím routeru to bude fungovat ve všech sítích; minimálně do doby, než se dítko naučí si nastavit jiný DNS server (pokud k tomu bude mít dostatečná práva).
U každého klienta si také můžete nechat zobrazit logy dotazů, což ale může být docela výrazný zásah do soukromí. Adguard Home myslí i na to a umožňuje vám logování u daného klienta vypnout.
Srovnání s Pi-hole
Když jsem si pro účely srovnání zpětně hledal podrobnější informace o Pi-hole, zjistil jsem, že pro mé účely jsem za něj vlastně nemusel hledat náhradu. Není dnes ve skutečnosti nijak svázané s Raspberry Pi, není třeba ho nutně provozovat v domácí síti. Nicméně hledání alternativy a nalezení AdGuard Home dle mého názoru nebylo zbytečné.
Adguard Home funguje jako all-in-one řešení. Všechny jeho funkce dostanete v jedné běžící binárce. Pokud nechcete používat kontejner, udržuje se díky tomu výrazně jednodušeji. Pi-hole samo o sobě neumí šifrované DNS, ale používá k tomu samostatně běžící služby jako unbound nebo cloudflared. Ty šifrované dotazy rozbalí a Pi-hole předají jako obyčejné DNS dotazy. To ale znamená, že Pi-hole neumí klienty identifikovat přes DoH a DoT a zbývá tak identifikace pouze podle IP a MAC adres, což výrazně omezuje využití mimo lokální síť a na mobilních zařízeních se bez VPN neobejdete.
Webové rozhraní mi u AdGuardu přijde intuitivnější a rodičovská kontrola pokročilejší. Pi-hole je rychlejší, ale rozdíl je marginální a v praxi nepostřehnutelný.
Závěrem
Adguard Home jsem začal používat kvůli blokování reklamních systémů, ale dnes ho ke své spokojenosti využívám také jako rodičovskou kontrolu. Zvyšuje soukromí také tím, že dotazy ze všech klientů agreguje a následně je rozesílá na více DNS serverů. Je ale třeba dodat, že i v případě použití šifrovaných protokolů pořád nepředstavuje dostatečnou ochranu před poskytovatelem internetového připojení. Encrypted Client Hello pořád není samozřejmostí, takže doména se stále může nacházet v nešifrované podobě v hlavičkách HTTPS komunikace. A i když se ECH používá, pořád má ISP k dispozici IP adresy, z kterých může částečně zrekonstruovat, na jaké weby chodíte. Plnohodnotnou ochranou je jen VPN tunel, který vyřeší problém s důvěrou k poskytovateli připojení, ale vytvoří ten samý problém vůči poskytovateli VPN.


Napsat komentář