====== 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 \\