Когда задолбала реклама

Итак, чтобы заблокировать рекламу в домашней сети, вам нужен свой DNS сервер, который будет обновлять листы агрегаторов и выдавать вам адрес сайта с рекламой, адрес «127.0.0.1».

Для этого, вам понадобится виртуальный сервер. Для тех, кто совсем платить не хочет, советую обратить внимание на AWS Cloud или Google cloud. AWS обеспечит вам возможность пользоваться вирталкой целый год, Google cloud даст $300 на ресурсы. Ну или можете таки купить виртуальный сервер до $5 в месяц, и не придется каждый раз все переустанавливать. В принципе, можно установить все даже в домашней сети, на компьютер (виртуалку) с Linux и пользоваться этим сервером только в домашней сети, но тогда и реклама будет блокироваться только в домашней сети.

В общем, для старта вам нужен Ubuntu 21.04.

Для начала, устанавливаем unbound. Это тот самый DNS сервер.

sudo apt install unbound

Теперь меняем файл конфигурации unbound — /etc/unbound/unbound.conf

include-toplevel: "/etc/unbound/unbound.conf.d/*.conf"

# Allow unbound-control
remote-control:
  control-enable: yes

server:
  use-syslog: yes

  # Refresh expiring cache entries, if less than 10% of their TTL remains
  prefetch: yes

  # Serve stale data if not older than 1 day
  serve-expired: yes
  serve-expired-ttl: 86400  # one day, in seconds

  # Timeout request and serve stable data if it takes longer than 1.8 seconds
  serve-expired-client-timeout: 1800  # 1.8 seconds, in milliseconds

  # Some logging to see what is going on
  verbosity: 2
  log-queries: yes

  interface: 0.0.0.0
  interface: ::0

# Who can use our Unbound server
#
# Сюда можно добавить адреса, с которых разрешено отправлять запросы.
# К примеру, ваш домашний IP адрес, который можно узнать, зайдя на сайт
# http://ipaddrs.com
# 
# Чтобы добавить адрес "1.2.3.4", добавьте строку:
# access-control: 1.2.3.4/32 allow
#
  access-control: 127.0.0.1/8 allow
  access-control: ::1/64 allow
  do-ip4: yes
  #do-ip6: yes
  do-udp: yes
  do-tcp: yes

  # Certificates
  tls-cert-bundle: /etc/ssl/certs/ca-certificates.crt

  # Здесь указан путь к вашему списку сайтов для блокировки.
  include: /etc/unbound/adblock.conf

# Forward all queries to Quad9 and CloudFlare, with DNS over TLS
forward-zone:
  name: "."
  forward-tls-upstream: yes

  # Quad9
  #forward-addr: 2620:fe::fe@853#dns.quad9.net
  forward-addr: 9.9.9.9@853#dns.quad9.net
  #forward-addr: 2620:fe::9@853#dns.quad9.net
  forward-addr: 149.112.112.112@853#dns.quad9.net

  # Cloudflare DNS
  #forward-addr: 2606:4700:4700::1111@853#cloudflare-dns.com
  forward-addr: 1.1.1.1@853#cloudflare-dns.com
  #forward-addr: 2606:4700:4700::1001@853#cloudflare-dns.com
  forward-addr: 1.0.0.1@853#cloudflare-dns.com

Не забудьте добавить IP адрес домашней сети.

Теоретически, ничего не мешает добавить вам сюда разрешение для всех адресов (0.0.0.0/0), но очень скоро ваш сервер начнут использовать хакеры, спасмеры и прочий сброд. Мало того, за увеличившийся трафик, вам «прилетит» от хостера, который скорее всего, просто отключит ваш сервер.

Теперь нам нужно создать файлик со списком рекламных агрегаторов. Для этого нам понадобится простой скрипт на Python:

#!/usr/bin/env python3

import urllib.request
import ssl
import re
from datetime import datetime

links = [
            "https://cdn.jsdelivr.net/gh/tarampampam/mikrotik-hosts-parser@master/.hosts/basic.txt",
            "https://adaway.org/hosts.txt",
            "https://www.malwaredomainlist.com/hostslist/hosts.txt",
            "https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext",
            "https://someonewhocares.org/hosts/hosts",
            "http://winhelp2002.mvps.org/hosts.txt"
        ]

now = datetime.now()
dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
print ("###########################################################################################")
print ("### Generated: " + dt_string)
print ("###########################################################################################")
# links = open('/root/spam/links.txt', 'r')
pattern = "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])"
regex = re.compile(pattern)

for line in links:
    context = ssl._create_unverified_context()
    try:
      contents = urllib.request.urlopen(line, context=context).readlines()
      for host in contents:
        filtered = host.decode("utf-8").strip()
        if regex.match(filtered):
          hostdata = filtered.split(' ')
          if hostdata[1]:
            print("local-zone: \"" + hostdata[1] +"\" redirect")
            print("local-data: \"" + hostdata[1] + " A " + hostdata[0] + "\"")
    except:
      pass

Сохраните его как /etc/unbound/confgen.py и сделайте запускаемым:

sudo chmod a+x /etc/unbound/conftest.py

Этот скрипт берет список адресов агрегаторов, и выдает его в формате для вашего unbound. Теперь нужно сделать это обновление регулярным. Для этого, добавляем в его запуск в cron:

$ sudo crontab -e

Добавляем строку:

0 3 * * * /etc/unbound/conftest.py > /etc/unbound/adblock.conf && unbound-checkconf && unbound-control reload || echo "Unbound config check failed"

Не забываем нажать Enter, чтобы добавить пустую строку и сохраняем файл.

Теперь нужно создать файл /etc/unbound/adblock.conf, чтобы наш unbound заработал:

$ sudo /etc/unbound/conftest.py > /etc/unbound/adblock.conf

Теперь отключаем dns-resolver и запускаем unbound:

sudo systemctl disable systemd-resolved.service
sudo systemctl stop systemd-resolved
sudo systemctl enable unbound
sudo systemctl restart unbound

Проверяем DNS запросом:

$ nslookup googleadservices.com localhost

Server:		localhost
Address:	127.0.0.1#53

Name:	googleadservices.com
Address: 127.0.0.1

Если все установилось как нужно, ответ будет именно таким. И теперь, вы можете использовать этот DNS сервер.

Если вы добавили IP адрес домашней сети в конфиг unbound, вы уже можете на любом устройстве в домашней сети (лучше всего прямо на роутере) установить IP адрес вашего сервера как DNS и реклама будет блокироваться.

Теперь нужно научить ваши мобильники использовать этот сервер. Как это сделать, я расскажу чуть позже.