Установка Squid с HTTPS фильтрацией на Ubuntu Server 20.04 .

Сегодня в статье рассмотрим Установку и настройку прокси сервера squid на операционной системе Ubuntu Server 20.04 LTS. Сразу предупреждаю, что данная инструкция справедлива только для Ubuntu 20.04. Если у вас более ранняя версия, то вам необходимо обновится до 20.04, вот инструкция как это сделать.






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




В настоящее время сайтов с поддержкой протокола http становится все меньше и меньше, а вот на протоколе https количество доменов непрерывно растет, причем гигантскими шагами. В связи с этим фильтрация squid`ом http трафика бессмыслена. Но в репозитории Ubuntu находится squid без поддержки SSL. До сих пор не понимаю почему не залить squid с поддержкой SSL, но до ладно, зато есть исходники из которых мы сами можем собрать пакет с поддержкой HTTPS. И так поехали:




Обновление системы




Первым делом обновим наш сервер:




sudo apt update && sudo apt dist-upgrade -y




Сборка squid из исходников.




Включим возможность использования исходников, для этого необходимо отредактировать файл /etc/apt/sources.list. Раскомментируем строки, которые начинаются на «deb-src»




sudo nano /etc/apt/sources.list




Посмотреть полный default source.list можно в данной статье.




После редактирования обновляемся еще раз:




sudo apt update




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




sudo apt install openssl devscripts build-essential dpkg-dev libssl-dev libsasl2-modules-gssapi-mit




Чтобы не засорять систему, всю сборку я буду проводить из под новой директории. Для этого создадим её и перейдем в нашу директорию следующими командами:




mkdir /home/squid
cd /home/squid




Скачиваем все необходимое для SQUID:




sudo apt build-dep squid -y




Скачиваем сами исходники нашего прокси-сервера:




sudo apt source squid




В случае если появится предупреждение о правах, устанавливаем их на скачанный файл и повторяем предыдущее действие:




sudo chmod 777 squid_4.10-1ubuntu1.3.dsc
sudo apt source squid




Переходим в директорию с исходниками:




cd squid-4.10/




Открываем файл rules на редактирование, в котором укажем, что наш прокси будет собираться с поддержкой SSL (HTTPS):




sudo nano debian/rules




Для этого в разделе с устанавливаемыми модулями добавим сроки:




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




Обращаем внимание на символ «» в конце строк, должен быть везде кроме последней, вот примерно так:







Начинаем собирать DEB пакет. Процесс очень долгий, поэтому наберитесь терпения.




sudo dpkg-buildpackage -d




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




cd ..




И начинаем установку пакетов, установка завершится с ошибкой:




sudo dpkg -i *.deb




Следующей командой доставляем недостающие зависимости:




sudo apt install -f




Повторяем установку, теперь установка завершится без ошибок:




sudo dpkg -i *.deb




Проверяем версию установленного SQUID и проверим наличие упоминаний SSL




squid -v | grep ssl




Настройка прокси-сервера Squid




Сделаем копию конфигурационного файла squid на всякий случай:




sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.save




Очистим файл от дефолтной конфигурации




cp /dev/null /etc/squid/squid.conf




И поправим наш файл squid :




sudo nano /etc/squid/squid.conf




access_log /var/log/squid/access.log squid
acl blacklist url_regex -i "/etc/squid/lists/blacklist"
acl whitelist url_regex -i "/etc/squid/lists/whitelist"
acl localnet src 10.5.1.0/24            # RFC 1918 local private network (LAN1)
acl localnet src 10.1.1.0/24            # RFC 1918 local private network (LAN2)
acl manager proto cache_object
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
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access allow whitelist
http_access deny blacklist
http_access deny manager
include /etc/squid/conf.d/*
http_access allow localnet
http_access allow localhost
http_access deny all
# Указываем наш FQDN сервера
visible_hostname squid.ru
# Порт для HTTP трафика (если указываем вручную)
http_port 3128
# Прозрачный порт для HTTP трафика
http_port 3129 intercept
# Порт для HTTPS трафика (если указать intercept, то будет прозрачным)
https_port 3130 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=20MB tls-cert=/etc/squid/proxyCA.pem tls-key=/etc/squid/proxyCA.pem cipher=HIGH:MEDIUM:!LOW:!RC4:!SEED:!IDEA:!3DES:!MD5:!EXP:!PSK:!DSS options=NO_TLSv1,NO_SSLv3,SINGLE_DH_USE,SINGLE_ECDH_USE tls-dh=prime256v1:/etc/squid/bump_dhparam.pem
sslproxy_cert_error allow all
always_direct allow all
acl whitelist_ssl ssl::server_name_regex "/etc/squid/lists/whitelist"
acl blacklist_ssl ssl::server_name_regex "/etc/squid/lists/blacklist"
acl step1 at_step SslBump1
ssl_bump peek step1
ssl_bump terminate blacklist_ssl
ssl_bump terminate !whitelist_ssl
ssl_bump splice all
#ssl_bump server-first all
#ssl_bump none all
sslcrtd_program /usr/lib/squid/security_file_certgen -s /var/lib/squid/ssl_db -M 4MB
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|?) 0     0%      0
refresh_pattern /(Packages|Sources)(|.bz2|.gz|.xz)$ 0 0% 0 refresh-ims
refresh_pattern /Release(|.gpg)$ 0 0% 0 refresh-ims
refresh_pattern /InRelease$ 0 0% 0 refresh-ims
refresh_pattern /(Translation-.*)(|.bz2|.gz|.xz)$ 0 0% 0 refresh-ims
# example pattern for deb packages
#refresh_pattern (.deb|.udeb)$   129600 100% 129600
refresh_pattern .               0       20%     4320




Создадим файлы черного и белого списков




sudo mkdir /ets/squid/lists
sudo touch /etc/squid/lists/blacklist
sudo touch /etc/squid/lists/whitelist




Чтобы не получить ошибку о пустых файлах внесем в них какие-либо сайты. Например сайт mail.ru будет выглядеть в списке вот так:




mail.ru




Экранируем знак точки косой чертой.




Подмена сертификатов




Сгенерируем свой сертификат… лет так на 10 🙂




proxyCA.pem — и сертификат и ключ в одном файле




cd /etc/squid/
sudo openssl req -new -newkey rsa:2048 -sha256 -days 3650 -nodes -x509 -extensions v3_ca -keyout proxyCA.pem  -out proxyCA.pem




Создадим сертификат для установки его на компьютеры пользователей (корневой)




sudo openssl x509 -in proxyCA.pem -outform DER -out squid.der




Скопируем squid.der на свой компьютер, это сертификат для установки его на клиентские компьютеры… Установим его либо руками, либо групповой политикой. Как это сделать будет описано далее.




Генерируем файл параметров




sudo openssl dhparam -outform PEM -out /etc/squid/bump_dhparam.pem 2048




Настроим права на использование файла SSL-сертификата и файла параметров




sudo chown proxy:proxy /etc/squid/bump_dhparam.pem
sudo chmod 400 /etc/squid/bump_dhparam.pem
sudo chown proxy:proxy /etc/squid/proxyCA.pem
sudo chmod 400 /etc/squid/proxyCA.pem




Выставляем права на /var/spool/squid/ и /var/log/squid/




sudo chown proxy:proxy -R /var/spool/squid
sudo chown proxy:proxy -R /var/log/squid/




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




sudo mkdir -p /var/lib/squid
sudo rm -rf /var/lib/squid/ssl_db
sudo /usr/lib/squid/security_file_certgen -c -s /var/lib/squid/ssl_db -M 4MB
sudo chown -R proxy:proxy /var/lib/squid




Следующим шагом включаем ip_forwarding для разрешения проходящего трафика через сервер:




sudo echo 1 >> /proc/sys/net/ipv4/ip_forward




Применим конфигурацию:




sudo squid -k reconfigure




Затем можно перезапускать службу squid:




sudo systemctl restart squid




Осталось настроить редирект и браузер.




Настройка IPTABLES




Настроим NAT на нашем сервере. Я для этого создаю следующий файл:




sudo nano /etc/nat




!#bin/bash
#Вводим свои данные
ipt=iptables
INT=ens18
LAN=10.5.5.0/24

#Очищаем цепочки
$ipt -F
$ipt -t nat -F
$ipt -t mangle -F

#Очищаем цепочки
$ipt -X
$ipt -t nat -X
$ipt -t mangle -X

#Правила по умолчанию
$ipt -P INPUT DROP
$ipt -P FORWARD ACCEPT
$ipt -P OUTPUT ACCEPT

#Разрешаем трафик на loopback-интерфейсе
$ipt -A INPUT -i lo -j ACCEPT

#Разрешить соединения, которые инициированы изнутри
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$ipt -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

#Разрешаем пинг-пакеты
$ipt -A INPUT -p icmp -m icmp ! --icmp-type 5 -j ACCEPT

#Открываем доступ HTTP,HTTPS,SSH,OPENVPN,squid

$ipt -A INPUT -p tcp -m multiport --dports 3128,3129,3130,22 -j ACCEPT

#Заворачиваем http и https трафик

$ipt -t nat -A PREROUTING -s $LAN -p tcp --dport 80 -j REDIRECT --to-port 3129
$ipt -t nat -A PREROUTING -s $LAN -p tcp --dport 443 -j REDIRECT --to-port 3130
$ipt -t nat -A POSTROUTING -o $INT -s $LAN -j MASQUERADE




делаем его исполняемым и запускаем:




sudo chmod +x /etc/nat && /etc/nat




Настройка сертификатов в браузере




firefox




Сейчас большинство сайтов используют технологию HSTS для предотвращения MiTM атак, поэтому если вы хотите настроить Squid для фильтрации трафика в своей организации, вам следует добавить сертификат squid.der сгенерированный на предыдущем шаге в браузер. Рассмотрим на примере Firefox. Откройте Настройки -> Защита и приватность -> Просмотр сертификатов -> Центры сертификации.







Затем нажмите кнопку Импортировать и выберите файл squid.der. Отметьте галочки, что следует доверять этому сертификату.




Yandex Browser




Откройте Настройки -> Системные -> Управление сертификатами -> Центры сертификации.










Затем нажмите кнопку Импорт и выберите файл squid.der. Отметьте галочки, что следует доверять этому сертификату.




Настройка сертификата в Windows 7




Щелкаем два раза на сертификате и в появившемся окне нажимаем Установить сертификат.










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







Далее выбираем Доверенные центры сертификации










На предупреждение отвечаем Да










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




Видео инструкция