1. Введение


Тема контентной фильтрации в школах достаточно заезженная и по ней полно информации, но она уже достаточно устарела, в связи с переходом множества сайтов на защищенный протокол HTTPS, с которым не работает большинство предлагаемых решений. Поэтому я решил написать максимально полную статью от А до Я собрав воедино всю информацию, найденною мной на просторах Гугля. Статья рассчитана на базовые знания в сфере администрирования и подойдет для учителей информатики.

2. Техническое задание


Дано: 436-ФЗ и школа, в которой множество компьютеров, объединенных в сеть и подключенных к интернету через роутер MikroTik или любой другой.

Задача: сделать контентную фильтрацию HTTP и HTTPS по белому списку для всех, кроме себя любимого и управления школы.


3. Решение задачи


Был найден неиспользуемый стационарный компьютер с двух-ядерным Intel-ом, 1 Гб ОЗУ и жестким на 80 Gb.
Для решения будет сделано следующее:

  1. Установлена Linux Ubuntu Server 18.04 LTS
  2. На сервер установлен и настроен прозрачный Proxy Squid, собранный из исходных кодов с поддержкой HTTPS.
  3. Интеграция сервера в подсеть, путем перенаправления запросов на Proxy или альтернативным вариантом (в самом конце)

Начнем.

3.1. Установка и настройка Ubuntu 18.04


Процесс установки прост. Качаем дистрибутив Ubuntu Server 18.04 с официального сайта. Рекомендую качать со старым установщиком, так как новый, лично у меня, ушел в бесконечную загрузку во время установки. Записываем образ на флешку/диск любым удобным способом. Для записи на флешку рекомендую использовать Rufus и в начале записи выбрать «Запись DD-образа». Далее, следуя информации на экране, устанавливаем систему. Остановимся только на выборе компонентов, где можно выбрать сразу OpenSSH и всё. Нам много не нужно, а что нужно, установим сами.

Итак, Ubuntu установлена. Сеть, если у вас DHCP, уже настроена. Войдем в режим суперпользователя, чтобы каждый раз не добавлять sudo к командам.

sudo -s

Введем свой пароль и обновим систему.

apt-get update
apt-get upgrade

Установим текстовый редактор и файловый менеджер.

apt-get install nano mc

Чтобы сохранить файл в nano, необходимо нажать Ctrl+O и следом Y. Выход из редактора осуществляется нажатием Ctrl+X. Можно сохранить файл сразу перед выходом, нажав Ctrl+X и следом Y.
Чтобы открыть файловый менеджер, введите mc. Откроется типичный DOS-овский NortonCommander или в Windows TotalCommander/FAR с двумя панелями. Хотя я привык работать с консолью, файловый менеджер тоже иногда помогает, например, найти нужный файл быстрее.

Если же у вас не DHCP или вы хотите отдельный IP-адрес для своего сервера, как этого захотел я, то перейдем к настройке.

