Pull to refresh

Контентная фильтрация в школе на основе Ubuntu 18.04 и прозрачного Squid, с интеграцией в сеть на MikroTik и не только

Reading time19 min
Views30K


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 тоже будет работать)


Теперь необходимо включить прохождение пакетов сквозь наш сервер. Открываем файл /etc/sysctl.conf
nano /etc/sysctl.conf

Ищем в нем строку net.ipv4.ip_forward=1 и раскомментируем ее. Если стоит значение 0, то меняем на 1.
Введем команду для применения настройки
sysctl -p /etc/sysctl.conf


После настройки сети, рекомендую перейти сразу в терминал, и продолжать работу уже в нем. Для этого, если вы не выбрали на этапе установки 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.
UPD3: добавил исправление в 3.1 — включение прохождения пакетов сквозь сервер, которое забыл добавить изначально. Иначе не работает интернет. Спасибо Dmitry1986 за тестирование статьи.
Tags:
Hubs:
-8
Comments67

Articles