Итак, чтобы заблокировать рекламу в домашней сети, вам нужен свой 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 и реклама будет блокироваться.
Теперь нужно научить ваши мобильники использовать этот сервер. Как это сделать, я расскажу чуть позже.