Настройка статического IP-адреса
В отличии от предыдущих версий Ubuntu, в новой 18.04 сеть настраивается уже не в привычном всем нам /etc/network/interfaces, а через netplan в файле /etc/netplan/*.yaml. Файл может называться по разному, но он там один. Сам же /etc/network/interfaces пишет нам следующее:



Также, если вы захотите обновиться с версии старше до 18.04, настройки сети останутся там, где и были. Netplan актуален только для чистой установки 18.04.

Приступим, все-таки, к настройке сети.

Для начала посмотрим название сетевого интерфейса, присвоенное ОС, и запомним его.

ifconfig

Теперь откроем файл с настройками.

nano /etc/netplan/*.yaml

В нем уже должна быть настройка DHCP. Приведем файл к следующему виду.

# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    название сетевого интерфейса:
      dhcp4: no
      dhcp6: no
      addresses: [адрес/24]
      gateway4: шлюз
      nameservers:
        addresses: [77.88.8.7, 77.88.8.3]

Вписываем свои интерфейс, адрес и шлюз. DNS рекомендую оставить эти — Яндекс.DNS Детский будет как дополнительная защита. Такой же DNS настроен у меня в роутере. В любом случае, необходимо указывать тот DNS, который раздает роутер.

Здесь необходимо обратить внимание на пробелы (именно пробелы, а не табуляция). Каждый, своего рода, пункт отделяется от предыдущего пробелом. К примеру, если после nameservers строку addresses не отделить пробелом, а выровнять со строкой выше, то, при попытке применения настроек, netplan выдаст ошибку.

Применим настройки.

netplan apply

Перезагрузим сервер, на всякий случай.

reboot


Также, добавил альтернативный вариант настройки сети, как для DHCP, так и для статического IP, если не устраивает netplan.
Альтернативный вариант настройки сети
В Ubuntu 18.04 можно вернуться к привычному варианту настройки сети через /etc/network/interfaces. Для этого в самом файле указано, что нужно установить утилиту ifupdown. Установим ее:
apt-get install ifupdown

Теперь откроем файл изначальных настроек в netplan
nano /etc/netplan/*.yaml

и закомментируем все его содержимое, чтобы не было конфликтов.
Далее откроем файл настроек сети
nano /etc/network/interfaces

И добавим в него:
для статического IP-адреса
auto название_вашего_сетевого_интерфейса
        iface название_вашего_сетевого_интерфейса inet static
        address IP-адрес
        netmask Маска
        gateway Шлюз
        dns-nameservers 77.88.8.7 77.88.8.3

для динамического (DHCP)
auto название_вашего_сетевого_интерфейса
    iface название_вашего_сетевого_интерфейса inet dhcp

Перезагрузим сервер
reboot

Если используете этот вариант настройки сети, то далее, в настройках Firewall, можете отказаться вообще от Webmin и использовать вариант настройки под спойлером (хотя вариант с Webmin тоже будет работать)

После настройки сети, рекомендую перейти сразу в терминал, и продолжать работу уже в нем. Для этого, если вы не выбрали на этапе установки OpenSSH, установим его.

apt-get install ssh

По умолчанию SSH уже настроен на вход по пользователю/паролю на 22 порте, но вы можете настроить его для себя через, например, ключ авторизации и с другим портом в целях защиты сервера от атак извне. Как это сделать полно информации в интернете.

В качестве терминала я использую XShell. Вы можете использовать тот, который вам больше по душе.

DHCP-сервер и вторая сетевая карта нам не нужны, так как мы будем перенаправлять запросы пользователей на наш Proxy с помощью самого роутера.

Основа заложена. Теперь перейдем к установке и настройке Squid.

3.2. Установка и настройка Squid c поддержкой HTTPS и фильтрация по спискам


3.2.1. Сборка и установка Squid

Так как в репозиториях нет готового пакета Squid с поддержкой SSL, то придется собрать его вручную из исходников. Для начала откроем файл с репозиториями.

nano /etc/apt/sources.list

В нем раскомментируем (удалим # в начале) строки, начинающиеся с deb-src.

После этого обновим пакеты.

apt-get update

Далее установим инструменты для сборки.

apt-get install fakeroot build-essential devscripts

И добавим все необходимые пакеты для сборки.

apt-get build-dep squid3

Установим библиотеку для поддержки SSL.

apt-get install libssl1.0-dev

Перейдем в домашнюю папку и создадим папку для сборки, сразу установив на нее нужные права.

cd ~
mkdir build
chown _apt:root build

Перейдем в созданную папку и скачаем исходники Squid.

cd build
apt-get source squid3

В папке build появится папка с именем squid3 и номером релиза. В Ubuntu 18.04.3 это 3.5.27. Перейдем в нее.

cd squid3-3.5.27

Перед сборкой необходимо указать опции. Откроем файл с ними.

nano debian/rules

Ищем перечисление опций, как на картинке


Добавляем следующие опции.

--enable-ssl --enable-ssl-crtd --with-openssl

Обратите внимание, что на картинке опции уже добавлены, а символ "\" должен стоять после каждой строки в опциях, кроме последней.

Итак, для сборки все готово. Теперь перейдем в папку с исходниками Squid, хотя вы должны быть уже в ней.

cd ~/build/squid3-3.5.27

И введем команду для сборки.

debuild -d

Сборка будет идти очень долго, у меня занимало в среднем от 2 до 4 часов. Зависит от быстродействия компьютера. По окончании сборки вы увидите ошибку подписи пакетов. Это нормально — ошибку игнорируем.

Теперь перейдем в папку Build.

cd ~/build

И установим Squid.

dpkg -i squid*.deb

Сразу нарываемся на ошибку о неудовлетворенных зависимостях и вводим команду

apt-get install -f

После установки маркируем пакеты, чтобы они не перезаписались после обновления системы.

apt-mark hold squid
apt-mark hold squid-common
apt-mark hold squidclient

3.2.2. Настройка Squid и фильтрации

Итак, Squid установлен, осталось его настроить под наши нужды.

Все настройки находятся в файле /etc/squid/squid.conf. Он содержит множество комментариев и на первый взгляд кажется очень сложным, но на самом деле ничего сверхсложного в нем нет. Для начала, почистим его от комментариев, предварительно скопировав оригинал, если вы, вдруг, захотите изучить его подробнее. Для удобства, перейдем сразу в папку со Squid-ом.

cd /etc/squid
cp squid.conf squid.conf.backup
cat squid.conf.backup | egrep "^[^#]" > squid.conf

Теперь откроем squid.conf

nano squid.conf

Как видим, он очистился от комментариев и перестал быть таким громоздким, как казался.
Под спойлером выложу свой файл с настройками, которые работают без нареканий, а ниже опишу по блокам что и как.

Конфигурация squid.conf
acl localnet src 192.168.0.0/24
acl worktime time 08:00-15:00
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

acl blacklist url_regex -i "/etc/squid/blacklist"
acl whitelist url_regex -i "/etc/squid/whitelist"

http_access allow localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow CONNECT
http_access deny blacklist
http_access allow whitelist
http_access deny all worktime
http_access allow all

http_port 3128
http_port 3129 intercept
https_port 3130 intercept ssl-bump options=ALL:NO_SSLv3:NO_SSLv2 connection-auth=off cert=/etc/squid/squid.pem
always_direct allow all
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER

acl blacklist_ssl ssl::server_name_regex -i "/etc/squid/blacklist_ssl"
acl whitelist_ssl ssl::server_name_regex -i "/etc/squid/whitelist_ssl"
acl step1 at_step SslBump1

ssl_bump peek step1
ssl_bump terminate blacklist_ssl
ssl_bump splice whitelist_ssl
ssl_bump terminate all worktime
ssl_bump splice all

sslcrtd_program /usr/lib/squid/ssl_crtd -s /var/lib/ssl_db -M 4MB

#Кэш
cache_mem 512 MB
 maximum_object_size_in_memory 512 KB
 memory_replacement_policy lru
cache_dir aufs /var/spool/squid 2048 16 256

#Лог
access_log daemon:/var/log/squid/access.log squid
logfile_rotate 1

coredump_dir /var/spool/squid
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern (Release|Packages(.gz)*)$      0       20%     2880
refresh_pattern .               0       20%     4320


Первый блок выглядит следующим образом.

acl localnet src 192.168.0.0/24
acl worktime time 08:00-15:00
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

Он отвечает за стандартные acl параметры. В нем в localnet изменяем локальную сеть на свою, а также добавляем acl рабочего времени (по желанию). Рабочее время я добавил ввиду того, что ко мне часто приходят учителя с жалобой, что не могут ничего найти, все недоступно. Я, конечно, рад, что все работает, как надо, но, честно говоря, надоело это выслушивать. Теперь на их претензию я сообщаю, что после 15.00 фильтрация отключается, и они могут свободно (почти) найти информацию, которая им нужна. Вы можете добавить свое время, или оставить фильтрацию круглосуточной, не добавляя этот acl.

Второй блок определяет списки разрешенных и запрещенных сайтов для HTTP и выглядит следующим образом.

acl blacklist url_regex -i "/etc/squid/blacklist"
acl whitelist url_regex -i "/etc/squid/whitelist"

Списки разрешенных и запрещенных сайтов мы добавим позже, и они будут размещаться в файлах, указанных в acl.

Третий блок определяет параметры доступа по протоколу HTTP и выглядит вот так

http_access allow localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow CONNECT
http_access deny blacklist
http_access allow whitelist
http_access deny all worktime
http_access allow all

Здесь пункт http_access allow CONNECT обязателен, так как без него у меня Squid не пускал в интернет никого. Далее идут правила на «черный» и «белый» списки. Параметры deny и allow запрещают и разрешают доступ соответственно. После них идет правило на полный запрет всего HTTP-трафика в рабочее время. Если вы не устанавливали рабочее время, то удалите worktime, и запрет будет постоянным. Важным моментом является порядок правил, так как Squid считывает их сверху вниз
Четвертый блок определяет параметры портов для Squid.


http_port 3128
http_port 3129 intercept
https_port 3130 intercept ssl-bump options=ALL:NO_SSLv3:NO_SSLv2 connection-auth=off cert=/etc/squid/squid.pem

Первый параметр необходим, чтобы в логах бесконечно не появлялась ошибка «ERROR: No forward-proxy ports configured». Она заполняет лог и, следовательно, память. Распространенная ошибка, но, почему-то, в нашем ru-сегменте я не нашел, как ее исправить, помогли забугорские форумы. Второй параметр определяет порт HTTP протокола. Intercept означает прозрачность Proxy, то есть не будет необходимости прописывать настройки на каждом компьютере.
Третий параметр определяет порт HTTPS и его опции. Это одна длинная строка. Файл squid.pem — это наш сертификат, который мы создадим позднее.

Пятый блок определяет параметры работы SSL соединения со Squid-ом. В частности, он указывает направлять весь трафик сразу в интернет, без использования вышестоящих кешей, а последние две разрешают соединение даже с ошибками проверки сертификата, так как окончательно решение о посещении такого ресурса должен осуществлять пользователь, а не сервер. Выглядит так.

always_direct allow all
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER

Шестой блок задает параметры acl «черного» и «белого» списков, которые будут созданы позднее, а также глубину перехвата HTTPS-трафика.

acl blacklist_ssl ssl::server_name_regex -i "/etc/squid/blacklist_ssl"
acl whitelist_ssl ssl::server_name_regex -i "/etc/squid/whitelist_ssl"
acl step1 at_step SslBump1

Седьмой блок определяет параметры доступа по протоколу HTTPS. Здесь за запрет и разрешение отвечают уже terminate и splice соответственно. Опять же, не забывайте убрать worktime, если у вас не указано рабочее время.

ssl_bump peek step1
ssl_bump terminate blacklist_ssl
ssl_bump splice whitelist_ssl
ssl_bump terminate all worktime
ssl_bump splice all

sslcrtd_program /usr/lib/squid/ssl_crtd -s /var/lib/ssl_db -M 4MB

Восьмой блок задает кеш и лог нашего Squid. Здесь стоит отметить только параметр logfile_rotate, обозначающий количество дней, в течении которых хранится лог.

#Кеш
cache_mem 512 MB
 maximum_object_size_in_memory 512 KB
 memory_replacement_policy lru
cache_dir aufs /var/spool/squid 2048 16 256

#Лог
access_log daemon:/var/log/squid/access.log squid
logfile_rotate 1

coredump_dir /var/spool/squid
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern (Release|Packages(.gz)*)$      0       20%     2880
refresh_pattern .               0       20%     4320

На этом настройка squid.conf закончена. Сохраняем файл и переходим к созданию сертификата и списков.

Перейдем в папку со Squid

cd /etc/squid/

И введем следующую команду для создания сертификата

openssl req -new -newkey rsa:1024 -days 36500 -nodes -x509 -keyout squid.pem -out squid.pem

Далее необходимо будет ввести данные сертификата. Срок действия сертификата указан 100 лет, чтобы забыть о нем надолго. Нужен он только для Proxy.

Теперь создадим наши файлы списков.

touch blacklist
touch whitelist
cp whitelist whitelist_ssl
cp blacklist blacklist_ssl

Сайты в списки заносим в виде регулярных выражений. Например, чтобы разблокировать mail.ru, откроем whitelist

nano whitelist

и добавим в него следующее выражение.

mail\.ru 

Теперь заблокируем Игры.Mail.ru. Откроем наш blacklist

nano blacklist

и запишем в него следующее выражение

games\.mail\.ru

Так как правило, блокирующее по черному списку, стоит у нас выше белого списка, то, при переходе на mail.ru, сайт будет открываться как положено (за исключением картинок, но об этом позже), а если попытаться перейти на Игры, Squid нас не пустит.

У некоторых сайтов множество поддоменов, субдоменов и т.д. Как, например, mail.ru хранит свои картинки на imgsmail.ru. Касаемо других подобных сайтов, вам необходимо в любом браузере (я использую Chrome) открыть нужный сайт и, следом, инструменты разработчика (в Chrome вызываются по клавише F12).



Перейти на вкладку Sources и посмотреть, с каких еще ресурсов сайт подгружает информацию.

Добавив сайты, скопируем их в списки для HTTPS.

cp whitelist whitelist_ssl
cp blacklist blacklist_ssl

Совет по заполнению списков
Создайте обычный текстовый файл на своем компьютере, найдите и скопируйте в него список разрешенных сайтов, дополните его своим. Затем, в обычном блокноте сделайте авто-замену точки на слэш-точку (\.) и той же авто-заменой удалите лишнее (www, http, символ "/" и тд). Потом такой файл можно, используя терминал, сразу скопировать в листы на сервере.

Теперь проверим конфигурацию.

squid -k check

Если все хорошо, остановим Squid.

/etc/init.d/squid stop

Перестроим кеш

squid -z

И снова запустим Squid

/etc/init.d/squid start

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

/etc/init.d/squid restart

Также можете изменить страницу запрета доступа (работает только на HTTP) по пути /usr/share/squid/errors/~Russian-1251. Ищите в папке файл ERR_ACCESS_DENIED и редактируете его. Синтаксис файла — HTML.

3.3. Мониторинг состояния сервера и настройка Firewall


Для мониторинга состояния нашего сервера установим утилиту Webmin, с помощью которой и настроим наш Firewall. Помимо этого, через нее можно следить за состоянием ЦП, ОЗУ и тд, обновлять пакеты, добавлять и настраивать компоненты и еще очень много всего. В ней есть свой терминал, правда корявый. Работает утилита через любой браузер, следовательно, можно подключиться к нашему серверу с любого компьютера внутри сети, что достаточно удобно, хоть и не безопасно. При желании, подключение можно ограничить только отдельными IP-адресами в «Управлении доступом по IP» в самом Webmin.

Перед началом установки, добавим репозиторий Webmin. Открываем sources.list.

nano /etc/apt/sources.list

И добавляем внизу строку.

deb http://download.webmin.com/download/repository sarge contrib

Теперь установим GPG ключ, которым подписаны пакеты в репозитории Webmin

cd /root
wget http://www.webmin.com/jcameron-key.asc
apt-key add jcameron-key.asc

Следом обновляем список пакетов и устанавливаем утилиту

apt-get update
apt-get install webmin

Подключиться к серверу можно в любом браузере введя в строку адреса

IP_адрес_сервера:10000

По умолчанию Webmin подключается по SSL, и большинство браузеров выдают ошибку не доверенного сертификата. Чтобы каждый раз не выбирать доверие, отключим SSL. Для этого откроем файл /etc/webmin/miniserv.conf

nano /etc/webmin/miniserv.conf

Найдем в нем строку ssl=1 и заменим ее на ssl=0. В этом же файле можно изменить порт подключения. По умолчанию он 10000. Вы можете поставить любой свободный.

Подключившись к Webmin, перейдем в Webmin -> Webmin Configuration и переключим язык на русский. Потом переходим Сеть -> Межсетевой экран (Firewall). По умолчанию Firewall у нас чистый. Опускаемся в самый низ и напротив "Включать при загрузке" выбираем «Да». Жмем «Применить конфигурацию». Теперь настройки нашего Firewall указаны в файле /etc/webmin/firewall/iptables.save и запускаются вместе с системой. Если такого файла нет, то смотрим что написано в строке «Файл с правилами» на вкладке Firewall в Webmin. Откроем его в терминале.

nano /etc/webmin/firewall/iptables.save

Идем к блоку *nat и в конце перед COMMIT добавляем следующие правила.

-A PREROUTING -p tcp -m tcp -i сетевой_интерфейс --dport 80 -j DNAT --to-destination ip_сервера:3129
-A PREROUTING -p tcp -m tcp -i сетевой_интерфейс --dport 443 -j REDIRECT --to-ports 3130

Эти правила направляют трафик, идущий на порты 80 (HTTP) и 443 (HTTPS) сервера на порты нашего Squid. Здесь я представил два варианта правил с DNAT и REDIRECT. Вы можете использовать оба, или взять один вариант, поставив соответствующие порты.

Настройка FIrewall для альтернативной настройки сети
Данный вариант подойдет, если вы использовали вышеописанную альтернативную настройку сети.
Для начала создадим файл с правилами для нашего Firewall и дадим ему право на исполнение.
touch /etc/nat
chmod +x /etc/nat

Откроем его
nano /etc/nat

И добавим следующее содержимое
#!/bin/sh
#Firewall
iptables -t nat -A PREROUTING -p tcp -m tcp -i сетевой_интерфейс --dport 80 -j DNAT --to-destination ip_сервера:3129
iptables -t nat -A PREROUTING -p tcp -m tcp -i сетевой_интерфейс --dport 443 -j REDIRECT --to-ports 3130

Как и в случае с Webmin, я представил два варианта правил с DNAT и REDIRECT. Вы можете использовать оба, или взять один вариант, поставив соответствующие порты.
Теперь добавим наш файл в загрузку сразу после запуска сети. Откроем файл настроек сети
nano /etc/network/interfaces

И добавим внизу файла строку
post-up /etc/nat

PS: плюс такого варианта в том, что вы можете в будущем добавлять свои правила, просто редактируя файл /etc/nat. В Webmin несколько сложнее.

На этом настройка сервера закончена. Перезагрузим его.

reboot

И перейдем к настройке роутера MikroTik.

3.4. Настройка роутера MikroTik для перенаправления трафика на Proxy


Будем считать, что вы уже скачали утилиту WinBox для удаленного управления, интернет и локальная сеть настроены, firewall на роутере чистый. вы знаете название интерфейса локальной сети (посмотреть можно в IP — DHCP Server — DHCP).

а) Заходим в WinBox, идем в IP — DHCP Server — Leases. В списке ищем IP компьютеров, для которых фильтрация не будет работать (директор, управление), жмем на них правой кнопкой и в меню выбираем Make Static. Рядом с ними должна пропасть буква «D», что означает Dynamic. Теперь эти адреса будут сразу статически присваиваться данным компьютерам, вне зависимости от времени аренды, по MAC-адресу. Если ноутбук, который используется по Wi-Fi и по кабелю, то необходимо выбрать Make Static на оба MAC-адреса.

б) Далее идем в IP — Firewall — Address Lists и жмем на синий плюсик "+". В поле Name указываем название для нашей группы светлых нефильтрованных адресов, например, «Admins». В поле Address указываем один IP-адрес из тех, кому присвоили статический. Повторяем это для каждого адреса, выбирая в поле Name стрелочкой нашу группу.

в) Переходим на вкладку Mangle в том же IP — Firewall и жмем на "+". Откроется окно с вкладками. На вкладке General заполняем следующие поля:

Chain - Prerouting
Src. Address - адрес_сервера_proxy
Protocol - 6 (tcp)
Dst. Port - 80
In. Interface - интерфейс_локальной_сети

На вкладке Action проверяем наличие значения Accept и жмем ОК.

Повторяем процесс, но в поле Dst. Port ставим значение 443.

г) Снова нажимаем на "+" и на вкладке General снова заполняем следующие поля:

Chain - Prerouting
Protocol - 6 (tcp)
Dst. Port - 80
In. Interface - интерфейс_локальной_сети

Переходим на вкладку Advanced и в поле Src. Address List выбираем наш список адресов управления "Admins". Обязательно нажимаем на появившийся квадратик рядом со списком. Появится восклицательный знак "!", означающий логическое НЕ или ОТРИЦАНИЕ.

Переходим на вкладку Action и заполняем поля:

Action - mark routing
New Routing Mark - to_proxy
Passthrough - ставим галочку

Жмем ОК и проделываем те же действия, но в поле Dst. Port указываем значение 443.

д) Наконец добавим последнее правило. Жмем плюсик и заполняем следующие поля на вкладке General:

Chain - Prerouting
In. Interface - интерфейс_локальной_сети
Routing Mark - to_proxy

В итоге, должно получиться следующее с вашими параметрами. Порядок важен!



е) Идем в IP — Routes и жмем на "+". Заполняем следующие поля:

Dst. Address - 0.0.0.0/0
Gateway - адрес_сервера_proxy
Routing Mark - to_proxy

Жмем ОК и на этом все. При включенном сервере, весь HTTP и HTTPS трафик будет идти через наш Squid.

3.5. Альтернативная настройка для MikroTik и других роутеров


Данный вариант подойдет как для роутера MikroTik, так и для любого другого, даже самого простого (за исключением провайдерских арендованных кусков сами знаете чего). В этом случае мы реализуем разделение доступа в интернет не на роутере, а на самом Squid. Итак, начнем.
а) Будем считать, что вы дошли до этого пункта, выполнив все вышестоящие, включая настройку перенаправления на Proxy в MikroTik. Для беспроблемной работы описываемого варианта, нам необходимо отменить подпункт е) пункта 3.4 настоящей статьи. Можно отменить весь пункт 3.4 (оставив, пожалуй, подпункт а) для того, чтобы наши IP не изменялись), но это по желанию — нам важно отменить саму маршрутизацию. Для этого идем в IP — Routes, ищем наш маршрут, выделяем его и жмем на красный крестик (не плюсик, а крестик, который рядом с галочкой). Маршрут станет серым => он отключен. Фильтрация также отключилась, теперь все клиенты идут в интернет напрямую через роутер.

б) Теперь заходим на наш сервер и переходим в папку со Squid
cd /etc/squid/

Открываем файл конфигурации
nano squid.conf

И добавляем в него по блокам:
В первый блок сразу после строки с acl localnet…
acl admins src "/etc/squid/admins-ip"  #Список IP администрации школы
acl students src "/etc/squid/students-ip"  #Список IP ученических компьютеров

Список с компьютерами учителей нам не нужен, так как подразумевается, что все остальные и есть учителя. Но вы можете его добавить сами с соответствующими правилами в других блоках.
Во второй блок
acl whitelist-stud url_regex -i "/etc/squid/whitelist-stud"   #Более ужесточенный белый список для учеников

В третий блок после http_access deny blacklist
http_access allow admins   #Разрешаем группе администрации ходить в интернет
http_access allow students whitelist-stud  #Разрешаем ученикам доступ по их белому списку
http_access deny students  #Запрещаем ученикам доступ на остальные сайты все время

Далее блок остается без изменений, так как следом идут учителя (все остальные IP) с фильтрацией по их белому списку и в рабочее время (если указывали). Вы можете также пустить группу admins в обход черного списка, поставив разрешающее правило выше запрещающего, или добавить отдельные IP (например свой) в отдельный acl и поставить его в правилах выше blacklist.
Четвертый и пятый блоки без изменений.
В шестой блок добавляем
acl whitelist-stud_ssl ssl::server_name_regex -i "/etc/squid/whitelist-stud_ssl"

В седьмой блок добавляем после ssl_bump terminate blacklist_ssl
ssl_bump splice admins
ssl_bump splice students whitelist-stud_ssl
ssl_bump terminate students

Принцип тот же, что и в третьем блоке.
Остальное без изменений. Сохраняем и выходим

в) Теперь создадим наши списки IP-адресов.
touch admins-ip
touch students-ip

И белые списки для учеников.
touch whitelist-stud
cp whitelist-stud whitelist-stud_ssl

Добавьте в соответствующие списки необходимые IP-адреса и сайты. В ученический список сайтов можно скопировать список для учителей, убрав оттуда не нужные ученикам сайты. Копирование файлов в Linux осуществляется командой
cp <путь и имя копируемого файла> <путь и имя конечного файла>

Перезапустим Squid
/etc/init.d/squid restart


г) Мы подошли к самому главному, а именно, как же заставить клиентов ходить в интернет через наш Proxy. Нам необходимо сменить шлюз нашего DHCP-сервера с адреса роутера на адрес нашего сервера. Разумеется, что для этого адрес сервера должен быть статическим, или привязан к MAC.
В MikroTik:
Идем в IP — DHCP Server — Network и два раза кликаем на нашей сети. В поле Gateway меняем адрес роутера на адрес Proxy-сервера. Жмем ОК и все. Можете перезагрузить роутер, чтобы настройки грамотно обновились у всех активных клиентов. После этого на клиентах, скорее всего, изменится тип сети на общественную (если стояла частная).
В обычном роутере:
Поищите в руководстве к вашему роутеру, где изменить шлюз DHCP-сервера, но вангую, что в его настройках :)

Итог: в результате данного альтернативного решения мы смогли сделать более тонкую настройку доступа по IP и спискам, и получить в логах Squid нормальные IP-адреса клиентов. Если нужно, чтобы какие-то клиенты ходили в интернет минуя Proxy через роутер, то читаем спойлер.
Интернет минуя Proxy
Если Вам необходимо, чтобы какие-то клиенты ходили в интернет минуя Squid совсем, то нужно прописать настройки сети на клиентах вручную, указав шлюзом роутер,


4. Заключение


Итак, подытожим все вышеописанное. У нас получилось с нуля установить и настроить Linux Ubuntu 18.04 LTS, собрать и установить Squid с поддержкой HTTPS, настроить фильтрацию по белым спискам, интегрировать Proxy-сервер в нашу сеть без необходимости устанавливать дополнительный DHCP-сервер.

5. Список источников


При создании статьи были использованы различные материалы с сайтов Технический блог специалистов ООО«Интерфейс» и Web Safety — Web Filter for Your Network, а также личные знания и опыт.
При редактировании и дополнении статьи очень помогли следующие пользователи: Kanlas, PetRiot, Barsook. Огромная благодарность им за содействие и помощь.

6. Примечания автора


  1. Любые работы с сервером нужно производить в режиме суперпользователя, добавляя sudo перед командой, или один раз введя команду sudo -s.
  2. Squid открывает\закрывает доступ ко всему ресурсу целиком, так что одну статью, например, на Википедии заблокировать не получится. Но никто не мешает вам изучить регулярные выражения и тестировать.
  3. Списки сайтов могу скинуть, обращайтесь. Сюда вписывать не стал, так как в одном белом списке более 1000 сайтов.
  4. К сожалению, данный вариант настройки не дает сделать раздельные списки для отдельных IP-адресов в Squid. В логах Squid только один IP-адрес — сам Mikrotik. Если хотите раздельные списки, то надо поднимать на сервере DHCP и делать его шлюзом, но это тема для другой статьи. Надеюсь, в комментариях гуру подскажут, что поправить в статье, чтобы в логах были IP компьютеров. — решено благодаря подсказке пользователя Barsook
  5. Для работы Squid с большим количеством клиентов (более 50) необходимо минимум 1 Гб ОЗУ. Желательно больше, так как Squid ест память. Вы можете проверить состояние памяти, введя команду top.
  6. Я рекомендую использовать оба варианта настройки роутера, так как, если в сетевых настройках явно указать другой шлюз (сам роутер), то обойти блокировку можно.


UPD1: добавил альтернативную настройку сети и Firewall
UPD2: добавил альтернативный вариант настройки роутера, где исправлены проблемы с отображением адресов в логах Squid.

Комментарии (64)


  1. Sheti
    29.10.2019 11:23
    +1

    Ну это не та площадка, чтобы размещать how-to по установке squid. А самое главное нет ответа на вопрос где брать списки для блокировки или для белого-листа. Ну и конечно в реалиях РФ важна бумажка которой для наколенного решения не будет и в случае чего прикрыться будет нечем.


    1. blooddemon747 Автор
      29.10.2019 11:43

      1. Список я нашел в интернете по простому запросу «список разрешенных сайтов для школ» (самые основные) + дополнил его своими сайтами + дал задачу учителям приносить мне адреса сайтов, которые им нужны. => список является дополняемым. При желании, его можно оформить, распечатать, подписать директором и будет бумажка. Также я указал, что могу скинуть свой список ввиду того, что он слишком большой. В статью его добавлять нецелесообразно, а файлы, кроме картинок, я так понял, добавлять нельзя.
      2. Реалии РФ таковы, что требовать у нас любят, а как дело доходит до финансирования — денег нет, но вы держитесь. Отсюда наколенные решения.


      1. akryukov
        29.10.2019 11:50

        В недавней статье про наколенное решение на малинке гражданин divanus писал, что с финансированием в школах все хорошо: https://habr.com/ru/post/472200/#comment_20805868


        Вы можете опровергнуть его тезис конкретными фактами?


        1. divanus
          29.10.2019 12:01

          Ростелеком предоставляет комплексное решение контентной фильтрации. У нас в центре образования (а это 5 школ и 3 детсада) подключена их система. Отсутсвтует в принципе проблема с фильтрацией. Скорее даже приходится к примеру для работы с Яндекс.Облако (школьный портал) в начале VPN организовать, а уже потом только РТ добавил в белые списки фильтрации.


        1. uzverkms
          29.10.2019 12:03

          Например, в Москве всё очень жирно. Но не без дебилизма — могут купить дорогое крутое оборудование, а установить его как попало.
          Как мне рассказывали, в московских школах штатно предусмотрен интернет через единый ЦОД. И на уровне школ вопрос фильтрации контента не решается — этим занимаются централизованно.
          А вот в регионах может быть что угодно.


          1. blooddemon747 Автор
            29.10.2019 12:12

            Хотите фиаско? Спустя пару месяцев после того, как я сделал вышеописанную фильтрацию, мне сообщили, что в следующем году школу будут переключать на другого провайдера с фильтрацией интернета централизовано по региону без возможности отказа.


            1. iig
              29.10.2019 19:03

              Почему фиаско? Если вам эта система нужна только чтобы прикрыть ... для соответствия 436-ФЗ — надо радоваться, что заниматься этим будет кто-то другой, с соответствующими лицензиями.


              1. blooddemon747 Автор
                30.10.2019 09:39

                я потратил кучу времени и сил, чтобы разобраться и сделать то, что сейчас работает, а мне сообщают, что можно было бы этого и не делать. С другой стороны, все-таки хороший опыт, который мне еще пригодиться на другой работе.


              1. blooddemon747 Автор
                30.10.2019 11:00

                И еще момент — если централизовано фильтрация будет недостаточная (проверка сможет выйти хотя бы на один нехороший сайт) то выговор угадайте кому будет? Мне, а не провайдеру. В РФ так.


                1. iig
                  30.10.2019 11:37

                  Выговора бояться — за интернет не отвечать ;)
                  Итальянский вариант: получаете выговор, включаете жёсткую фильтрацию по белому списку, без всяких гуглов и вконтактиков. Не нужон нам этот ваш интернет! :D


        1. blooddemon747 Автор
          29.10.2019 12:05

          Что касается техники — она есть и ее полно. На нее денег не жалеют — верно. В разумных пределах, конечно. А вот что касается ПО для примера: несколько учителей у меня в школе покупали лицензии на офис 365 за свой счет, так как денег не дали. Применительно к фильтрации — если использовать платное решение, то это не единовременные затраты, а по подписке раз в месяц\год, следовательно, не каждой школе дадут добро на это.


          1. Kelxorn
            30.10.2019 09:39

            Лично в моей школе с техникой все плохо. Это в Санкт-Петербурге, если что. Компьютеры 2008 года. Новых пока не предвидится. Стоит Ubuntu 14.04 и живём как-то, вот только учителя с трудом вообще с техникой дружат )


      1. Sheti
        29.10.2019 13:58

        Насколько я понял из разговоров тех к кому приходила проверка, то приходит человек и вбивает в яндексе что то типа «как сделать бомбу» и давай по ссылкам ходить.
        Если я введу белый список, то мне только и придётся, что его пополнять и смысл интернета в школе с таким списком будет около нуля. А черный список я естественно вести не в состоянии.
        Если рассуждать здраво, то тут безвыходная ситуация.


        1. Demosfen
          29.10.2019 22:46

          Приходит проверка из прокуратуры, вбивает в Яндекс-картинки "белая азбука" и вы влетаете на штраф.


        1. blooddemon747 Автор
          30.10.2019 09:47

          выход в такой ситуации есть и я указал его в статье — делаем фильтрацию по рабочему времени минус 1 час. Детям полный интернет не нужен, а вот для учителей, если что-то надо будет найти — пусть либо ищут дома, либо ждут определенного времени. + проверка если и придет, то утром или ближе к середине дня.


    1. safari2012
      29.10.2019 17:31
      +1

      А, собственно, почему? На сайте очень много хороших пошаговых инструкций на самые разные темы.


  1. alkoro
    29.10.2019 11:57

    >У некоторых сайтов множество поддоменов, субдоменов и т.д.
    Вот это самый адский пункт. Я конструировал велосипеды белые списки.
    Для работы нам понадобится всего лишь разрешить сайт sitename.ru, а на деле это оборачивается головняком с определением да что же он не работает то, и что ж тебе, болезному ещё надо то?. Не всегда это можно определить анализом статической части, у нас же вебдваноль как никак, фрейморки, скрипты и динамическая разметка рулят. В общем, неблагодарная это работа. Плагин uMatrix в какой то мере облегчает(ит) её, он сразу показывает в итоговой таблице возможные запросы посторонних доменов со страницы.


    1. Kanlas
      29.10.2019 13:19

      Можно ведь просто проанализировать access.log у сквида, отфильтровав по конкретному компьютеру, и никакого головняка. В крайнем случае открыть консоль девелопера в хроме и посмотреть вкладки network и sources.


      1. alkoro
        29.10.2019 13:38

        Именно так я этим занимался. Но проще просто открыть панельку uMatrix, в которой все запросы сведены в табличку с уникальными доменами.


        1. Kanlas
          29.10.2019 14:13

          Сейчас специально сравнил с хромом. Такая же табличка получается, разве что не пишет на какой тип данных ссылается

          Скриншот


  1. Kanlas
    29.10.2019 13:34

    Это скорее how-to в стиле копировать-вставить в терминал. Если бы все параметры были объяснены подробнее, было бы круто. А так есть куда более подробные статьи на хабре по сходной теме. Например, вот.

    К тому же Webmin является плохим выбором, т.к. любит ломать конфиги, пишет их абсолютно нечитаемым для человека способом и вообще работает не очень стабильно. И хоть вы предлагаете его использовать только в качестве мониторинга, другой человек, увидев богатство настроек Webmin, вполне может начать им редактировать что-то, а потом быть неприятно удивлен. Лучше уж поставить CentOS с Cockpit (есть и под deb-based дистрибутивы, но их я не пробовал), если так хочется вебморды.

    Так же решил посмотреть подробнее правила, у вас ошибка:

    http_access allow localnet CONNECT
    http_access deny !Safe_ports - применится на всех. Применилось бы и на CONNECT, если бы не первое правило
    http_access deny CONNECT !SSL_ports - уже не применится, т.к. первое allow правило разрешило все для CONNECT


    1. Kanlas
      29.10.2019 14:30

      *правила применятся, конечно, но т.к. целевая acl группа у нас localnet, то для нее эти правила действовать не будут


    1. blooddemon747 Автор
      30.10.2019 10:31

      1. how-to в стиле копипаста, верно. Читайте «Введение» в котором указано, для кого статья. Зачем учителям информатики подробное описание действий? Краткого вполне достаточно.
      2. Про Webmin, да спорная штука. Однако, очень удобно, когда необходимо срочно что-то поправить в конфигах, а ты находишься далеко от терминала (другой конец школы, например).
      3. По правилам — с тем, что есть, все работает. Если убрать мое правило (остальные же по умолчанию), то HTTPS выдает ошибку сертификата. Почему? Не знать… Подозреваю, что это связано с маршрутизацией на проксю через микротик, так как на аналогичном сервере, но с настроенным DHCP (dnsmasq) и являющимся проксей и роутером одновременно, со стандартным конфигом без моего правила все работает нормально.


      1. Kanlas
        30.10.2019 17:03

        1. Мне кажется, лучше хоть немного понимать что ты делаешь. Впрочем, я никого не виню, т.к. сам далеко не образец (посмотрите мою публикацию), это скорее посыл к тому, что на хабре было бы хорошо публиковать более расширенные гайды, т.к. остального полно на других ресурсах.
        2. Ну, тут не поспоришь. А можно пример такой ситуации?
        3. Действительно странно, смотрю на свой конфиг и у меня CONNECT фигурирует только в запрете портов, правда в моем случае прокси прописывается в системных настройках черех wpad и, соответственно, я обхожусь без ssl bump. Вообще, сквид бывает очень капризный, конечно. У меня есть подозрение, что http_access deny CONNECT !SSL_ports как-то мешает localhost, может еще где-то правила перекрывают. Поэтому предлагаю следующий конфиг, чтобы вынести все, что относится к самому серверу, за остальные правила и не давать им пересекаться:

        http_access allow localhost
        http_access deny manager
        http_access deny !Safe_ports
        http_access deny CONNECT !SSL_ports
        http_access deny blacklist
        http_access allow whitelist
        http_access deny all worktime
        http_access allow all


        Если будет возможность, попробуйте.


        1. blooddemon747 Автор
          30.10.2019 18:40

          2. Например, у меня сервер для кабинетов информатики, о котором я писал с DHCP, стоит в одном из кабинетов, который находится достаточно далеко от моего кабинета. Были у него некоторые проблемы с доступом к одному сайту. я подключился через Webmin с одного из компов в кабинете и перенастроил, сразу все проверив. В противном случае мне пришлось бы бегать из кабинета в кабинет.
          3. Завтра проверю. Кстати, если использовать редирект в микротике с помощью правил nat, то сквид блокирует все на свете, не принимая во внимание белый список. в логах на белый список вместо TCP_DENIED пишет TCP_MISS и выдает страницу запрета (http). Такое ощущение, что соединение зацикливается и блокируется. хотя правило на исключение зацикливания тоже присутствовало. странности невообразимые))


          1. Kanlas
            31.10.2019 09:59

            2. Я тут вспомнил, что у Cockpit есть так же доступ в консоль (у Webmin тоже есть, если не ошибаюсь). Так что можно через вебморду в консоль ходить) Жаль нормальную веб панель сквиду так и не придумали
            3. А что за правило на исключение зацикливания? Можно увидеть?


            1. blooddemon747 Автор
              31.10.2019 10:48

              2. Я так и делал. Только консоль там (в webmin) кривая. Файл открывается в новом окне. Сохраняется не по комбинации клавиш, а жмяканьем мыши на дискетку. После закрытия, приходится заново открывать консоль. Подлагивает еще к тому же. Но для срочной правки конфигов пойдет.
              3. add chain=dstnat dst-port=80 protocol=tcp src-address=(squid). Такое же для 443 порта.


          1. Kanlas
            31.10.2019 10:31

            3. Там, кстати, не выходила с страница с предупреждением о незащищенном соединении с ошибкой NET::ERR_CERT_COMMON_NAME_INVALID?


            1. blooddemon747 Автор
              31.10.2019 10:53

              Была и такая. Еще была ошибка подобная тоже по сертификату. Отличаются они тем, что одна не пускает вообще на сайт, а вторая дает выбор — там есть кнопка «Все равно перейти на сайт». Нажимаю на нее и он выдает страницу запрета Squid на другом языке. Странно, потому что все эти сайты должны открываться по https и не должны подменяться страницей запрета.


        1. blooddemon747 Автор
          31.10.2019 11:36

          Проверил конфиг. http заработал как надо. https — ошибка сертификата ERR_CERT_AUTHORITY_INVALID.


          1. Kanlas
            31.10.2019 12:27

            Блин, как-то странно… По сути он пытается подменять сертификат, хотя конфиг это не делает… Видимо, с ssl_bump надо как-то по-другому работать с http_access. А если так?
            http_access allow localhost
            http_access deny manager
            http_access deny !Safe_ports
            http_access deny CONNECT !SSL_ports
            http_access allow CONNECT
            http_access deny blacklist
            http_access allow whitelist
            http_access deny all worktime
            http_access allow all


            1. blooddemon747 Автор
              31.10.2019 13:46

              Очень странно, но конфиг сработал. Странно, потому что deny выше allow и, по идее, должно отрабатывать правило deny, а allow уже игнорироваться.


              1. Kanlas
                31.10.2019 14:28

                У сквида в правилах условия соединяются логическим «И»
                http_access deny CONNECT !SSL_ports — запретить, если клиент соединяется методом connect И порт соединения не в списке SSL_ports
                Поэтому все, что не попадает под deny, разрешается следующим правилом.

                А ошибка сертификата похоже из-за того, что http_access нельзя в прозрачном режиме применить к https, сквид этого просто не может, и браузер интерпретирует дальнейшие попытки переправлений от сквида, как mitm. Поэтому вывод этого трафика из дальнейшей обработки правилом http_access allow CONNECT сработал, и он ушел на обработку в ssl_bump. Впрочем, в непрозрачном режиме такой проблемы нет. Так что если настроите wpad, можете смело отказываться от ssl_bump за ненадобностью.

                Кстати, могу посоветовать использовать в ACL правилах dstdomain вместо url_regex. Регулярки нужны, если блочится конкретная ссылка (а в https без mitm этого не получится), а не весь сайт. Обработка регулярок в целом всегда медленней и по нагрузке тяжелее. Ну и в ssl правилах тоже перейти на ssl::server_name без regex. Да и записывать сайты проще, нет лишнего мусора, например: .google.com. Но это, конечно, если вы не блочите прямые ссылки по http, хотя сейчас сайтов без шифрования почти нет.


                1. blooddemon747 Автор
                  31.10.2019 16:43

                  Очень понятно объяснили работу Squid. Благодарю.
                  Про dstdomian подумаю, потестирую, но пока так, как есть.
                  Подскажите, пожалуйста, как записать регулярку для Squid, чтобы заблокировать (или открыть), к примеру, example.com/route/index.php (или любую другую отдельную страницу на сайте)


  1. Dukat
    29.10.2019 13:50

    Сочувствую нынешним школьникам.


    1. iig
      29.10.2019 14:21

      У каждого первого школьника есть личный телефон, с мобильным интернетом и без squid. Сочувствовать нужно тем, кто пилит задачи подобные этой, вместо учить детей информатике.


  1. Vvka
    30.10.2019 09:48

    Все это можно было сделать на Mikrotik с его прозрачным прокси и контентной фильтрацией


    1. blooddemon747 Автор
      30.10.2019 09:55

      1. Микротик и его прозрачный прокси не работают с HTTPS.
      2. Даже если делать фильтрацию фаерволом, используя домены в address list, то не откроются сайты типа Ютуба и Вк. Точнее они откроются, но на Ютубе не будет ни одного видео, а в вк — картинок. Почему? Посмотрите, где хранит свои видео Ютуб и картинки — вк.
      3. Поверьте, я пробовал.


  1. Stas43
    30.10.2019 09:50

    Уже пару раз приходили «проверяющие из прокуратуры» в наше учебное заведение. Она у нас рядом, через дорогу. Как только к ним на практику приходят студенты юрфака — они их и отправляют на проверки. Им опыт, прокуратуре — галочка. Меня предупреждают о их приходе и я включаю на оба (два) компьютера аналогичный фильтр, на которые студенты имеют допуск. Они стоят в библиотеке. Все другие компьютеры по классам и в компьютерном классе, в том числе, они с паролем преподавателя и студенты по определению не могут на них выйти в интернет кроме как под присмотром. Так вот, приходят эти «проверяющие» — я их провожу в библиотеку и они со своего листа начинают вводить адреса. А у меня по https — полный блок, а по http — DansGuardian. Подергаются, подергаются и уйдут ни с чем. Я фильтр отключаю. По другому нельзя. Студентам в процессе обучения (а им от 15 до 50 лет) нужны такие сайты, где и нарко препараты и т.п. вещи. У каждого студента смартфон с интернетом и в гробу он видел это ограничение. Это для младшей и средней школы еще я пойму, а для колледжа и СПО — одно очковтирательство.


    1. blooddemon747 Автор
      30.10.2019 10:09

      Яндекс и Гугл уже на HTTPS, в итоге вы блочите поисковики. DG — это хорошо. Он не работает с HTTPS, но зато фильтрация по ключевым фразам.


  1. PetRiot
    30.10.2019 09:56

    1) WPAD избавляет от головняка с поддержкой SSL в Squid.
    2) В nano сохранять файл вызывая закрытие? Чта? У вас ctrl или o вырваны из клавиатуры?
    3) Зачем привязывать комп к ip адресу, если можно в настройках клиента по маку выставить нужный addresslist?


    1. blooddemon747 Автор
      30.10.2019 10:05

      1. WPAD геморнее ставить. Но не спорю — с ним было бы меньше проблем. Я не стал заморачиваться.
      2. Зачем совершать 2 действия, когда можно совершить одно? Если нажать ctrl+o мы сохраним файл а потом опять ctrl+x чтобы закрыть. Или один раз ctrl+x и сразу сохранить, раз все равно закрывать файл. Экономия времени.
      3. Какого клиента, простите? В микротике в адресс-лист не добавить мак.


      1. PetRiot
        30.10.2019 12:44

        1) Поднять lighttpd сервер со статичными данными и в микротике прописать опцию DHCP… по мне, так геморройнее организовывать прозрачный перехват https трафика… к тому же позволяет избавиться от squid (имея флешку. флешку в микротик)
        2) «Чтобы сохранять файл в nano, необходимо нажать Ctrl+X и следом Y.»
        Ещё раз. Вы утверждаете, что сохранить файл можно лишь закрыв его. Не надо так.
        3) /ip dhcp-server lease add address-list=«admins» mac-address=«aa:aa:aa:aa:aa:aa» address=pool1…
        Пункт 3.4.б просто дополнить: сразу же указать address-list. и тогда надобность в привязке адреса отпадает

        Сразу извинюсь: читал пост по диагонали. Сам в прошлом году на коленке ради прикола поднял следующую щщтуку:
        В микротик подключил флешку и настроил родной прокси. На ту же флешку закинул образ openwrt/ С помощью MetaRouter на OpenWRT поднял lighttpd. На ём настроил WPAD. На микротиковском DHCP принудительно подсовываю WPAD и всё. Все лезут принудительно и «прозрачно» через прокси.


        1. blooddemon747 Автор
          30.10.2019 13:35

          1. Идея с флешкой интересна, но, считаю, что будет нестабильна, когда на такую систему будет обращаться большое количество клиентов. А выдержит ли сам микротик? Ведь, как я понял, вы использовали ресурсы самого роутера. В любом случае, отдельный сервер надежней и стабильней.
          2. Пожалуй, вы правы. Статью поправил.
          3. Действительно, так получается более разумно. Но есть пара моментов: а) статья все-таки для учителей информатики. про IP они в курсе, а вот про MAC-адреса… может и в курсе, но для них «многабуков» сложнее. б) я делаю привязку всех своих IP-адресов, потому что мониторю сеть через Dude по IP, а аренда часто заканчивается, так как компы бывают выключены неделями (особенно летом), поэтому и написал, как делал сам.


          1. PetRiot
            30.10.2019 13:46

            3. а) привязка по ip происходит как раз исходя из mac адреса. Всё, чем отличается мой метод от предложенного вами, это
            — Не добавлять вручную хост к адрес личту со статическим ip
            — В DHCP Lease в поле адреса указать пул, а в поле address-list нужный лист.
            б) Плохая практика привязываться к ip. Советую переходить на Hostname.


            1. blooddemon747 Автор
              30.10.2019 20:07

              Dude с Hostname почему то не ладит. Точнее ладит, но не со всеми. Если указать «Имя в адрес» то адрес он не подкинет. Я думаю, косяк на клиенте. Пока нет времени разбираться — делаю по IP.


          1. PetRiot
            30.10.2019 14:26

            Также пункты 3.в и 3.г
            По-моему, поля перепутаны: в General разрешаем (у вас Mangle), а в Mangle маркируем (у вас general)


            1. blooddemon747 Автор
              30.10.2019 20:15

              Нет, все верно. В Ip-Firewall есть вкладка Mangle куда мы добавляем маркировку пакетов (на скриншоте она). В окне добавления нового правила есть вкладки general. action и тд. В пункте г) подразумевается, что мы уже находимся в IP-Firewall-Mangle


              1. PetRiot
                31.10.2019 01:04

                У вас разрешающие правила во вкладке Mangle, а маркировка в General…


                1. blooddemon747 Автор
                  31.10.2019 10:00

                  Вот, я отсюда брал информацию. docs.diladele.com/tutorials/mikrotik_transparent_squid/mangling.html. Там более подробно со скриншотами. (в списке источников указано, если что)
                  Mangle это вкладка в самом IP-Firewall, а general первая вкладка в окне добавления нового правила для mangle Сама маркировка на вкладке action=mark routing и далее.
                  Правила в пункте В) разрешают принятие трафика от прокси.


          1. PetRiot
            30.10.2019 14:35

            и 6.4 — WPAD
            Поясню в чём проблема. Вы заворачиваете необходимый трафик (порты 80 и 443) на прокси сервер через таблицу маршрутизации. То есть пакет идёт так:
            Клиент — Шлюз (микротик) — Прокси
            А должен
            Клиент — Прокси.
            Добиться это можно двумя способами:
            1) Заворачивать необходимый трафик не с помощью таблицы маршрутизации, а перенаправляя трафик (redirect в NAT). Не уверен на все 100%, что будет верно отрабатывать ip клиента, но, по логике вещей, должно. Это называется прозрачный прокси сервер. При этом SSL могут не работать, так как сертификат принадлежит вашему прокси, а не сайту. Теоретическая атака MiM. Для клиента это может быть заметно.
            2) Использовать явно прокси сервер. Опять два варианта:
            а) На каждом клиенте явно прописать прокси сервер.
            б) Использовать WPAD. Информации достаточно много. В двух словах: WPAD — это автоматические настройки прокси серверов для клиентов. Теоретическая атака MiM.
            При «явном» использовании прокси сервера у клиента не возникает проблем с «подменным» сертификатом, так как это нормальная работа прокси сервера. А значит, что клиент даже не будет догадываться, что работает через прокси!


            1. blooddemon747 Автор
              30.10.2019 19:10

              Спасибо за разъяснение! Я в принципе догадывался, что оно так.
              NAT я ковырял. Нашел правила для него, по логике, должны были работать. Проверил и в итоге блокировка всех сайтов даже из белого списка и http и https.
              Правила таковы.
              add chain=dstnat dst-port=80 protocol=tcp src-address=(squid)
              add action=dst-nat chain=dstnat dst-port=80 protocol=tcp src-address=(наша_сеть) to-addresses=(squid) to-ports=3128
              add action=src-nat chain=srcnat dst-address=(squid) dst-port=3128 protocol=tcp to-addresses=(mikrotik)
              Такие же для 443 порта.
              В логах на белый список реакция TCP_MISS и блок страница. IP почему то микротика (шлюза).
              Пробовал выносить сервер в отдельную подсеть, добавив ее к интерфейсу локалки, и использовать одно правило.
              add action=dst-nat chain=dstnat dst-port=80 protocol=tcp src-address=(наша_сеть) to-addresses=(squid_подсеть) to-ports=3128
              Для 443 соответственное.
              Так http отрабатывал нормально, а https, как вы и сказали, дает ошибку сертификата.
              Буду ковырять WPAD. Как закончу, либо дополню статью, либо добавлю еще одну. Но пока рабочий вариант таков. Еще раз спасибо за помощь :)


              1. Barsook
                31.10.2019 10:03

                Если у Вас в прозрачном режиме домены с белого списка ругаются на сертификат, то посмотрите лог сквида cache.log, там скорее всего присутствуют записи SECURITY ALERT: Host header forgery detected on ... (local IP does not match any domain IP)
                Если это так, то это фитча (не баг) сквида, в плане безопасности и вот тут есть лекарство для этого, но придётся пересобирать пакет. Этот патч работает в том числе и на 4.8 версии.


                1. blooddemon747 Автор
                  31.10.2019 10:10

                  Сейчас не ругаются. Ругаются, только если перенаправление nat-ом делать.


                  1. Barsook
                    31.10.2019 12:33

                    А Вам и не нужно nat-ить пакеты на http/https портах, их нужно перенаправлять (если микрот в такое умеет, проверить нет и не скоро появится возможность) на сквид. Но сразу тогда исключить на микроте пакеты с сквида, иначе получится цикл, между микротом и сквидом.


                    1. blooddemon747 Автор
                      31.10.2019 13:27

                      Выше в моем комменте правила на перенаправление пакетов с помощью nat на проксю. И правило на исключение цикла присутствует. Это без маршрутизации. С маршрутизацией вариант в статье.
                      Других вариантов перенаправления пакетов я не встречал.
                      Микротик построен на базе линуксового фаервола, следовательно, должен уметь все, что умеет линукс.
                      В любом случае, я попробовал ваше предложение по замене шлюза у DHCP сервера на микроте, и в логах появились нормальные IP. Создал и проверил списки — все работает. Ни ошибок сертификата, никаких глюков. Только придется побегать по клиентам, сменить сеть с общественной обратно на рабочую)) Также, я смогу отказаться от второго сервера для кабинетов информатики, и сделать их списком.
                      Благодарю)


                      1. Barsook
                        31.10.2019 14:35

                        не за что благодарить, сам при помощи хабра познавал эту науку.

                        как совет глянуть логику в конфиге, а именно тут
                        ssl_bump peek step1
                        ssl_bump terminate blacklist_ssl
                        ssl_bump splice whitelist_ssl
                        ssl_bump terminate all worktime
                        ssl_bump splice all


                        я бы убрал бы 3-ю строку, а 4-ю переделал бы так

                        ssl_bump terminate all worktime !whitelist_ssl

                        т. к. белый список нам разрешён всегда, то и запрещать его не нужно и строка говорит блокировать всё в рабочее время кроме белого списка.

                        и последняя строка говорит, что устанавливать все соединения, что не вошли в предыдущие правила.

                        если в рабочее время вообще всё запрещено, тогда и разрешающее правило для белого списка не нужно.


                        1. blooddemon747 Автор
                          31.10.2019 16:37

                          не. мне так более понятно смотреть на правила. лучше пусть будут отдельные короткие четко ориентированные правила, чем одно длинное. даже, если оба варианта делают одно и то же.


            1. Barsook
              31.10.2019 09:29

              для использования сквида не нужно подменять сертификат и явно указывать настройки прокси у клиента, достаточно собрать сквид с поддержкой ssl, что автор и сделал, указать сквиду порт прозрачного проксирование и обычными средствами firewall зарулить трафик на нужные порты, что так же автор сделал. Возможны какие-то отличия настройки микротов от ipfw могут быть. У меня на боевом рабочем сервере все пакеты с локального интефейса по портам 80, 8080, 443 заруливаются на локалхост и оттуда уже на сквид.


              1. blooddemon747 Автор
                31.10.2019 10:44

                Да, если указать в DHCP в качестве шлюза Squid, то в логах появляются нормальные IP. К тому же, становится не нужным маркировка и маршрутизация пакетов.
                Только что все проверил. Все действительно работает. Но надо будет протестировать все соединения по всем портам.


            1. Kanlas
              31.10.2019 12:13

              При «явном» использовании прокси сервера у клиента не возникает проблем с «подменным» сертификатом, так как это нормальная работа прокси сервера. А значит, что клиент даже не будет догадываться, что работает через прокси!

              Неверно, проблема с сертификатом никуда не денется. Проблема уйдет только потому, что сквид сможет блочить сайты по http_access правилам, т.к. клиент будет явно передавать запрашиваемый домен прокси серверу и сквиду не придется выдирать его из https трафика. Соответственно, ssl_bump будет в принципе не нужен.


  1. PetRiot
    30.10.2019 15:05

    Можно обойтись и без прокси.
    Шаги:
    1) /ip firewall nat add chain=srcnat out-interface-list=WANs src-address-list=teachers action=masquerade disabled=no
    2) /ip firewall nat add chain=srcnat out-interface-list=WANs dst-address-list=whitelist action=masquerade disabled=no
    3) /ip firewall address-list add list=whitelist address=<разрешённое доменное имя> disabled=no
    4) /ip dhcp-server lease add mac-address=<учительский mac> address=<пул адресов> address-lists=teachers disabled=no

    Смысл сказанного:
    1) Маскарадим только учителей. То есть те компы, которые указаны в листе teachers могут ходить тудыть-сюдыть как умеют и могут. Прошу заметить, что я маскаражу по interface-list. Я привых все интерфейсы я загоняю в бриджи, а бриджи раскидываю по листам. удобно и красиво. Особенно при мультиване.
    2) Маскарадим всех остальных только на те адреса, которые разрешены (а списке whitelist). Остальное просто не пройдёт.
    3) В address list добавляем разрешённые сайты
    4) Заносим учительские компы в список учителей

    В винбоксе это делается проще. клац-клац и маскарад…


    1. blooddemon747 Автор
      30.10.2019 19:31

      У меня смысл в том, что фильтровать надо ВСЕ компы, включая учительские, т.к. прокуратура может зайти в любой кабинет и проверить там комп (да, это до безумия глупо, т.к. компы там учительские, но спорить с прокуратурой — себе дороже).
      Далее по предложенному вами — я так понял, вы имеете ввиду адрес лист по доменному имени (микротики с 6.3, вроде, версии прошивки могут сами искать ip по домену в листе). Я это уже пробовал (очень мне не хотелось делать сервер....). Проблема в том, что учителям нужен ютуб, а он хранит фрагменты видео на сайте googlevideo.com. Сами фрагменты имеют свой уникальный адрес в формате абракадабра.googlevideo.com. Исходя из этого, даже если добавить googlevideo.com по имени в адрес лист, он найдет ip этого домена, но все, что находится перед этим доменом, он будет блокировать. Я так понял, у всех фрагментов видео свои ip адреса. На практике это вылазит в разблокировку ютуба, как сайта, но все видео будут блокироваться (в консоле разработчика в хроме идут бесконенчые дропы с адресов типа абракадабра.googlevideo.com). Та же история и с картинками в ВК.
      Только я использовал для этого фаервол а не nat с маскарадом (правило в фаерволе с action=tcp reject или drop для всех сайтов, кроме address list)
      К тому же у этого способа был и еще один минус — высокая нагрузка на роутер. Были моменты, когда он не сразу находил IP в address list, подвисал и начинал выпендриваться (список то большой — около 1500 адресов). Помогала перезагрузка роутера, но это же не дело…