Linux: Блокировать запросы dns с помощью dnsmasq

На своём роутере (ASUS RT-N66U) я попытался заблокировать DNS запросы для телевизора Самсунг:
FirewallURL Filter
Но блокировка не сработала. Причина довольно смешная:

Https webpages cannot be filtered.

Я подумал, что может это ограничение только из-за того, что мой роутер не совсем новый. В надежде, что у новых моделей этой проблемы нет, я почитал инструкцию к одному из самых дорогих роутеров ASUS — там было то же самое!
Тогда я решил попробовать заблокировать эти сайты через dnsmasq, подключившись к роутеру через ssh.

  • Изменяем файл конфигурации dnsmasq:
    nano /etc/dnsmasq.conf
    /etc/dnsmasq.conf
    address=/ya.ru/127.0.0.1
  • Проверяем, все ли настройки корректные:
    dnsmasq --test
    dnsmasq: syntax check OK.
  • Узнаём PID этого процесса:
    ps | grep dnsmasq
    19528 admin     1524 S    grep dnsmasq
    21071 nobody    1288 S    dnsmasq --log-async
  • Убиваем этот процесс:
    kill 21071
  • Перезапускаем его (хотя может 2-4 пункты и не нужны):
    service restart_dnsmasq
    
    Done.

Ничего не получилось.

Файл dnsmasq.conf восстанавливается!

 

Поэтому для роутера ASUS RT-N66U пойду другим путём. На нём установлена прошивка Merlin — это модифицированная стоковая прошивка. Нам нужна настройка для изменения файлов конфигурации.
1. Для начала нужно активировать эту функцию:
Advanced SettingsAdministrationSystem ▶ [Persistent JFFS2 partition] ▶ Enable JFFS custom scripts and configs

Если вы перепрошиваете роутер, то эти настройки слетят и придётся всё повторить.

 

2. Поскольку мне не нужно заменять файл конфигурации dnsmasq, а лишь дополнить его, я изменю файл, с окончанием .add:

nano /jffs/configs/dnsmasq.conf.add
/jffs/configs/dnsmasq.conf.add
conf-file=/jffs/configs/blocklist.conf

3. Создадим отдельный файл со списком заблокированных доменов:

nano /jffs/configs/blocklist.conf
/jffs/configs/blocklist.conf
address=/osb-apps.samsungqbe.com/
address=/osb-v1-alb.samsungqbe.com/
address=/osb-v2.samsungqbe.com/
address=/osb-apps-v2.samsungqbe.com/
address=/osb-auth-eusvc-v2.samsungqbe.com/
address=/lcprd1.samsungcloudsolution.net/
address=/d7luqmstmj331.cloudfront.net/
address=/mediaservices.cdn-apple.com/
address=/eu-auth2.samsungosp.com/
address=/otn1.samsungcloudcdn.com/
address=/www.samsungotn.net/
address=/samsungcloudsolution.net/
address=/d1oxlq5h9kq8q5.cloudfront.net/

4. Проверяем, все ли настройки корректные:

dnsmasq --test
dnsmasq: syntax check OK.

5. Перезапускаем службу:

service restart_dnsmasq

Done.

7. Проверим, сработала ли блокировка:

nslookup osb-apps.samsungqbe.com
Server:    127.0.0.1
Address 1: 127.0.0.1 localhost.localdomain

nslookup: can't resolve 'osb-apps.samsungqbe.com'

Если бы настройки не сработали, ответ был бы примерно такой:

Server:    127.0.0.1
Address 1: 127.0.0.1 localhost.localdomain

Non-authoritative answer:
Name:    osb-apps.samsungqbe.com
Addresses:  18.153.6.82
          3.120.101.141
          52.28.78.142
          52.57.178.187
          54.93.137.194
          52.29.76.141
          35.158.219.72
          18.153.6.78

 

Можно настроить DNS-over-HTTPS, но это лишний геммор. К тому же я легко могу настроить DoH и т.п. прямо в Firefox, а DNS запросы с телевизора меня не напрягают.

 

Расширенные настройки

По-умолчанию у моего роутера выставлен DNS-сервер вручную (я указал адреса Семейного DNS, чтобы блокировать не только рекламу, но и контент для взрослых):
SettingsAdvanced SettingsWANInternet ConnectionWAN DNS Setting

Connect to DNS Server automatically = No
DNS Server1 = 94.140.14.15
DNS Server2 = 94.140.15.16

Т.е. по-умолчанию, для всех клиентов сети выдаются адреса dns-сервера AdGuard Семейный — там блокируется не только реклама, но и доступ к «взрослым» сайтам, что удобно, если к сети цепляется устройство ребёнка. Я бы и сам использовал эти настройки, но мне неудобно, что часто в youtube из-за этого блокируются комментарии к видео. Поэтому я настрою для своих устройств исключения.

Как я писал выше, на компе можно изменить настройки DNS или в браузере прописать DNS-over-HTTPS или DoT, но на телефоне это сделать так просто не получится. Поэтому мне проще создать исключение по MAC-адресу.

 

Полный список опций для настроек DHCP в dnsmasq по этой ссылке. Меня интересует следующая опция:

6 dns-server

Нам она пригодится для такого правила:

# Specify an option which will only be sent to the "default" network
# (see dhcp-range for the declaration of the "default" network)
# Note that the tag: part must precede the option: part.
dhcp-option = tag:default, option:dns-server, 94.140.14.14

Теперь этот тэг можно использовать здесь:

# Send extra options which are tagged as "default" to any machine whose
# MAC address matches the pattern.
dhcp-mac=set:default,8E:F3:76:4B:9C:C4
Имя тэга может быть любым, как в примере с оффсайта red, green, other или nonfiltered. Я использовал слово default.

 

В этом случае для клиентского устройства, с указанным MAC-адресом, будет выдан вместо дефолтового адреса DNS-сервера другой адрес: 94.140.14.14.
Полный файл у меня получился такой (комментарии в файле можно удалить, это я для себя оставил):

/jffs/configs/dnsmasq.conf.add
# Specify an option which will only be sent to the "default" network
# (see dhcp-range for the declaration of the "default" network)
# Note that the tag: part must precede the option: part.
dhcp-option = tag:default, option:dns-server, 94.140.14.14

# Send extra options which are tagged as "default" to any machine whose
# MAC address matches the pattern.
dhcp-mac=set:default,E8:3F:67:4B:9C:C4

# Include another lot of configuration options.
conf-file=/jffs/configs/blocklist.conf

Не проверял, но скорее всего можно указать не только основной, но и альтернативный DNS-сервер:

dhcp-option = tag:default, option:dns-server, 94.140.14.14, 94.140.15.15

 

После изменения файла, необходимо сделать его проверку и перезапустить службу:

dnsmasq --test
dnsmasq: syntax check OK.
service restart_dnsmasq

Done.

Бонус

В п.2 мы создали конфигурационный файл, который стартует при запуске роутера. Аналогичным образом можно создать файл-скрипт профиля (profile.add), который будет стартовать при логине по SSH.

/jffs/configs/profile.add
export PS1="\[\e[32m\][\u@\h] \[\e[36m\]\w\[\e[37m\]> \[\e[m\]"

Пока мне не нужны alias’ы, поэтому я настроил лишь внешний вид командной строки и её цвет:
PS1 for SSH shell



Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments