UPD. 03.12.2022 Внесены небольшие исправления в файл конфигурации SQUID. Исправлено пара грамматических моментов. Исправлены правила для iptables
Преамбула
Примерно в середине этого учебного года во всех школа была подключена так называемая ЕСПД (единая система передачи данных) от Ростелеком. Казалось бы, отличная идея – нам дали довольно быстрый канал, да еще и бесплатно!!! Что может быть плохого? И на самом деле, как бы плохо я не относился к Ростелекому, скорость хорошая, задержка низкая, надежность вполне. Действительно, все хорошо работает, но... Ростелеком не был бы Ростелекомом, если бы все было идеально =) Настройка данной услуги сделана через явное указание прокси в системе. То есть, сисадминам в каждой школе (например, у нас 150 машин) нужно физический попасть на каждую машину, зайти в настройки, ввести соответствующие данные, затем установить корневой сертификат от Ростелекома, и только тогда все это заработает. «Ну, что такого?» –скажете вы. Ну, сделал скриптик, да пробежался по всей школе, или вообще через AD все можно автоматизировать. Да, но не во всех школах есть AD, а учитывая текущую ситуацию с софтом в РФ, может быть, уже завтра у нас не будет никаких виндовсов. Ну, а со скриптом все-таки надо пройтись лично по каждому ПК. А если у вас девайс, который не понимает скриптики от виндовса? Например, 30 планшетов, – поди настрой-ка их. В общем, все это создает довольно много проблем, а вот что мешало сделать все через обычное прозрачное проксирование, ума не приложу. Тем более, до этой навороченной ЕСПД все было как раз-таки через прозрачное проксирование, и все замечательно работало.
Ну да ладно, – подумал я и позвонил в техподдержку Ростелекома с вопросом: мол, ребят, а как мне это сделать-то попроще? Неужели нельзя сделать обычный прозрачный прокси-шлюз? На что мне грубо и резко ответили: это невозможно, и не лезь не в свое дело, и вообще мы тут компуХтерами занимаемся, это сложно очень, а вы тут еще отвлекаете. Я немного приукрасил, конечно, но фраза «ЭТО НЕВОЗМОЖНО» прозвучала для меня, как красная тряпка. Вооружившись желанием (не первый раз убеждаюсь, что этого более чем достаточно), я принялся изучать информацию. Заранее хочу выразить огромный респект Герману Сырыкову, без него я бы точно не смог это реализовать. Огромное спасибо, бро, за теоретическое сопровождение. Еще хотелось бы обозначить, что для кого-то это действительно тривиальная задачка, которую он решает по несколько раз в неделю. Я же являюсь обычной «училкой», и у меня нет ни серьезных инженерных знаний, ни многолетнего опыта настройки сетей за спиной.
Необходимые знания
Необходимо на хорошем уровне уметь обращаться с операционными системами семейства Linux. Понимать, как работают компьютерные сети. Понимать теоретические принципы работы маршрутизации и прокси-серверов. Понимать принципы работы веб-фильтров. Знать, как устроен перехват и фильтрация трафика, в том числе HTTPS. Иметь опыт или хотя бы понимание как собирать программы под Linux
Цель
Цель сделать максимально простую работу клиентов ЕСПД. Я хочу воткнуть провод и пользоваться, подключиться к Wi-Fi и наслаждаться. Я не хочу возиться с настройками прокси в системе и вот это вот все.
Теория
Итак, безумие началось. Устанавливаем ubuntu server. Производим первичную конфигурацию сетевых настроек (ip, шлюз и тд.). Собираем SQUID. Его нужно именно собирать, так как тот, что в репозиториях, во-первых, довольно старый, во-вторых, без поддержки HTTPS. Настраиваем SQUID таким образом, чтобы он принимал трафик в «прозрачном режиме» и перенаправлял все содержимое портов 80 и 433 на прокси-сервер Ростелекома. Устанавливаем на клиенты сертификат. Кто-то резонно заметит, что все равно придется ходить по всем машинам и ставить сертификат. Не совсем так. Дело в том, что ставить сертификат нужно только там, где нам нужна фильтрация от Ростелекома, а там, где она не нужна, мы можем настроить работу без подмены сертификата вообще. То есть, сунул провод в ПК и все, оно само работает.
Я не буду описывать, как поставить и настроить ubuntu server. Уровень статьи – «продвинутый администратор», поэтому будем подразумевать, что установить и настроить сетевой шлюз читатель в состоянии.
Сборка SQUID
На уже рабочем шлюзе. Все делаем под рутом:
apt-get update && apt-get -y upgrade && reboot
Включаем репозиторий «Universe»:
add-apt-repository universe
Ставим все необходимые для компиляции сквида вкусняшки:
apt-get -y install devscripts build-essential fakeroot debhelper dh-autoreconf dh-apparmor cdbs
И еще вкусняшек:
apt-get -y install libcppunit-dev libsasl2-dev libxml2-dev libkrb5-dev libdb-dev libnetfilter-conntrack-dev libexpat1-dev libcap-dev libldap2-dev libpam0g-dev libgnutls28-dev libssl-dev libdbi-perl libecap3 libecap3-dev libsystemd-dev libtdb-dev
Создаем каталог:
mkdir squid
Переходим туда:
cd squid
Теперь зайдем на http://http.debian.net/debian/pool/main/s/squid/ и найдем там нужную нам версию squid. На момент написания материала последняя версия была 5.5, её я и собираю. Если вам нужна другая версия, то замените 5.5 на свою, например, 4.6. К слову, качать самую последнюю версию не рекомендуется – можно напороться на баги. Еще часто мелькала информация, что версии ниже 5.0 не умеют работать по HTTPS с родительским прокси и клиентом одновременно (принять от клиента по HTTPS и передать родителю по HTTPS). Не знаю, правда это или нет.
Качаем исходники:
wget http://http.debian.net/debian/pool/main/s/squid/squid_5.5-1.dsc
wget http://http.debian.net/debian/pool/main/s/squid/squid_5.5.orig.tar.xz
wget http://http.debian.net/debian/pool/main/s/squid/squid_5.5.orig.tar.xz.asc
wget http://http.debian.net/debian/pool/main/s/squid/squid_5.5-1.debian.tar.xz
Распаковываем исходники:
dpkg-source -x squid_5.5-1.dsc
Переходим в папку исходников:
cd squid-5.5
Теперь важно перед сборкой указать опции для работы с STL/SSL, иначе сквид соберется без их поддержки.
Заходим в папку debian и находим там файл rules. В нем нам нужно добавить в конец переменной BUILDCXX следующие параметры:
--enable-ssl
--enable-ssl-crtd
--with-openssl
Сохраняем файл и возвращаемся на 2 каталога вверх. Запускаем сборку:
dpkg-buildpackage -rfakeroot -b -us -uc
Сборка займет довольно много времени.
Устанавливаем собранные пакеты. Сперва поставим языковой пакет:
sudo apt-get install squid-langpack
Отлично. Теперь ставим сам сквид:
dpkg --install squid-common_5.5-1_all.deb
dpkg --install squid-openssl_5.5-1_amd64.deb
dpkg --install squidclient_5.5-1_amd64.deb
После сборки запускаем и смотрим все ли завелось:
systemctl stop squid && systemctl start squid && systemctl status squid && /usr/sbin/squid -v
Если стоит статус «запущен», то все отлично, можно переходить к настройке.
Настройка SQUID
Итак, теперь нужно немного поднастроить наш прокси-сервер. Первым делом мы сгенерируем необходимые сертификаты, которые будем «скармливать» клиентскому браузеру. Хранить мы их будем в каталоге настроек.
Инициируем /var/lib/ssl_db делается командой
/usr/lib/squid/security_file_certgen -с -s /var/lib/ssl_db -M 4MB
Для удобства создадим каталог ssl:
mkdir /etc/squid/ssl
И перейдем туда:
cd /etc/squid/ssl
Генерируем закрытый ключик:
openssl genrsa -out /etc/squid/ssl/squid.key
Подготавливаем запрос на выдачу сертификата:
openssl req -new -key /etc/squid/ssl/squid.key -out /etc/squid/ssl/squid.csr
Генерируем сертификат:
openssl x509 -req -days 3650 -in /etc/squid/ssl/squid.csr -signkey /etc/squid/ssl/squid.key -out /etc/squid/ssl/squid.pem
Генерируем корневой сертификат, который затем будем ставить на клиенты:
openssl x509 -in /etc/squid/ssl/squid.pem -outform DER -out squid.der
Теперь нужно поменять права на каталог сертификатов:
chown -R proxy:proxy /etc/squid/ssl
Отлично. Сертификаты готовы. Теперь можно настроить сам SQUID. Хорошим тоном будет сделать резервную копию файла настроек:
cp /etc/squid/squid.conf /etc/squid/squid.conf.bak
Теперь уберем из файла конфигурации все лишнее, все, что начинается с # и $:
cat /etc/squid/squid.conf.bak | grep -v "^#" | grep -v "^$" > /etc/squid/squid.conf
Окей, теперь открываем файл в любимом редакторе (я предпочитаю vi) и вносим следующие изменения:
Я убрал все лишнее что на мой взгляд мне не нужно в текущей ситуации. Файл конфиг файл выглядит так:
http_access allow CONNECT all
http_access allow all
on_unsupported_protocol tunnel all
cache deny ALL
http_port 3128
http_port 3129 intercept
https_port 3130 intercept ssl-bump cert=/etc/squid/ssl/squid.pem key=/etc/squid/ssl/squid.key
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER
#ssl_bump peek all
ssl_bump splice all
#ssl_bump bump all
#ssl_bump none all
never_direct allow all
cache_peer 10.0.51.52 parent 3128 3130 no-query no-digest proxy-only
sslcrtd_program /usr/lib/squid/security_file_certgen -s /var/lib/ssl_db -M 400MB
Давайте пробежимся по основным моментам.
http_access allow CONNECT all
http_access allow all
Разрешаем всем и все. В дальнейшем рекомендую прописать сбда конкретыне ip адреса ваших подсетей.
Обязательно оставляем непрозрачный доступ к прокси, иначе он будет выдавать ошибку при старте:
http_port 3128
Теперь прописываем 2 прозрачных порта – один для HTTP, второй для HTTPS, соответственно. Не забываем в порт HTTPS прописать созданные ранее ключ и сертификат:
http_port 3129 intercept
https_port 3130 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/ssl/squid.pem key=/etc/squid/ssl/squid.key
Добавляем тег, который говорит, что мы будем разбирать HTTPS трафик:
ssl_bump bump all
Если нам не нужна фильтрация, то пишем вместо all «none» или «splace». В этом случае на клиенты не нужно будет ставить сертификат сквида.
Запрещаем выкидывать трафик в интернет, так как мы будем все перенаправлять на родительский прокси:
never_direct allow all
Отлично. Теперь прописываем сам родительский прокси Ростелекома, где 10.0.10.10 – это ip, 3128 – порт:
cache_peer 10.0.10.10 parent 3128 0 no-query no-digest proxy-only default
Последнее, что нам нужно указать – это программа, которая будет создавать временные сертификаты на каждого клиента (или как-то так, я точно не разобрался =)):
sslcrtd_program /usr/lib/squid/security_file_certgen -s /var/lib/ssl_db -M 4MB
Сохраняем файл, перезапускаем SQUID:
systemctl start squid
Остался последний шаг – установить корневой сертификат самого Ростелекома. Для того, чтобы это сделать в ubuntu, достаточно поместить его в папку /usr/local/share/ca-certificates/ и вызвать команду:
update-ca-certificates
Если команда выдала «add: 1», значит, сертификат успешно обнаружен и установлен.
Настройка SQUID готова.
Перенаправление трафика в сам SQUID
Нам необходимо перенаправить весь трафик с портов 80 и 443 на порты 3129 и 3130. Для этого нам нужно прописать следующие 2 правила:
Iptables –t nat -A PREROUTING -p tcp -m multiport --dports 80,8080 -j REDIRECT --to-ports 3130
Iptables –t nat -A PREROUTING -p tcp -m multiport --dports 443,993,465 -j REDIRECT --to-ports 3130
Настройка клиента с фильтрацией
Вот и все. Теперь осталось на клиенте установить сертификат squid.der, который мы сгенерировали ранее, если нам необходима фильтрация. Устанавливать его нужно в «доверительные центры сертификации». Если фильтрация не нужна то все должно работать «сходу», просто после всовывания провода в разьем сетевой карты. Можно проверять работу всей системы.
P.S. На самом деле я продолжил безумие, пошел еще немного дальше и настроил совместную работу фильтрации Ростелеком и нашего родного контент-фильтра «Интернет Контроль Сервер» (ИКС). К слову, отличные ребята – фильтр действительно неплохо работает. Если вы как раз сейчас выбираете систему фильтрации, то посмотрите в их сторону. Теперь трафик с клиента идет на ИКС, с ИКС на SQUID, со SQUID уже на прокси Ростелекома. Обе фильтрации работают – даже если пропустил 1 фильтр, то может словить второй. Производительность в целом на уровне – да, заметно, что не летает, но работать вполне комфортно. Если кого-то это интересует, то пишите в личку –расскажу, как я это реализовал.
Оригинал: https://vk.com/@easy_linux-boremsya-s-espd-ot-rostelekom-stavim-i-nastraivaem-squid-del