Syntaxe pravidel DNS filtrování
Zde vám ukážeme, jak psát vlastní pravidla DNS filtrování pro použití v produktech AdGuard
Rychlé odkazy: Stáhnout Blokátor reklam AdGuard, Získat AdGuard Home, Vyzkoušet AdGuard DNS
Úvod
Syntaxi pravidel filtrování AdGuard DNS můžete použít k tomu, aby byla pravidla flexibilnější a mohla blokovat obsah podle vašich preferencí. Syntaxi pravidel filtrování AdGuard DNS lze použít v různých produktech AdGuard, například AdGuard Home, AdGuard DNS, AdGuard pro Windows/Mac/Android.
Existují tři různé přístupy k psaní hostitelských seznamů zakázaných:
Syntaxe ve stylu Adblock: moderní přístup k psaní pravidel filtrování založený na použití podmnožiny syntaxe pravidel ve stylu Adblock. Tímto způsobem jsou seznamy blokování kompatibilní s blokátory reklam v prohlížečích.
/etc/hostssyntaxe: starý a osvědčený přístup, který používá stejnou syntaxi, jakou používají operační systémy pro své funkce hostitelských souborů.Syntaxe pouze pro domény: jednoduchý seznam doménových názvů.
Pokud vytváříte seznam zakázaných, doporučujeme použít syntaxi ve stylu Adblock. Oproti staré syntaxi má několik důležitých výhod:
Velikost seznamu zakázaných. Použití porovnávání vzorů umožňuje mít jediné pravidlo namísto stovek záznamů
/etc/hosts.Kompatibilita. Váš seznam zakázaných bude kompatibilní s blokátory reklam v prohlížeči a bude snazší sdílet pravidla se seznamem filtrů prohlížeče.
Rozšiřitelnost. Za posledních deset let se syntaxe ve stylu Adblock značně vyvinula a nevidíme důvod, proč bychom ji nemohli ještě více rozšířit a poskytnout další funkce pro blokátory napříč celou sítí.
Pokud udržujete seznam blokování ve stylu /etc/hosts nebo více seznamů filtrování (bez ohledu na typ), poskytujeme nástroj pro kompilaci seznamu zakázaných. Pojmenovali jsme ho Hostlist kompilátor a sami ho používáme k vytváření filtru AdGuard DNS.
Základní příklady
||example.org^: blokuje přístup k doméněexample.orga jejím subdoménám jakowww.example.org.@@||example.org^: odblokuje přístup k doméněexample.orga jejím subdoménám.1.2.3.4 example.org: (pozor, starý styl syntaxe/etc/hosts) v AdGuard Home, odezva s1.2.3.4do dotazu doményexample.org, ale ne jejích subdomén. V soukromém AdGuard DNS blokuje přístup kexample.org. Doménawww.example.orgzůstává povolena.V AdGuard Home je použití nespecifikované IP adresy (
0.0.0.0) nebo místní adresy (127.0.0.1a pod.) pro hostitele v podstatě stejné jako zablokování tohoto hostitele.# Vrátí IP adresu 1.2.3.4 pro example.org.
1.2.3.4 example.org
# Blokuje doménu example.org odpovědí 0.0.0.0.
0.0.0.0 example.orgexample.org: jednoduché pravidlo domény. Blokuje doménuexample.org, ale ne její subdomény. Doménawww.example.orgzůstává povolena.! Zde je komentářa# Také komentář: komentáře./REGEX/: blokuje přístup doménám, které vyhovují regulárnímu výrazu.
Syntaxe ve stylu Adblock
Toto je podmnožina tradiční syntaxe ve stylu Adblock, kterou používají blokátory reklam v prohlížečích.
rule = ["@@"] pattern [ "$" modifiers ]
modifiers = [modifier0, modifier1[, ...[, modifierN]]]
pattern: maska názvu hostitele. Každý název hostitele se shoduje s touto maskou. Vzor může obsahovat také speciální znaky, které jsou popsány níže.@@: značka, která se používá v pravidlech pro výjimky. Pokud chcete vypnout filtrování odpovídajících názvů hostitele, začněte pravidlo touto značkou.modifiers: parametry, které toto pravidlo upřesňují. Mohou omezit oblast působnosti pravidla nebo dokonce zcela změnit jeho fungování.
Speciální znaky
*: zástupný znak. Používá se k reprezentaci libovolné sady znaků. Může to být také prázdný řetězec nebo řetězec libovolné délky.||: odpovídá začátku názvu hostitele včetně subdomény. Např.||example.orgodpovídáexample.orgatest.example.org, ale netestexample.org.^: oddělovací znak. Na rozdíl od blokování reklam v prohlížeči není v názvu hostitele nic odděleno, takže jediný účel tohoto znaku je označit konec názvu hostitele.|: ukazatel na začátku nebo konci názvu hostitele. Hodnota závisí na umístění znaku v masce. Např. pravidloample.org|odpovídáexample.org, ale neexample.org.com.|exampleodpovídáexample.org, ale netest.example.
Regulární výrazy
Pokud chcete ještě větší flexibilitu při vytváření pravidel, můžete použít regulární výrazy namísto výchozí zjednodušené syntaxe porovnávání. Pokud chcete použít regulární výraz, musí vzor vypadat takto:
pattern = "/" regexp "/"
Příklady:
/example.*/zablokuje hostitele odpovídajícíexample.*regexp.@@/example.*/$importantodblokuje hostitele odpivídajícíexample.*regexp. Všimněte si, že toto pravidlo také zahrnuje modifikátorimportant.
Komentáře
Každý řádek, který začíná vykřičníkem nebo znakem hash, je komentář a filtrovací nástroj jej bude ignorovat. Komentáře se obvykle umísťují nad pravidla a slouží k popisu toho, co pravidlo dělá.
Příklad:
! Toto je komentář.
# Toto je také komentář.
Modifikátory pravidel
Chování pravidla můžete změnit přidáním modifikátorů. Modifikátory musí být umístěny na konci pravidla za znakem $ a musí být odděleny čárkami.
Příklady:
||example.org^je odpovídající vzor.$je oddělovač, který signalizuje, že zbytek pravidla jsou modifikátory.importantje modifikátor.V pravidle můžete použít více modifikátorů. V takovém případě je oddělte čárkami:
||example.org^$client=127.0.0.1,dnstype=A||example.org^je odpovídající vzor.$je oddělovač, který signalizuje, že zbytek pravidla jsou modifikátory.client=127.0.0.1je modifikátorclients jeho hodnotou,127.0.0.1.,je oddělovač mezi modifikátory. A na konecdnstype=Ajednstypes jeho hodnotouA.
Pokud pravidlo obsahuje modifikátor, který není uveden v tomto dokumentu, musí být celé pravidlo ignorováno. Tímto způsobem se vyhneme falešně pozitivním výsledkům, když se lidé pokoušejí používat seznamy filtrů nemodifikovaných blokátorů reklam v prohlížečích, jako je EasyList nebo EasyPrivacy.
client
Modifikátor client umožňuje specifikovat klienty, na které se toto pravidlo vztahuje. Existují dva hlavní způsoby identifikace klienta:
Podle jejich IP adresy nebo prefixu CIDR. Tento způsob funguje pro všechny typy klientů.
Podle jejich názvu. Tento způsob funguje pouze pro trvalé klienty (v AdGuard Home) a zařízení (v soukromý AdGuard DNS), které jste přidali ručně.
poznámkaV AdGuard Home nejsou v současné době podporovány identifikátory klientů, ale pouze názvy. Pokud jste přidali klienta s názvem “My Client“ a identifikátor klienta
my-client, zapište modifikátor jako$client= 'My Client'na rozdíl od$client= my-client.
Syntaxe je:
$client=value1|value2|...
Klienty můžete také vyloučit přidáním znaku ~ před hodnotu. V tomto případě se pravidlo na DNS požadavky tohoto klienta neuplatní.
$client=~value1
Názvy klientů obvykle obsahují mezery nebo jiné speciální znaky, proto byste měli název uzavřít do uvozovek. Podporovány jsou jednoduché i dvojité uvozovky ASCII. Zpětné lomítko (\) použijte k vynechání uvozovek (" a '), čárek (,) a svislých čar (|).
Když vyloučíte klienta, musíte umístit znak ~ mimo uvozovky.
Příklady:
@@||*^$client=127.0.0.1: odblokuje vše pro místního hostitele.||example.org^$client='Frank\'s laptop': zablokuje doménuexample.orgpouze pro klienta s názvemFrank's laptop. Všimněte si, že uvozovka (') v názvu musí být vynechána ze závorek.||example.org^$client=~'Mary\'s\, John\'s\, and Boris\'s laptops': zablokuje doménuexample.orgpro všechny kromě klienta s názvemMary's, John's, and Boris's laptops. Všimněte si, že čárka (,) v názvu musí být též vynechána ze závorek.||example.org^$client=~Mom|~Dad|Kids: zablokuje doménuexample.orgproKids, ale ne proMomandDad. Tento příklad ukazuje, jak zadat více klientů v jednom pravidle.||example.org^$client=192.168.0.0/24: zablokuje doménuexample.orgpro všechny klienty s IP adresami v rozsahu od192.168.0.0do192.168.0.255.
denyallow
Pomocí modifikátoru denyallow můžete domény z pravidla blokování vyloučit. Chcete-li do jednoho pravidla přidat více domén, použijte jako oddělovací znak |.
Syntaxe je:
$denyallow=domain1|domain2|...
Tento modifikátor umožňuje vyhnout se vytváření zbytečných pravidel výjimek, pokud naše blokovací pravidlo pokrývá příliš mnoho domén. Možná budete chtít zablokovat vše kromě několika domén TLD. Můžete použít standardní přístup, tj. tato pravidla:
! Block everything.
/.*/
! Unblock a couple of TLDs.
@@||com^
@@||net^
Problém tohoto přístupu spočívá v tom, že tímto způsobem odblokujete také sledovací domény, které se nacházejí na těchto TLD (tj. google-analytics.com). Zde je návod, jak to vyřešit pomocí denyallow:
*$denyallow=com|net
Příklady:
*$denyallow=com|net: zablokovat vše kromě*.coma*.net.@@*$denyallow=com|net: odblokovat vše kromě*.coma*.net.||example.org^$denyallow=sub.example.org: zablokujeexample.orga*.example.org, ale nesub.example.org.
dnstype
Modifikátor dnstype umožňuje určit typ požadavku nebo DNS odpovědi, na základě kterého bude toto pravidlo spuštěno.
Syntaxe je:
$dnstype=value1|value2|...
$dnstype=~value1|~value2|~...
V názvech typů se nerozlišují velká a malá písmena, ale ověřují se podle sady skutečných typů záznamů o prostředcích DNS (RR).
Nekombinujte pravidla pro výjimky s pravidly pro zařazení. Tohle:
$dnstype=~value1|value2
odpovídá tomuto:
$dnstype=value2
Příklady:
||example.org^$dnstype=AAAA: blokuje DNS dotazy pro adresy IPv6 doményexample.org.||example.org^$dnstype=~A|~CNAME: povoluje pouzeAaCNAMEDNS dotazů proexample.orgzablokuje zbytek.
Před verzí v0.108.0 používal AdGuard Home k filtrování záznamů o odpovědi typ požadavku, nikoli typ samotného záznamu o odpovědi. To způsobovalo problémy, protože to znamenalo, že nebylo možné napsat pravidla, která by v odpovědích na požadavky A a AAAA povolila určité záznamy CNAME. Ve verzi v0.108.0 bylo toto chování změněno, takže nyní je to:
||canon.example.com^$dnstype=~CNAME
umožňuje vyhnout se filtrování následující odpovědi:
ANSWERS:
-> example.com
canonical name = canon.example.com.
ttl = 60
-> canon.example.com
internet address = 1.2.3.4
ttl = 60
dnsrewrite
Modifikátor odpovědi dnsrewrite umožňuje nahradit obsah odpovědi na DNS požadavek pro odpovídající hostitele. Všimněte si, že tento modifikátor v AdGuard Home funguje ve všech pravidlech, ale v soukromém AdGuard DNS pouze ve vlastních pravidlech.
Pravidla s modifikátorem odezvy dnsrewrite mají vyšší prioritu než ostatní pravidla v AdGuard Home a AdGuard DNS.
Odezvy na všechny požadavky na hostitele vyhovující pravidlu dnsrewrite budou nahrazeny. Část odpovědí náhradní odezvy bude obsahovat pouze RR, které odpovídají typu dotazu požadavku, a případně RR CNAME. Všimněte si, že to znamená, že odezvy na některé požadavky mohou být prázdné (NODATA), pokud hostitel odpovídá pravidlu dnsrewrite.
Zkrácená syntaxe je:
$dnsrewrite=1.2.3.4
$dnsrewrite=abcd::1234
$dnsrewrite=example.net
$dnsrewrite=REFUSED
Klíčová slova MUSÍ být napsána velkými písmeny (např. NOERROR). Přepisování klíčových slov má přednost před ostatním a výsledkem bude prázdná odezva s příslušným kódem odezvy.
Úplná syntaxe má tvar RCODE;RRTYPE;VALUE:
$dnsrewrite=NOERROR;A;1.2.3.4
$dnsrewrite=NOERROR;AAAA;abcd::1234
$dnsrewrite=NOERROR;CNAME;example.net
$dnsrewrite=REFUSED;;
Modifikátor $dnsrewrite s kódem odezvy NOERROR může mít také prázdná pole RRTYPE a VALUE.
CNAME je speciální, protože AdGuard Home hostitele přeloží a přidá jeho informace do odezvy. To znamená, že pokud doména example.net má IP adresu 1.2.3.4 a uživatel ji má ve svých pravidlech filtru:
||example.com^$dnsrewrite=example.net
! Nebo:
||example.com^$dnsrewrite=NOERROR;CNAME;example.net
pak bude odezva vypadat asi takto:
nslookup example.com my.adguard.local
Server: my.adguard.local
Adresa: 127.0.0.1#53
Neautorizovaná odpověď:
example.com canonical name = example.net.
Název: example.net
Adresa: 1.2.3.4
Následuje přepis CNAME. Poté se hodnoty všech ostatních záznamů sečtou jako jedna odezva, takže:
||example.com^$dnsrewrite=NOERROR;A;1.2.3.4
||example.com^$dnsrewrite=NOERROR;A;1.2.3.5
bude výsledkem odezva se dvěma záznamy A.
Aktuálně podporované typy RR s příklady:
||4.3.2.1.in-addr.arpa^$dnsrewrite=NOERROR;PTR;example.net.přidáPTRzáznam pro reverzní DNS. Výsledkem reverzních DNS požadavků na1.2.3.4na server DNS budeexample.net.poznámkaIP adresa MUSÍ být v obráceném pořadí. Viz RFC 1035.
||example.com^$dnsrewrite=NOERROR;A;1.2.3.4přidá odezvuAs hodnotou1.2.3.4.||example.com^$dnsrewrite=NOERROR;AAAA;abcd::1234přidá záznamAAAAs hodnotouabcd::1234.||example.com^$dnsrewrite=NOERROR;CNAME;example.orgpřidá záznamCNAME. Viz vysvětlení výše.||example.com^$dnsrewrite=NOERROR;HTTPS;32 example.com alpn=h3přidá záznamHTTPS. Podporována je pouze podmnožina hodnot parametrů: hodnoty musí na sebenavazovata tam, kde seočekáváseznam hodnot, je v současné době podporována pouze jedna hodnota:ipv4hint=127.0.0.1 // podporováno.
ipv4hint="127.0.0.1" // nepodporováno.
ipv4hint=127.0.0.1,127.0.0.2 // nepodporováno.
ipv4hint="127.0.0.1,127.0.0.2" // nepodporováno.To bude v budoucnu změněno.
||example.com^$dnsrewrite=NOERROR;MX;32 example.mailpřidá záznamMXs přednostní hodnotou32a změní hodnotuexample.mail.||example.com^$dnsrewrite=NOERROR;SVCB;32 example.com alpn=h3přidá hodnotuSVCB. Viz výše uvedený příkladHTTPS.||example.com^$dnsrewrite=NOERROR;TXT;hello_worldpřidá záznamTXTs hodnotouhello_world.||_svctype._tcp.example.com^$dnsrewrite=NOERROR;SRV;10 60 8080 example.compřidá záznamSRVs přednostní hodnotou10, hodnota60, port8080, a cíl hodnotyexample.com.||example.com^$dnsrewrite=NXDOMAIN;;odpoví s kódemNXDOMAIN.$dnstype=AAAA,denyallow=example.org,dnsrewrite=NOERROR;;odpoví s prázdnou odezvouNOERRORpro všechny požadavkyAAAAmimo jeden proexample.org.
Pravidla výjimek odblokují jedno nebo všechna pravidla:
@@||example.com^$dnsrewriteodblokuje všechna pravidla pro přepis DNS.@@||example.com^$dnsrewrite=1.2.3.4odblokuje pravidlo pro přepis DNS, které přidá záznamAs hodnotou1.2.3.4.
Pokud spravujete seznam zakázaných, který je zahrnut do AdGuard DNS a AdGuard Home (tj. zahrnut do HostlistsRegistry), budou pravidla $dnsrewrite automaticky odfiltrována. Pokud jsou tato pravidla vyžadována pro váš seznam zakázaných, požádejte o oprávnění otevřením nového problému v repozitáři HostlistsRegistry.
important
Modifikátor important použitý na pravidlo zvyšuje jeho prioritu před jakýmkoli jiným pravidlem bez modifikátoru. Dokonce i přes základní pravidla výjimek.
Příklady:
V tomto příkladu:
||example.org^$important
@@||example.org^||example.org^$importantzablokuje všechny požadavky na doménu*.example.orgnavzdory pravidlu výjimky.V tomto příkladu:
||example.org^$important
@@||example.org^$importantpravidlo výjimky má také modifikátor
important, takže bude fungovat.
badfilter
Pravidla s modifikátorem badfilter vypnou ostatní základní pravidla, na která se vztahují. To znamená, že text vypnutého pravidla by měl odpovídat textu pravidla badfilter (bez modifikátoru badfilter).
Příklady:
||example.com$badfilterzakáže||example.com.@@||example.org^$badfilterzakáže@@||example.org^.poznámkaModifikátor
badfilterv současné době nefunguje s pravidly ve stylu/etc/hosts.127.0.0.1 example.org$badfilternezakáže **** původní pravidlo127.0.0.1 example.org.
ctag
Modifikátor ctag lze použít pouze v AdGuard Home.
Umožňuje blokovat domény pouze pro určité typy značek klientů DNS. Značky můžete klientům přiřadit v uživatelském rozhraní AdGuard Home. V budoucnu plánujeme automatické přiřazování značek na základě analýzy chování jednotlivých klientů.
Syntaxe je:
$ctag=value1|value2|...
Pokud jedna ze značek klienta odpovídá hodnotám ctag, toto pravidlo se na klienta vztahuje. Syntaxe pro výjimku je:
$ctag=~value1|~value2|...
Pokud jedna ze značek klienta odpovídá hodnotám vylučujícím ctag, toto pravidlo se na klienta nevztahuje.
Příklady:
||example.org^$ctag=device_pc|device_phone: zablokujeexample.orgpro klienty označené jakodevice_pcnebodevice_phone.||example.org^$ctag=~device_phone: zablokujeexample.orgpro všechny klienty kromě těch, kteří jsou označeni jakodevice_phone.
Seznam povolených značek:
Podle typu zařízení:
device_audio: audio zařízení.device_camera: fotoaparáty.device_gameconsole: herní konzole.device_laptop: notebooky.device_nas: NAS servery (Síťová úložiště).device_pc: stolní počítače.device_phone: telefony.device_printer: tiskárny.device_securityalarm: bezpečnostní alarmy.device_tablet: tablety.device_tv: televizory.device_other: ostatní zařízení.
Podle operačního systému:
os_android: Android.os_ios: iOS.os_linux: Linux.os_macos: macOS.os_windows: Windows.os_other: ostatní operační systémy.
Podle skupiny uživatelů:
user_admin: administrátoři.user_regular: běžní uživatelé.user_child: děti.
Syntaxe stylu /etc/hosts
Pro každého hostitele by měl být uveden jeden řádek s následujícími informacemi:
IP_address canonical_hostname [aliases...]
Pole záznamů jsou oddělena libovolným počtem znaků mezery nebo tabulátoru. Text od znaku # do konce řádku je komentář a je ignorován.
Hostitelské názvy mohou obsahovat pouze alfanumerické znaky, pomlčky a znaménka (-) a tečky (.). Musí začínat abecedním znakem a končit alfanumerickým znakem. Volitelné aliasy umožňují změny názvů, alternativní hláskování, kratší hostitelské názvy nebo obecné hostitelské názvy (například localhost).
Příklad:
# Toto je komentář
127.0.0.1 example.org example.info
127.0.0.1 example.com
127.0.0.1 example.net # toto je taky komentář
V AdGuard Home se IP adresy používají k odpovědi na DNS dotazy pro tyto domény. V soukromém AdGuard DNS jsou tyto adresy jednoduše blokovány.
Syntaxe pouze pro domény
Jednoduchý seznam názvů domén, jeden název na řádek.
Příklad:
# Toto je komentář
example.com
example.org
example.net # toto je také komentář
Pokud řetězec není platnou doménou (např. *.example.org), bude jej AdGuard Home považovat za pravidlo ve stylu AdBlock.
Překladač hostitelských seznamů
Pokud spravujete seznam zakázaných a používáte v něm různé zdroje, může se vám hodit kompilátor Hostitelských seznamů. Jedná se o jednoduchý nástroj, který usnadňuje sestavení seznamu blokovaných hostitelů kompatibilního s AdGuard Home, soukromým AdGuard DNS nebo jiným produktem AdGuard s DNS filtrováním.
Co dokáže:
Sestavit jeden seznam blokování z více zdrojů.
Vyloučit pravidla, která nepotřebujete.
Vyčistit výsledný seznamu: deduplikace, odstranění neplatných pravidel a komprese seznamu.