====== 1984tech - блокування за списком доменів ======
{{ :ingsoc.png|}}
Декілька посилань для загального розвитку:
* [[https://uk.wikipedia.org/wiki/%D0%9C%D0%B5%D1%80%D0%B5%D0%B6%D0%B5%D0%B2%D0%B8%D0%B9_%D0%BD%D0%B5%D0%B9%D1%82%D1%80%D0%B0%D0%BB%D1%96%D1%82%D0%B5%D1%82|Мережевий нейтралітет]]
* [[http://www.president.gov.ua/ua/documents/constitution/konstituciya-ukrayini-rozdil-i|Конституція України]]
* [[https://uk.wikipedia.org/wiki/%D0%94%D0%B6%D0%BE%D1%80%D0%B4%D0%B6_%D0%9E%D1%80%D0%B2%D0%B5%D0%BB%D0%BB|Джордж Орвелл]]
* [[http://www.president.gov.ua/documents/1332017-21850|Указ президента України №133/2017]]
* [[http://www.rnbo.gov.ua/documents/473.html|Указ президента України №126/2018]]
* [[https://www.president.gov.ua/documents/3762021-39745|Указ президента України №376/2021]]
Трохи технологічних посилань:
* [[https://github.com/nightflyza/1984tech|Розробка на GitHub]]
* [[https://github.com/nightflyza/1984tech/archive/master.zip|Поточний снапшот]]
* [[https://ubilling.net.ua/1984tech/|Лендінг проекту. Можливо згодом тут буде відбуватись щось цікаве.]]
Списки доменів:
* [[https://ubilling.net.ua/1984tech/domains.txt|domains.txt]]
* [[https://ubilling.net.ua/1984tech/domains.json|domains.json]]
====== Завантаження та налаштування ======
Завантажуємо, та розпаковуємо.
# wget --no-check-certificate https://github.com/nightflyza/1984tech/archive/master.zip
# unzip master.zip
# cd 1984tech-master/
Для використання функціоналу з блокування доменів по їх IP адресах, а саме засобами різноманітних фаєрволів, може бути потрібне встановлення пакунку [[http://pear.php.net/package/Net_DNS2/redirected|Net_DNS2]] за допомогою pear:
# pear install Net_DNS2
====== Блокування доменів засобами DNS / ISC-BIND ======
Робимо конфігурацію cli/1984tech.ini згідно нашого оточення, модифікуючи що найменше BASE_PATH. Та перевіряємо чи все добре банально методом виклику
# php cli/dnsgen --preview
Далі можна переходити до розгортання пресетів
# cat named/append_named.conf >> /var/named/etc/namedb/named.conf
# cp -R named/master/1984tech.db /var/named/etc/namedb/master/
Переконуємось, що в /var/named/etc/namedb/master/1984tech.db нас все влаштовує та включаємо фантазію, як файл зон, що генерується за допомогою php cli/dnsgen --generate чи php cli/dnsgen --preview буде потрапляти у /var/named/etc/namedb/. Як варіант можете для тесту зробити щось на кшталт
# php cli/dnsgen --preview > /var/named/etc/namedb/1984tech.conf
або вірно виставити повний шлях до цього файлу у конфізі cli/1984tech.ini за допомогою опції DNS_ZONES після чого просто виконувати
# php cli/dnsgen --generate
або ж просто використовуйте сімлінки ФС. Загалом, просто увімкніть фантазію та все.
Список завантажуваних доменів, ви можете подивитись за допомогою команди
# php cli/dnsgen --list
А також ознайомитись з усіма опціями що підтримуються, за допомогою
# php cli/dnsgen --help
Не забуваємо, що після внесення змін до named.conf варто перезапустити сервіс методом
# /etc/rc.d/named restart
А після оновлення файлу зон варто зробити
# rndc reload
У випадку, якщо ви вважаєте, що людино-зрозуміле сповіщення про те, що домен заблоковано з якоїсь конкретної причини краще ніж "просто нічого" - можете скористатись веб-заглушкою з директорії webstub. Для простоти конструкції, можете зробити її віртуал-хостом за замовчуванням.
# cp -R webstub /usr/local/www/apache24/data/
# chmod -R 777 /usr/local/www/apache24/data/webstub/log
====== Блокування доменів засобами DNS / unbound ======
Працює приблизно таким самим чином, як і блокування за допомогою bind - тобто генеруючи кастомні файли зон. Для цього також використовується скрипт cli/dnsgen з наступними параметрами:
# php cli/dnsgen --preview-unbound
для попереднього перегляду, того що буде згенероване, та
# php cli/dnsgen --generate-unbound
Для генерації файлу зон. Де його буде згенеровано, можна вказати за допомогою опції UNBOUND_DNS_ZONES у конфізі cli/1984tech.ini
Далі,необхідно у основний файл конфігурації unbound.conf додати інклуд свіжо згенерованої зони, до секції control:
include: "/var/unbound/1984tech.conf"
Якось так: \\
{{:1984unbound2.png?300|}}
Після чого, героїчно це все перезавантажуємо
# unbound-control reload
====== Блокування засобами фаєрволу / IPFW ======
Далі як водиться редагуємо конфіг cli/1984tech.ini з метою встановлення шляхів до ipfw, таблички ipfw у котру будуть пушитись IP адреси доменів зі списку, так вказуємо шлях, по якому буде генеруватись скрипт оновлення фаєрволу. Також не забуваємо вказати DNS сервери, за допомогою яких ми хотіли б резолвити адреси.
Перш за все, нам необхідно буде вирішити, що робити з табличкою, куди буде запхано IP адреси хостів. Можемо просто брутально відправити її в deny, якось так:
# ipfw add 1984 deny ip from any to table\(42\)
# ipfw add 1984 deny ip from table\(42\) to any
або ж використати заворот за допомогою fwd, якось так:
# ipfw add 1984 fwd 127.0.0.1,80 ip from 172.16.0.0/24 to table\(42\) dst-port 80
# ipfw add 1984 fwd 127.0.0.1,443 ip from 172.16.0.0/24 to table\(42\) dst-port 443
Працездатність можна перевірити наприклад подивившись як резолвляться домени
# php cli/ipfwgen --resolve
або як виглядає скрипт, що повинен генеруватись методом
# php cli/ipfwgen --preview
Далі включаємо фантазію, та використовуємо це все методом
# php cli/ipfwgen --generate
або напряму апдейтимо табличку у фаєрволі за допомогою
# php cli/ipfwgen --tableupdate
====== Блокування засобами Mikrotik ======
При великому бажанні, можна нагенерувати адрес-лістів для Mikrotik-ів. Робиться це за допомогою скрипта cli/mtgen. Наразі керується він аж двома опціями, а власне MT_LISTNAME, що вказує на ім'я адрес-ліста, що буде згенеровано, та MT_SCRIPT_PATH котрий просто вказує куди ми це бажаємо зберігати на ФС.
Детальніше з його опціями, ви можете ознайомитись за допомогою наступної команди:
# php cli/mtgen --help
Візуально ви можете перевірити, що він генерує за допомогою
# php cli/mtgen --preview
У цілому все виглядає аналогічно блокуванню за допомогою фаєрволу ipfw. Також ви можете спробувати скористатись блокуванням за іменем домену, покладаючись на резолв засобами самого Mikrotik:
# php cli/mtgen --listmk
====== Блокування засобами Mikrotik static DNS records ======
Для самих маленьких/дуже ледачих або просто якщо спосіб с адрес-лістами вам не підходить з ідеологічних будь-яких міркувань - можна використати можливість створення **статичних DNS записів** з перенаправленням їх в /dev/null, наприклад, на **127.0.0.1** \\
Зробити то можна наступним способом:
* візуально можете перевірити генерацію за допомогою
# php cli/mtstaticdnsgen --preview
* згенерувати файл (шлях до якого задається опцією **MT_DNSSTATIC_SCRIPT_PATH**) з готовим скриптом для копіпасту до Mikrotik CLI/Terminal можна так
# php cli/mtstaticdnsgen --generate
Також, для тих, хто працює виключно через Winbox і страшенно боїться Mikrotik CLI/Terminal, є варіант створення файлових чанків(шматків) розміром менше 4Kb з повного списку доменів та імпорту їх за допомогою Mikrotik-скрипта. Скрипт лежить тут //mikrotikstaticdns/StaticDNSAdder.rsc//. Загалом ця процедура виглядає так: \\
* створюємо скрипт **StaticDNSAdder.rsc** на Mikrotik і копіпастимо в нього вміст одноіменного скрпта //mikrotikstaticdns/StaticDNSAdder.rsc//
* створюємо файлові чанки (шлях до каталогу, де буде розміщено чанки, задається опцією **MT_DNSSTATIC_CHUNKS_PATH**):
# php cli/mtstaticdnsgen --splitchunks
* кладемо створені чанки, які будуть іменуватись якось так **mt_dnsstatic_chunk_.1984t**, до Mikrotik ///files//
* запускаємо скрипт, уважно дивимось "вихлоп" у Mikrotik Log
Дуже рекомендовано ознайомитись з іншими опціями **MT_DNSSTATIC_*** в **1984tech.ini** \\
Додатковий мануал [[https://github.com/nightflyza/1984tech/blob/master/mikrotikstaticdns/README.md|тут]]
====== Блокування на Linux засобами ipset/iptables ======
Перш за все, потрібно перевірити опції в cli/1984tech.ini на тему валідності шляхів у IPSET_PATH, IPTABLES_PATH та виставити вірні IPSET_LISTNAME з IPTABLES_CHAIN. Далі створюємо відповідний список ipset та оформлюємо його блокування у фаєрволі за допомогою
# ipset -N blacklist iphash
# iptables -t filter -A FORWARD -m set --match-set blacklist dst -j DROP
Далі ми можемо отримати скрипт оновлення списку в ipset за допомогою команди
# php cli/linuxgen --ipset
У випадку, якщо це потрібно, скрипт cli/linuxgen також може виконати для вас ці скрипти самостійно, наприклад, за допомогою команди
# php cli/linuxgen --ipsetupdate
Також ви можете захотіти (ми не знаємо причин для цього) використовувати для блокування просто iptables. Скрипт для оновлення вашого фаєрволу ви можете отримати за допомогою команди
# php cli/linuxgen --iptables
====== Блокування засобами проксі / Squid ======
Squid - виконує функцію прозорого проксі, без кешування і без підміни сертифіката, тим самим не створює MITM аткаку.\\
* При блокуванні HTTP трафіку - клієнтові показується наша сторінка з причиною блокування.
* При блокуванні HTTPS трафіку - Squid просто скидає з'єднання і браузер показує повідомлення:
Неможливо отримати доступ до сайту
Як це все насправді працює і налаштовується, Павутина все дуже гарно і дохідливо, розписав для вас у [[https://github.com/nightflyza/1984tech/blob/master/squid/README.md|окремому рідмі]] для Squid.
====== Блокування засобами Juniper ======
Тут також все типово. Аж одна опція у конфізі JUN_LISTNAME, котра вказує на ім'я префіксліста, котрий буде згенеровано, здоровий набір з set policy-options за допомогою:
# php cli/jungen --preview
Та наступні налаштування фаєрволу:
MX80# set firewall family inet filter blacklist-ip-drop interface-specific
MX80# set firewall family inet filter blacklist-ip-drop term drop from destination-prefix-list blacklist-ip
MX80# set firewall family inet filter blacklist-ip-drop term drop then discard
MX80# set firewall family inet filter blacklist-ip-drop term other then accept
MX80# set interfaces xe-0/0/0 unit 1111 family inet filter output blacklist-ip-drop
====== Блокування засобами Cisco ======
Вказуємо за допомогою опції CIS_LISTNUM номер адрес ліста для чорного списку, після чого дивимось що вийшло за допомогою:
# php cli/cisgen --preview
Використовувати це можна за допомогою:
Cisco-6500(config)# access list 101 permit ip any any
Cisco-6500(config)# interface GigabitEthernet 0/24
Cisco-6500(config-if)# ip access-group 101 out
====== Блокування засобами PDNSD ======
Для конфігу PDNSD (зазвичай лежить тут ///etc/pdnsd.conf//) є можливість генерації **negation sections**, для блокування доменів. \\
* візуально можете перевірити генерацію за допомогою
# php cli/pdnsdgen --preview
* згенерувати файл (шлях до якого задається опцією **PDNSD_SCRIPT_PATH**) з готовим скриптом для копіпасту до **pdnsd.conf** можна так
# php cli/pdnsdgen --generate
Після успіщної генерації файлу просто копіпастимо його вміст до конфігу PDNSD і робимо йому restart. \\
Детальніше про PDNSD: \\
https://manpages.debian.org/jessie/pdnsd/pdnsd.conf.5.en.html \\
https://wiki.archlinux.org/title/pdnsd \\
https://gist.github.com/gorakhargosh/1119508 \\