You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

311 lines
28 KiB

  1. <!-- markdownlint-disable -->
  2. # DNS based ad/abuse domain blocking
  3. ## Description
  4. A lot of people already use adblocker plugins within their desktop browsers, but what if you are using your (smart) phone, tablet, watch or any other (wlan) gadget!? Getting rid of annoying ads, trackers and other abuse sites (like facebook) is simple: block them with your router. When the DNS server on your router receives DNS requests, you will sort out queries that ask for the resource records of ad servers and return a simple 'NXDOMAIN'. This is nothing but **N**on-e**X**istent Internet or Intranet domain name, if domain name is unable to resolved using the DNS server, a condition called the 'NXDOMAIN' occurred.
  5. ## Main Features
  6. * Support of the following fully pre-configured domain blocklist sources (free for private usage, for commercial use please check their individual licenses)
  7. | Source | Enabled | Size | Focus | Information |
  8. | :------------------ | :-----: | :--- | :--------------- | :-------------------------------------------------------------------------------- |
  9. | adaway | x | S | mobile | [Link](https://github.com/AdAway/adaway.github.io) |
  10. | adguard | x | L | general | [Link](https://adguard.com) |
  11. | adguard_tracking | | S | tracking | [Link](https://github.com/AdguardTeam/cname-trackers) |
  12. | android_tracking | | S | tracking | [Link](https://github.com/Perflyst/PiHoleBlocklist) |
  13. | andryou | | L | compilation | [Link](https://gitlab.com/andryou/block/-/blob/master/readme.md) |
  14. | anti_ad | | L | compilation | [Link](https://github.com/privacy-protection-tools/anti-AD/blob/master/README.md) |
  15. | anudeep | | M | compilation | [Link](https://github.com/anudeepND/blacklist) |
  16. | bitcoin | | S | mining | [Link](https://github.com/hoshsadiq/adblock-nocoin-list) |
  17. | disconnect | x | S | general | [Link](https://disconnect.me) |
  18. | energized | | VAR | compilation | [Link](https://energized.pro) |
  19. | firetv_tracking | | S | tracking | [Link](https://github.com/Perflyst/PiHoleBlocklist) |
  20. | games_tracking | | S | tracking | [Link](https://www.gameindustry.eu) |
  21. | hblock | | XL | compilation | [Link](https://hblock.molinero.dev) |
  22. | notracking | | XL | tracking | [Link](https://github.com/notracking/hosts-blocklists) |
  23. | oisd_basic | | L | general | [Link](https://oisd.nl) |
  24. | oisd_nsfw | | XL | general | [Link](https://oisd.nl) |
  25. | oisd_full | | XXL | general | [Link](https://oisd.nl) |
  26. | openphish | | S | phishing | [Link](https://openphish.com) |
  27. | phishing_army | | S | phishing | [Link](https://phishing.army) |
  28. | reg_cn | | M | reg_china | [Link](https://easylist.to) |
  29. | reg_cz | | M | reg_czech+slovak | [Link](https://easylist.to) |
  30. | reg_de | | M | reg_germany | [Link](https://easylist.to) |
  31. | reg_es | | M | reg_espania | [Link](https://easylist.to) |
  32. | reg_fi | | S | reg_finland | [Link](https://github.com/finnish-easylist-addition) |
  33. | reg_fr | | S | reg_france | [Link](https://forums.lanik.us/viewforum.php?f=91) |
  34. | reg_id | | M | reg_indonesia | [Link](https://easylist.to) |
  35. | reg_it | | M | reg_italy | [Link](https://easylist.to) |
  36. | reg_kr | | S | reg_korea | [Link](https://github.com/List-KR/List-KR) |
  37. | reg_nl | | M | reg_netherlands | [Link](https://easylist.to) |
  38. | reg_pl1 | | S | reg_poland | [Link](https://kadantiscam.netlify.com) |
  39. | reg_pl2 | | S | reg_poland | [Link](https://www.certyficate.it) |
  40. | reg_ro | | M | reg_romania | [Link](https://easylist.to) |
  41. | reg_ru | | M | reg_russia | [Link](https://easylist.to) |
  42. | reg_se | | M | reg_sweden | [Link](https://github.com/lassekongo83/Frellwits-filter-lists) |
  43. | reg_vn | | S | reg_vietnam | [Link](https://bigdargon.github.io/hostsVN) |
  44. | smarttv_tracking | | S | tracking | [Link](https://github.com/Perflyst/PiHoleBlocklist) |
  45. | spam404 | | S | general | [Link](https://github.com/Dawsey21) |
  46. | stevenblack | | VAR | compilation | [Link](https://github.com/StevenBlack/hosts) |
  47. | stopforumspam | | S | spam | [Link](https://www.stopforumspam.com) |
  48. | utcapitole | | VAR | general | [Link](https://dsi.ut-capitole.fr/blacklists/index_en.php) |
  49. | wally3k | | S | compilation | [Link](https://firebog.net/about) |
  50. | whocares | | M | general | [Link](https://someonewhocares.org) |
  51. | winhelp | | S | general | [Link](https://winhelp2002.mvps.org) |
  52. | winspy | | S | win_telemetry | [Link](https://github.com/crazy-max/WindowsSpyBlocker) |
  53. | yoyo | x | S | general | [Link](https://pgl.yoyo.org/adservers) |
  54. * List of supported and fully pre-configured adblock sources, already active sources are pre-selected.
  55. <b><em>To avoid OOM errors, please do not select too many lists!</em></b>
  56. List size information with the respective domain ranges as follows:
  57. <b>S</b> (-10k), <b>M</b> (10k-30k) and <b>L</b> (30k-80k) should work for 128 MByte devices,
  58. <b>XL</b> (80k-200k) should work for 256-512 MByte devices,
  59. <b>XXL</b> (200k-) needs more RAM and Multicore support, e.g. x86 or raspberry devices.
  60. <b>VAR</b> (50k-500k) variable size depending on the selection.
  61. * Zero-conf like automatic installation & setup, usually no manual changes needed
  62. * Simple but yet powerful adblock engine: adblock does not use error prone external iptables rulesets, http pixel server instances and things like that
  63. * Supports five different DNS backend formats: dnsmasq, unbound, named (bind), kresd or raw (e.g. used by dnscrypt-proxy)
  64. * Supports four different SSL-enabled download utilities: uclient-fetch, wget, curl or aria2c
  65. * Supports SafeSearch for google, bing, duckduckgo, yandex, youtube and pixabay
  66. * Supports RPZ-trigger 'RPZ-CLIENT-IP' to always allow/deny certain DNS clients based on their IP address (currently only supported by bind dns backend)
  67. * Fast downloads & list processing as they are handled in parallel running background jobs with multicore support
  68. * Supports a wide range of router modes, even AP modes are supported
  69. * Full IPv4 and IPv6 support
  70. * Provides top level domain compression ('tld compression'), this feature removes thousands of needless host entries from the blocklist and lowers the memory footprint for the DNS backend
  71. * Provides a 'DNS File Reset', where the generated DNS blocklist file will be purged after DNS backend loading to save storage space
  72. * Source parsing by fast & flexible regex rulesets, all rules and source information are placed in an external/compredd JSON file ('/etc/adblock/adblock.sources.gz')
  73. * Overall duplicate removal in generated blocklist file 'adb_list.overall'
  74. * Additional local blacklist for manual overrides, located in '/etc/adblock/adblock.blacklist'
  75. * Additional local whitelist for manual overrides, located in '/etc/adblock/adblock.whitelist'
  76. * Quality checks during blocklist update to ensure a reliable DNS backend service
  77. * Minimal status & error logging to syslog, enable debug logging to receive more output
  78. * Procd based init system support ('start', 'stop', 'restart', 'reload', 'enable', 'disable', 'running', 'status', 'suspend', 'resume', 'query', 'report', 'list', 'timer')
  79. * Auto-Startup via procd network interface trigger or via classic time based startup
  80. * Suspend & Resume adblock temporarily without blocklist reloading
  81. * Provides comprehensive runtime information
  82. * Provides a detailed DNS Query Report with DNS related information about client requests, top (blocked) domains and more
  83. * Provides a powerful query function to quickly find blocked (sub-)domains, e.g. for whitelisting
  84. * Provides an easily configurable blocklist update scheduler called 'Refresh Timer'
  85. * Includes an option to generate an additional, restrictive 'adb_list.jail' to block access to all domains except those listed in the whitelist file. You can use this restrictive blocklist manually e.g. for guest wifi or kidsafe configurations
  86. * Includes an option to force DNS requests to the local resolver
  87. * Automatic blocklist backup & restore, these backups will be used in case of download errors and during startup
  88. * Send notification E-Mails in case of a processing error or if the overall domain count is &le; 0
  89. * Add new adblock sources on your own, see example below
  90. * Strong LuCI support, all relevant options are exposed to the web frontend
  91. ## Prerequisites
  92. * [OpenWrt](https://openwrt.org), tested with the stable release series (19.07.x) and with the latest rolling snapshot releases. On turris devices it has been successfully tested with TurrisOS 5.1.x
  93. <b>Please note:</b> Older OpenWrt releases like 18.06.x or 17.01.x are _not_ supported!
  94. <b>Please note:</b> Devices with less than 128 MByte RAM are _not_ supported!
  95. * A usual setup with an enabled DNS backend at minimum - dump AP modes without a working DNS backend are _not_ supported
  96. * A download utility with SSL support: 'wget', 'uclient-fetch' with one of the 'libustream-*' ssl libraries, 'aria2c' or 'curl' is required
  97. * A certificate store such as 'ca-bundle' or 'ca-certificates', as adblock checks the validity of the SSL certificates of all download sites by default
  98. * Optional E-Mail notification support: for E-Mail notifications you need to install the additional 'msmtp' package
  99. * Optional DNS Query Report support: for DNS reporting you need to install the additional package 'tcpdump-mini' or 'tcpdump'
  100. * Optional support for gnu awk as alternative to the busybox default, install the additional package 'gawk'
  101. ## Installation & Usage
  102. * Update your local opkg repository (_opkg update_)
  103. * Install 'adblock' (_opkg install adblock_). The adblock service is enabled by default
  104. * Install the LuCI companion package 'luci-app-adblock' (_opkg install luci-app-adblock_)
  105. * It's strongly recommended to use the LuCI frontend to easily configure all aspects of adblock, the application is located in LuCI under the 'Services' menu
  106. * Update from a former adblock version is easy. During the update a backup is made of the old configuration '/etc/config/adblock-backup' and replaced by the new config - that's all
  107. ## Adblock CLI Options
  108. * All important adblock functions are accessible via CLI as well.
  109. <pre><code>
  110. ~# /etc/init.d/adblock
  111. Syntax: /etc/init.d/adblock [command]
  112. Available commands:
  113. start Start the service
  114. stop Stop the service
  115. restart Restart the service
  116. reload Reload configuration files (or restart if service does not implement reload)
  117. enable Enable service autostart
  118. disable Disable service autostart
  119. enabled Check if service is started on boot
  120. suspend Suspend adblock processing
  121. resume Resume adblock processing
  122. query &lt;domain&gt; Query active blocklists and backups for a specific domain
  123. report [&lt;search&gt;] Print DNS statistics with an optional search parameter
  124. list [&lt;add&gt;|&lt;add_sha&gt;|&lt;add_utc&gt;|&lt;add_eng&gt;|&lt;add_stb&gt;|&lt;remove&gt;|&lt;remove_sha&gt;|&lt;remove_utc&gt;|&lt;remove_eng&gt;|&lt;remove_stb&gt;] &lt;source(s)&gt; List/Edit available sources
  125. timer [&lt;add&gt; &lt;tasks&gt; &lt;hour&gt; [&lt;minute&gt;] [&lt;weekday&gt;]]|[&lt;remove&gt; &lt;line no.&gt;] List/Edit cron update intervals
  126. version Print version information
  127. running Check if service is running
  128. status Service status
  129. trace Start with syscall trace
  130. </code></pre>
  131. ## Adblock Config Options
  132. * Usually the auto pre-configured adblock setup works quite well and no manual overrides are needed
  133. | Option | Default | Description/Valid Values |
  134. | :----------------- | :--------------------------------- | :--------------------------------------------------------------------------------------------- |
  135. | adb_enabled | 1, enabled | set to 0 to disable the adblock service |
  136. | adb_srcarc | -, /etc/adblock/adblock.sources.gz | full path to the used adblock source archive |
  137. | adb_srcfile | -, /tmp/adb_sources.json | full path to the used adblock source file, which has a higher precedence than the archive file |
  138. | adb_dns | -, auto-detected | 'dnsmasq', 'unbound', 'named', 'kresd' or 'raw' |
  139. | adb_fetchutil | -, auto-detected | 'uclient-fetch', 'wget', 'curl' or 'aria2c' |
  140. | adb_fetchparm | -, auto-detected | manually override the config options for the selected download utility |
  141. | adb_fetchinsecure | 0, disabled | don't check SSL server certificates during download |
  142. | adb_trigger | -, not set | trigger network interface or 'not set' to use a time-based startup |
  143. | adb_triggerdelay | 2 | additional trigger delay in seconds before adblock processing begins |
  144. | adb_debug | 0, disabled | set to 1 to enable the debug output |
  145. | adb_nice | 0, standard prio. | valid nice level range 0-19 of the adblock processes |
  146. | adb_forcedns | 0, disabled | set to 1 to force DNS requests to the local resolver |
  147. | adb_maxqueue | 4 | size of the download queue to handle downloads & list processing in parallel |
  148. | adb_dnsdir | -, auto-detected | path for the generated blocklist file 'adb_list.overall' |
  149. | adb_dnstimeout | 10 | timeout in seconds to wait for a successful DNS backend restart |
  150. | adb_dnsinstance | 0, first instance | set to the relevant dns backend instance used by adblock (dnsmasq only) |
  151. | adb_dnsflush | 0, disabled | set to 1 to flush the DNS Cache before & after adblock processing |
  152. | adb_dnsinotify | -, not set | set to 1 to prevent adblock triggered restarts for DNS backends with autoload functions |
  153. | adb_dnsallow | -, not set | set to 1 to disable selective DNS whitelisting (RPZ-PASSTHRU) |
  154. | adb_lookupdomain | example.com | external domain to check for a successful DNS backend restart or 'false' to disable this check |
  155. | adb_portlist | 53 853 5353 | space separated list of firewall ports which should be redirected locally |
  156. | adb_report | 0, disabled | set to 1 to enable the background tcpdump gathering process for reporting |
  157. | adb_reportdir | /tmp | path for DNS related report files |
  158. | adb_repiface | -, auto-detected | name of the reporting interface or 'any' used by tcpdump |
  159. | adb_replisten | 53 | space separated list of reporting port(s) used by tcpdump |
  160. | adb_repchunkcnt | 5 | report chunk count used by tcpdump |
  161. | adb_repchunksize | 1 | report chunk size used by tcpdump in MB |
  162. | adb_represolve | 0, disabled | resolve reporting IP addresses using reverse DNS (PTR) lookups |
  163. | adb_backup | 1, enabled | set to 0 to disable the backup function |
  164. | adb_backupdir | /tmp | path for adblock backups |
  165. | adb_tmpbase | /tmp | path for all adblock related runtime operations, e.g. downloading, sorting, merging etc. |
  166. | adb_safesearch | 0, disabled | set to 1 to enforce SafeSearch for google, bing, duckduckgo, yandex, youtube and pixabay |
  167. | adb_safesearchlist | -, not set | Limit SafeSearch to certain provider (see above) |
  168. | adb_safesearchmod | 0, disabled | set to 1 to enable moderate SafeSearch filters for youtube |
  169. | adb_mail | 0, disabled | set to 1 to enable notification E-Mails in case of a processing errors |
  170. | adb_mailreceiver | -, not set | receiver address for adblock notification E-Mails |
  171. | adb_mailsender | no-reply@adblock | sender address for adblock notification E-Mails |
  172. | adb_mailtopic | adblock&nbsp;notification | topic for adblock notification E-Mails |
  173. | adb_mailprofile | adb_notify | mail profile used in 'msmtp' for adblock notification E-Mails |
  174. | adb_mailcnt | 0 | minimum domain count to trigger E-Mail notifications |
  175. | adb_jail | 0 | set to 1 to enable the additional, restrictive 'adb_list.jail' creation |
  176. | adb_jaildir | /tmp | path for the generated jail list |
  177. ## Examples
  178. **Change the DNS backend to 'unbound':**
  179. No further configuration is needed, adblock deposits the final blocklist 'adb_list.overall' in '/var/lib/unbound' by default.
  180. To preserve the DNS cache after adblock processing please install the additional package 'unbound-control'.
  181. **Change the DNS backend to 'bind':**
  182. Adblock deposits the final blocklist 'adb_list.overall' in '/var/lib/bind' by default.
  183. To preserve the DNS cache after adblock processing please install the additional package 'bind-rdnc'.
  184. To use the blocklist please modify '/etc/bind/named.conf':
  185. <pre><code>
  186. in the 'options' namespace add:
  187. response-policy { zone "rpz"; };
  188. and at the end of the file add:
  189. zone "rpz" {
  190. type master;
  191. file "/var/lib/bind/adb_list.overall";
  192. allow-query { none; };
  193. allow-transfer { none; };
  194. };
  195. </code></pre>
  196. **Change the DNS backend to 'kresd':**
  197. Adblock deposits the final blocklist 'adb_list.overall' in '/etc/kresd', no further configuration needed.
  198. <b>Please note:</b> The knot-resolver (kresd) is only available on Turris devices and does not support the SafeSearch functionality yet.
  199. **Use restrictive jail modes:**
  200. You can enable a restrictive 'adb_list.jail' to block access to all domains except those listed in the whitelist file. Usually this list will be generated as an additional list for guest or kidsafe configurations (for a separate dns server instance). If the jail directory points to your primary dns directory, adblock enables the restrictive jail mode automatically (jail mode only).
  201. **Manually override the download options:**
  202. By default adblock uses the following pre-configured download options:
  203. * aria2c: <code>--timeout=20 --allow-overwrite=true --auto-file-renaming=false --log-level=warn --dir=/ -o</code>
  204. * curl: <code>--connect-timeout 20 --silent --show-error --location -o</code>
  205. * uclient-fetch: <code>--timeout=20 -O</code>
  206. * wget: <code>--no-cache --no-cookies --max-redirect=0 --timeout=20 -O</code>
  207. To override the default set 'adb_fetchparm' manually to your needs.
  208. **Enable E-Mail notification via 'msmtp':**
  209. To use the email notification you have to install & configure the package 'msmtp'.
  210. Modify the file '/etc/msmtprc':
  211. <pre><code>
  212. [...]
  213. defaults
  214. auth on
  215. tls on
  216. tls_certcheck off
  217. timeout 5
  218. syslog LOG_MAIL
  219. [...]
  220. account adb_notify
  221. host smtp.gmail.com
  222. port 587
  223. from dev.adblock@gmail.com
  224. user dev.adblock
  225. password xxx
  226. </code></pre>
  227. Finally enable E-Mail support and add a valid E-Mail receiver address in LuCI.
  228. **Service status output:**
  229. In LuCI you'll see the realtime status in the 'Runtime' section on the overview page.
  230. To get the status in the CLI, just call _/etc/init.d/adblock status_ or _/etc/init.d/adblock status\_service_ (in 19.07 and TurrisOS):
  231. <pre><code>
  232. ~# /etc/init.d/adblock status
  233. ::: adblock runtime information
  234. + adblock_status : enabled
  235. + adblock_version : 4.1.0
  236. + blocked_domains : 32658
  237. + active_sources : android_tracking, disconnect, shallalist
  238. + dns_backend : dnsmasq, /tmp/dnsmasq.d
  239. + run_utils : /usr/bin/curl, /usr/bin/gawk
  240. + run_ifaces : trigger: trm_wwan, report: br-lan
  241. + run_directories : base: /tmp, backup: /tmp/adblock-Backup, report: /tmp/adblock-Report, jail: /tmp
  242. + run_flags : backup: 1, flush: 0, force: 1, search: 1, report: 1, mail: 0, jail: 0
  243. + last_run : reload, 0m 25s, 252/177/167, 26.02.2021 18:31:41
  244. + system : GL.iNet GL-MT1300, OpenWrt SNAPSHOT r15875-1bf6d70e60
  245. </code></pre>
  246. The 'last\_run' line includes the used start type, the run duration, the memory footprint after DNS backend loading (total/free/available) and the date/time of the last run.
  247. **Edit, add new adblock sources:**
  248. The adblock blocklist sources are stored in an external, compressed JSON file '/etc/adblock/adblock.sources.gz'.
  249. This file is directly parsed in LuCI and accessible via CLI, just call _/etc/init.d/adblock list_:
  250. <pre><code>
  251. /etc/init.d/adblock list
  252. ::: Available adblock sources
  253. :::
  254. Name Enabled Size Focus Info URL
  255. ------------------------------------------------------------------
  256. + adaway x S mobile https://adaway.org
  257. + adguard x L general https://adguard.com
  258. + andryou x L compilation https://gitlab.com/andryou/block/-/blob/master/readme.md
  259. + bitcoin x S mining https://github.com/hoshsadiq/adblock-nocoin-list
  260. + disconnect x S general https://disconnect.me
  261. + dshield XL general https://www.dshield.org
  262. [...]
  263. + winhelp S general http://winhelp2002.mvps.org
  264. + winspy x S win_telemetry https://github.com/crazy-max/WindowsSpyBlocker
  265. + yoyo x S general https://pgl.yoyo.org
  266. </code></pre>
  267. To add new or edit existing sources extract the compressed JSON file _gunzip /etc/adblock/adblock.sources.gz_.
  268. A valid JSON source object contains the following required information, e.g.:
  269. <pre><code>
  270. [...]
  271. "adaway": {
  272. "url": "https://raw.githubusercontent.com/AdAway/adaway.github.io/master/hosts.txt",
  273. "rule": "/^127\\.0\\.0\\.1[[:space:]]+([[:alnum:]_-]+\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}",
  274. "size": "S",
  275. "focus": "mobile",
  276. "descurl": "https://github.com/AdAway/adaway.github.io"
  277. },
  278. [...]
  279. </code></pre>
  280. Add an unique object name, make the required changes to 'url', 'rule', 'size' and 'descurl' and finally compress the changed JSON file _gzip /etc/adblock/adblock.sources.gz_ to use the new source object in adblock.
  281. <b>Please note:</b> if you're going to add new sources on your own, please make a copy of the default file and work with that copy further on, cause the default will be overwritten with every adblock update. To reference your copy set the option 'adb\_srcarc' which points by default to '/etc/adblock/adblock.sources.gz'
  282. <b>Please note:</b> when adblock starts, it looks for the uncompressed 'adb\_srcfile', only if this file is not found the archive 'adb\_srcarc' is unpacked once and then the uncompressed file is used
  283. ## Support
  284. Please join the adblock discussion in this [forum thread](https://forum.openwrt.org/t/adblock-support-thread/507) or contact me by mail <dev@brenken.org>
  285. Have fun!
  286. Dirk