Инструкция по настройке Squid HTTP-proxy в корпоративной среде.
В данной инструкции решается задача по настройке прокси-сервера Squid для контроля интернет-доступа пользователей.
Что включает в себя статья:
Squid будет устанавливаться не в стандартную директорию, а так же использовать OpenSSL установленный рядом (что бы не заморачиваться с уже установленным OpenSSL или не навредить системе + получим последнюю версию OpenSSL).
ВНИМАНИЕ: В статье часто используются блоки кода с командами. Перед выполнением рекомендуется просмотреть что вы делаете и обратить внимание на комментарии, в них могут содержаться важные замечания.
1) Подготовка OpenSSL и Squid.
В первую очередь необходимо определиться с модулями (ключами компиляции) Squid и OpenSSL.
Лучше использовать необходимый минимум, что бы уменьшить количество точек обхода защиты (Данная статься скорее о настройке, чем о безопасности…).
Загрузка, сборка и установка пакета OpenSSL.
Официальный репозиторий: https://github.com/openssl/openssl.
wget https://github.com/openssl/openssl/releases/download/openssl-3.6.1/openssl-3.6.1.tar.gztar -xzf openssl-3.6.1.tar.gzcd openssl-3.6.1# apt install build-essential pkg-config # Установка компилятора C./config shared --prefix=/opt/squid/openssl \--openssldir=/opt/squid/openssl \-Wl,-rpath=/opt/squid/openssl/lib64# -Wl,... говорит компилятору: «передай всё, что после запятой, линковщику # -rpath=/opt/squid/openssl/lib опция для линковщика: «встрой в исполняемый файл путь к библиотекам» make make installldd /opt/squid/openssl/bin/openssl # Проверить зависимости и доустановить при их отсутствии
Загрузка, сборка и установка пакета Squid.
Официальный репозиторий: https://github.com/squid-cache/squid
# Нужны зависимости для пакетаapt install \libtirpc-dev \libldap2-dev \libsasl2-dev \pkg-config \libpam0g-dev \libkrb5-dev \libtdb-dev \libcap-dev \libnetfilter-conntrack-dev \libcppunit-dev \heimdal-clients# GitHub - https://github.com/squid-cache/squid# Вы можете использвоать последнюю всерию, а совместимость инструкций squid посмотреть на официальном файле в документации: https://www.squid-cache.org/Versions/v7/cfgman/index_all.html#toc_accept_filterwget https://github.com/squid-cache/squid/releases/download/SQUID_7_5/squid-7.5.tar.gztar -zxf squid-7.5.tar.gzcd squid-7.5# Конфигурация может пройти успешно, но функционал будет недоступен из за нехватка какой то из библиотек# Внимательно иследуйте ошибки и предупреждения# КОММЕНТАРИИ УДАЛИТЬ перед применением./configure \ --prefix=/opt/squid \ # Основной каталог установки Squid --sysconfdir=/opt/squid/etc \ # Каталог для конфигурационных файлов (squid.conf и др.) --localstatedir=/opt/squid/var \ # Базовый каталог для переменных данных (логи, кэш, PID и т.д.) --libexecdir=/opt/squid/libexec \ # Каталог для вспомогательных исполняемых файлов (например, ssl_crtd) --with-swapdir=/opt/squid/var/cache/squid \ # Директория кэша на диске --with-logdir=/opt/squid/var/log/squid \ # Директория для лог-файлов --with-pidfile=/opt/squid/var/run/squid.pid \ # Путь к файлу PID процесса Squid --with-default-user=proxy \ # Пользователь, от которого будет запускаться Squid --enable-auth-negotiate=kerberos \ # Поддержка аутентификации Negotiate/Kerberos --enable-auth-basic=LDAP,PAM \ # Поддержка Basic-аутентификации через LDAP и PAM --enable-external-acl-helpers=time_quota,unix_group,SQL_session,file_userip,kerberos_ldap_group,LDAP_group \ # Внешние ACL-хелперы для расширенного контроля доступа --enable-icap-client \ # Поддержка ICAP-протокола (интеграция с антивирусами и DLP) --enable-delay-pools \ # Включение ограничения пропускной способности (traffic shaping) --enable-cache-digests \ # Поддержка Cache Digests для кооперативного кэширования --enable-follow-x-forwarded-for \ # Учитывать заголовок X-Forwarded-For при определении IP клиента --enable-eui \ # Поддержка определения MAC-адреса клиента (EUI-48/EUI-64) --enable-esi \ # Поддержка Edge Side Includes (для кэширования динамических фрагментов) --enable-icmp \ # Использовать ICMP для оценки сетевой задержки (pinger) --enable-wccp \ # Поддержка Web Cache Communication Protocol (Cisco и др.) --enable-linux-netfilter \ # Интеграция с Netfilter (для TPROXY и прозрачного проксирования) --enable-storeio=rock \ # Использовать storeio "rock" — высокопроизводительный кэш-движок на основе SQLite --enable-removal-policies=heap,lru \ # включает все доступные политики удаления объектов из хранилища (например, heap, LRU‑производные и др.) --disable-arch-native \ # Отключить оптимизации под конкретную архитектуру CPU (для переносимости) --disable-translation \ # Отключить локализацию интерфейса (оставить только английский)# для ssl-dump: --enable-ssl \ # включает поддержку ssl режима --enable-ssl-crtd \ # Включить генерацию сертификатов для HTTPS-трафика (SSL Bump) # генерацией сертификатов занимается отдельный процесс, а не сам прокси сервер. --with-openssl=/opt/squid/openssl # Указать собственную сборку OpenSSL (важно для SSL Bump)make allmake install# Проверить завивимости, скорее всего чего то будет не хвататьldd /opt/squid/sbin/squid# Установим необходимую зависимость для работы Squid и ADsudo apt-get install libsasl2-modules-gssapi-mit
2) Настройка запуска через systemd.
Создаем файл сервиса /etc/systemd/system/squid.service c содержимым:
[Unit]Description=Squid Web Proxy Server (custom build)Documentation=man:squid(8)After=network.target network-online.target nss-lookup.target[Service]# Путь к файлу keytab можно указать здесь или напрямую в squid.conf > "auth_param negotiate program...-k <FullPath>", в моем случае укажу там# Environment=KRB5_KTNAME=/opt/squid/etc/squid.keytabType=forkingPIDFile=/opt/squid/var/run/squid.pidExecStartPre=/opt/squid/sbin/squid -z # Инициализация кэша SquidExecStart=/opt/squid/sbin/squidExecReload=/opt/squid/sbin/squid -k reconfigureExecStop=/opt/squid/sbin/squid -k shutdownUser=root # Squid запускается от root, для использования socket, потом переходит в режим пользователя указанного в конфигурации.Group=rootLimitNOFILE=65536# Restart=on-failure# RestartSec=10[Install]WantedBy=multi-user.target
3) Настройка аутентификации пользователей на основе Kerberos и LDAP.
Потребуется: — Пользователь Active Directory (AD) для Kerberos и LDAP, создается в оснастке “Пользователи и компьютеры”. — Токен keytab сгенерированный на DC AD, для Kerberos аутентификации. — Настроить клиентскую часть Kerberos на сервере со Squid. — Настроить конфигурацию Squid на использование хелперов работы с Kerberos и LDAP. — Настройка аутентификации пользователей на основе Kerberos. — Настройка определения группы пользователя на основе LDAP.
Создание токена keytab — Windows AD DC
Keytab-файл — что это и зачем
Keytab-файл нужен ТОЛЬКО для самого Squid-сервера. Он не используется пользователями, а позволяет Squid проверять тикеты клиентов (временные пропуска)
Keytab — это файл с зашифрованными ключами службы, привязанный к SPN (Service Principal Name) вида: HTTP/servername.domain.ru@DOMAIN.RU Этот SPN зарегистрирован в Active Directory на уровне учётной записи сервера (например, UserAD_Squid или компьютерной учётной записи)
Логика работы: Шаг 1: Клиент получает тикет — Пользователь ivanov на Windows-машине в домене заходит на сайт через прокси. — Браузер автоматически запрашивает у DC (контроллера домена) тикет для службы HTTP/servername.domain.ru Шаг 2: Squid проверяет тикет — Squid получает тикет от клиента — Чтобы расшифровать его и узнать, кто пользователь, Squid использует свой keytab — Если расшифровка успешна, то пользователь подтверждён как ivanov@DOMAIN.RU
Keytab — это “приватный ключ” для службы HTTP/servername.domain.ru, Без него Squid не может проверить подлинность тикета
-
Keytab не содержит паролей пользователей, он содержит только ключи для одной службы HTTP/servername.domain.ru
-
Каждый клиент использует свой собственный тикет Keytab. Squid позволяет проверить любой тикет, выданный для HTTP/servername.domain.ru, но не генерирует тикеты для клиентов.
-
Если украсть keytab — можно подделать прокси, поэтому его нужно хранить с правами
600и владельцем службы Squid (в нашем случае proxy)
Регистрация на DC AD SPN аккаунта (создание keytab):
# Создать учетку пользователя в AD# Регистрируем SPN для этой учётной записи AD# setspn /S <Принцепал> <sAMAccountName пользователя>setspn /S HTTP/servername.domain.ru ADUserSquid# Проверяемsetspn /L squid# Генерируем keytabktpass /princ HTTP/servername.domain.ru@DOMAIN.RU `/mapuser ADUserSquid@DOMAIN.RU `/crypto ALL ` # Для простоты можно добавить все кодировки в файл/ptype KRB5_NT_PRINCIPAL `/pass password_ADUserSquid `/out C:\squid.keytab# Проверяемsetspn /L squid### Если в keytab помещали толькуо одну кодировку, можно добавить в 1 файл keytab### AES128 — ДОБАВЛЯЕМ к существующему файлу# ktpass /princ HTTP/servername.domain.ru@DOMAIN.RU `# /mapuser ADUserSquid@DOMAIN.RU `# /crypto AES128-SHA1 `# /ptype KRB5_NT_PRINCIPAL `# /pass password_ADUserSquid `# /in C:\squid.keytab `# /out C:\squid.keytab# Если нужно удалить SPN# setspn /D HTTP/servername.domain.ru ADUserSquid# Копируем C:\squid.keytab на сервер squid# Зададим файлу следующие права:chown proxy:proxy /opt/squid/etc/squid.keytabchmod 600 /opt/squid/etc/squid.keytab# Если нужно проверить, что keytab содержит нужный SPN (linux)klist -kte squid.keytab# Keytab name: FILE:squid.keytab# KVNO Timestamp Principal# ---- ------------------- ------------------------------------------------------# 11 01/01/1970 03:00:00 HTTP/servername.domain.ru@DOMAIN.RU
Должен быть ТОЛЬКО ОДИН пользователь, сопоставленный одной записью SPN (HTTP/<имя сервера с сервисом Squid в нижнем регистре>@<realm Active Directory в верхнем регистре>) Если несколько разных пользователей сопоставленных с записью SPN, то проверка подлинности Kerberos будет ВСЕГДА НЕУДАЧНОЙ
Настройка клиентской части Kerberos на сервере со Squid.
Установка:
### Подготовка### ВЫПОЛНЯЙТЕ ОБДУМАННО!!!# Остановить и удалить winbind, samba, если был установлен до этого squid с авторизацией в AD через NTLM#sudo systemctl stop winbind smbd nmbd#sudo apt purge winbind samba samba-common smbclient -y#sudo apt autoremove -y# Удалить старые конфиги (если есть)#sudo rm -f /etc/samba/smb.conf#sudo rm -f /etc/krb5.conf# Ставим нужные libsudo apt install -y \ krb5-user \ # если не стало то проверить есть ли зависимость libkrb5-3 - может быть версия зависимости таже что нужна просто "патченная осью OS" libkrb5-dev \ libldap2-dev \ libsasl2-dev \ ldap-utils
Содержимое файла /etc/krb5.conf
[libdefaults]default_realm = DOMAIN.RU # Основной домен ADdns_lookup_realm = false # Не искать realm через DNSdns_lookup_kdc = true # Искать контроллеры через DNS SRV-записиticket_lifetime = 24h # Время жизни билетаrenew_lifetime = 7d # Время обновления билетаforwardable = true # Разрешить делегирование билетаrdns = false # Не использовать обратный DNS (улучшает безопасность)# Используйте для отключения контроля кодировки # (закоментируйте default_tgs_enctypes, default_tkt_enctypes, permitted_enctypes, что бы не переопределяли allow_weak_crypto)# allow_weak_crypto = true# Установить определенный AES# - Default Ticket Granting Service encryption types. Определяет список шифров, которые клиент будет запрашивать по умолчанию, когда обращается к сервису (TGS) за билетом доступа к конкретной службе (например, к HTTP-сервису Squid).# Когда ваш браузер или утилита kinit запрашивает билет для HTTP/servername...`, она скажет контроллеру домена: «Пожалуйста, выдай билет, зашифрованный только через `aes256-cts-hmac-sha1-96`». Она даже не будет упоминать другие типы (AES128, RC4, DES).default_tgs_enctypes = aes256-cts-hmac-sha1-96 # aes128-cts-hmac-sha1-96# Default Ticket (TGT) encryption types. Определяет список шифров, которые клиент будет запрашивать по умолчанию при первоначальной аутентификации для получения TGT (Ticket Granting Ticket) — главного билета сессии пользователя.# При входе в домен система попросит контроллер выдать главный билет (TGT), зашифрованный только через `aes256`.default_tkt_enctypes = aes256-cts-hmac-sha1-96 # aes128-cts-hmac-sha1-96# Permitted encryption types. Он задает «белый список» шифров, которые системе разрешено использовать вообще.permitted_enctypes = aes256-cts-hmac-sha1-96 # aes128-cts-hmac-sha1-96 rc4-hmac[realms]DOMAIN.RU = {kdc = DC1.domain.ru# Контроллер доменkdc = DC2.domain.ruadmin_server = DC1.domain.ru# Сервер администрированияdefault_domain = domain.ru}[domain_realm].domain.ru = DOMAIN.RU# Автоматическое сопоставление доменаdomain.ru = DOMAIN.RU
# Проверяем keytab# Пробуем получить билетkinit -V -k -t /opt/squid/etc/squid.keytab HTTP/servername.domain.ru@DOMAIN.RU# Смотрим билетklist# ----------------- Если не прошло### Проверьте кодировку. может AES не та # очистите кэшkdestroy -A# -----------------
Пример аутентификации пользователей на основе Kerberos в конфиге squid.conf:
visible_hostname servername.DOMAIN.RUhttpd_suppress_version_string oncache_effective_user proxyhttp_port 3128debug_options ALL,1 33,2 28,2 50,2 # подробный лов для debugaccess_log stdio:/opt/squid/var/log/squid/access.logcache_log stdio:/opt/squid/var/log/squid/cache.log# Аутентификация Kerberosauth_param negotiate program /opt/squid/libexec/negotiate_kerberos_auth -d / -k /opt/squid/etc/squid.keytab / -s HTTP/servername.domain.ru@DOMAIN.RUauth_param negotiate children 20auth_param negotiate keep_alive on# Доступ всем прошедшим аутентификациюacl auth proxy_auth REQUIREDhttp_access allow auth
Пример определения группы пользователя на основе LDAP в конфиге squid.conf:
visible_hostname servername.DOMAIN.RUhttpd_suppress_version_string oncache_effective_user proxyhttp_port 3128access_log stdio:/opt/squid/var/log/squid/access.logcache_log stdio:/opt/squid/var/log/squid/cache.logauth_param negotiate program /opt/squid/libexec/negotiate_kerberos_auth \ -d \ -k /opt/squid/etc/squid.keytab \ -s HTTP/servername.domain.ru@DOMAIN.RU############################################################################# АУТЕНТИФИКАЦИЯ LDAP. Поиск пользователя в группе ADexternal_acl_type ldap_Squid_ADGroup_InternetAccess \ttl=300 negative_ttl=60 \%LOGIN /opt/squid/libexec/ext_kerberos_ldap_group_acl \ -g ADGroup_InternetAccess \ -D DOMAIN.RU \ -u ADUserSquid@DOMAIN.RU \-p password_ADUserSquid \ # иной способ передачи пароля не пройдет, только в явном виде-l ldap://DOMAIN.RU# Должно идти после инструкций external_acl_typeacl politics_Squid_ADGroup_InternetAccess_From_AD external ldap_Squid_ADGroup_InternetAccessacl politics_authenticated proxy_auth REQUIRED# Запрет для не авторизованныхhttp_access deny !politics_authenticated# Доступ для групп AD - ADGroup_InternetAccesshttp_access allow politics_Squid_ADGroup_InternetAccess_From_AD# Запретить все остальноеhttp_access deny all
Если появляются ошибки, то для проверки хелперов можно использовать это:
# На сервере Squid### Хелпер ext_kerberos_ldap_group_acl echo "ADUserSquid@DOMAIN.RU ADGroup_InternetAccess" | \sudo -u proxy /opt/squid/libexec/ext_kerberos_ldap_group_acl \ -n \ -g ADGroup_InternetAccess \ -D DOMAIN.RU \ -u ADUserSquid@DOMAIN.RU\ -p "$(cat /opt/squid/etc/ldap.pass)" \ # или сразу password_ADUserSquid # -p password_ADUserSquid \ -l ldap://dc1.DOMAIN.RU # Можено указать конкретный DC ###################### Хелпер negotiate_kerberos_auth sudo -u proxy /opt/squid/libexec/negotiate_kerberos_auth \-k /opt/squid/etc/squid.keytab \-s HTTP/servername.domain.ru@DOMAIN.RU# Если просто ожидает (зависло) - то все OK, по крайней мере на уровке keytab и принцепала
Попробуйте поискать здесь: Исправление частых ошибок Squid при настройке Kerberos MS AD DC
4) Настройка SSL-Bump (MITM).
Немного полезной информации по работе SSL-Bump (Данный блок несет информационный характер, можно пропустить)
Server Name Indication (SNI) — расширение компьютерного протокола TLS, которое позволяет клиенту указывать имя хоста, с которым он пытается соединиться, во время процесса «рукопожатия» (первоначального установления соединения)
Цель SNI — позволить серверу предоставлять несколько сертификатов на одном IP-адресе и TCP-порту, что позволяет работать нескольким безопасным (HTTPS) сайтам (или другим сервисам поверх TLS) на одном IP-адресе без использования одного и того же сертификата на всех сайтах
Вскрытие HTTPs трафика Squid
Когда клиент (браузер) инициирует HTTPS-соединение через прокси, Squid не может просто так прочитать зашифрованный трафик. Ему нужно перехватить рукопожатие (Handshake), подменить сертификат сервера своим (который мы сгенерируем или PKI) и установить два отдельных TLS-туннеля
Этапы проверки соединения внутри Squid
Процесс ssl_bump разбит на три логических этапа. Директивы acl … at_step … позволяют тебе сказать Squid: «На этом конкретном этапе проверь вот эти условия и реши, что делать дальше»
SslBump1 — этап приветствия
-
Когда: Сразу после получения пакета ClientHello от клиента
-
Что известно Squid:
-
IP-адрес клиента
-
Порт назначения
-
SNI (Server Name Indication) — имя домена, которое клиент хочет посетить (например, google.com). Это критически важно, так как на этом этапе трафик еще не расшифрован полностью, но SNI передается в открытом виде
-
Версии протоколов и шифры, предложенные клиентом
-
-
Что НЕ известно: Полный URL (путь /path), заголовки HTTP, контент. Сертификат сервера еще не получен Squid’ом от удаленного хоста
-
Зачем нужен: Чтобы принять решение: блокировать ли соединение сразу по домену (SNI), пропустить ли его без проверки (bypass) или перейти к следующему этапу для глубокой инспекции
SslBump2 — этап серверного сертификата
-
Когда: После того как Squid связался с целевым сервером и получил от него сертификат (ServerHello + Certificate), но до того, как он отправил поддельный сертификат клиенту.
-
Что известно Squid:
-
Всё, что было на этапе 1.
-
Данные сертификата реального сервера: Subject, Issuer, даты validity, SAN (Subject Alternative Names), наличие EV-расширений.
-
Squid уже знает, совпадает ли сертификат с ожидаемым доменом.
-
-
Зачем нужен: Самый мощный этап для фильтрации. Ты можешь проверить: — Кто выпустил сертификат? (Блокировать самоподписанные или неизвестные CA). — Действителен ли сертификат? — Совпадает ли CN/SAN с SNI?
-
Если всё ок — Squid генерирует свой сертификат “на лету” (подписанный твоим локальным CA) и отдает его клиенту.
-
SslBump3 — этап установленного туннеля
-
Когда: После завершения рукопожатия с клиентом. Туннель установлен.
-
Что известно Squid:
-
Полностью расшифрованный поток данных (так как Squid теперь стоит посередине с двумя ключами).
-
Теперь это работает как обычный HTTP-трафик внутри туннеля. Доступны методы HTTP, полные URL, заголовки, куки.
-
-
Зачем нужен: Обычно используется для финальных проверок перед тем, как просто пропускать трафик (peek -> splice или окончание bump). В современных версиях Squid большая часть логики фильтрации контента делается уже после этого этапа стандартными ACL (url_regex, mime_type и т.д.), но здесь можно принять решение прервать соединение, если что-то пошло не так при установке туннеля.
Инструкция ssl_bump
ssl_bump <action> [!]acl ...# <action>: Что делать с трафиком (splice, bump, peek, stare, terminate).# [!]acl_name: Необязательное условие. Если указан ACL, действие применяется только если запрос соответствует этому ACL. Знак ! инвертирует условие («если НЕ соответствует»)
Action
-
splice— Стать TCP-туннелем без расшифровки трафика. Действие по умолчанию-
Клиент общается напрямую с сервером. Squid не видит содержимое, не видит URL, не видит заголовки. Видит только IP и порт.
-
Клиент получает настоящий сертификат от целевого сервера. Цепочка доверия не нарушается. Когда использовать:
-
Для сайтов, где запрещена подмена сертификатов (Banking, Google, некоторые корпоративные порталы с Certificate Pinning).
-
Для повышения производительности (нет нагрузки на CPU для шифрования/расшифровки).
-
Для приватных доменов, которые ты не хочешь инспектировать. Нюанс этапов:
-
На
SslBump1: Туннель создается сразу после получения SNI. Сертификат сервера даже не запрашивается Squid’ом. -
На
SslBump2/3: Если мы уже сделали peek или stare, то splice завершает процесс инспекции и превращает соединение в простой туннель для остальной сессии.
-
-
bump— Полноценная атака MITM. Расшифровка, инспекция и повторное шифрование Как работает:-
На
SslBump1: Squid завершает рукопожатие с клиентом, используя свой сертификат (подписанный твоим локальным CA). Только после этого он идет к реальному серверу. -
На
SslBump2: Squid уже получил сертификат реального сервера, проверяет его, генерирует новый сертификат «на лету» (клонируя Subject, SAN, но подписывая своим ключом) и отдает его клиенту. -
На
SslBump3: Обычно здесь bump уже не имеет смысла, так как туннель установлен. Но технически это подтверждение продолжения расшифровки. Два независимых TLS-канала: Клиент<->Squid и Squid<->Сервер. Squid видит всё в открытом виде (URL, cookies, контент). Клиент видит сертификат, выпущенный твоим локальным CA. Требуется установка этого CA в доверенные корни на всех клиентах, иначе браузер выдаст ошибкуNET::ERR_CERT_AUTHORITY_INVALID. Когда использовать: -
Для полной фильтрации контента (антивирус, блокировка категорий, DLP).
-
Для аудита трафика. Риски: Ломает приложения с жестким пиннингом сертификатов (HPKP, хотя сейчас редко, или app-specific pinning).
-
-
peek— Посмотреть данные рукопожатия, но оставить возможность позже стать простым туннелем (splice). Это гибридный режим, введенный для гибкости.
Как работает:
- На `SslBump1`: Squid читает `ClientHello` (видит SNI), но не завершает рукопожатие с клиентом сразу. Он переходит к шагу 2.- На `SslBump2`: Squid соединяется с сервером, получает его настоящий сертификат, анализирует его (можно проверить ACL по имени в сертификате, issuer, сроку действия), но еще не отправляет клиенту поддельный сертификат.
Ключевая особенность: После peek на следующем этапе ты можешь выбрать splice. Если ты выберешь splice после peek на шаге 2, Squid передаст **оригинальный **сертификат сервера клиенту и станет прозрачным туннелем.
Зачем нужно: Чтобы принять решение о подмене (bump) на основе данных сертификата сервера, но если условия не подходят — честно пробросить трафик (splice), не ломая доверие клиента.
-
Пример: «Посмотри сертификат (
step2). Если он выпущен известным CA — сделайsplice(не ломай). Если самоподписанный — сделайbump(инспектируй, так как всё равно доверия нет)».
Это значит: если ты сделал peek на шаге 2, а потом на шаге 3 решил делать
bump, это может не сработать корректно или быть неэффективным, так как момент для инициирования подмены с клиентом мог быть упущен. Обычно цепочкаpeek->bumpиспользуется реже, чемpeek->splice. Чаще peek используют, чтобы решить:bumpилиsplice.
-
stare— Посмотреть данные рукопожатия, но оставить возможность позже сделать полную подмену (bump). Тоже гибридный режим, но с противоположной целью по сравнению сpeek.
Ключевая особенность: После stare ты планируешь сделать bump. Это позволяет принять решение о подмене на основе информации, полученной от сервера.
-
Пример: «Посмотри сертификат сервера (step2). Если в нем есть определенное расширение или он от конкретного Issuer — тогда делай bump. Иначе — splice».
Это значит: если ты сделал stare на шаге 2, путь назад к честному splice (передача оригинального сертификата) может быть закрыт или сложен. Протокол предполагает, что ты готовишься к активной подмене.
-
terminate— Немедленно закрыть соединение с обеих сторон.
Как работает:
-
Squid рвет TCP-соединение. Клиент получает ошибку соединения (часто ERR_CONNECTION_RESET или ERR_SSL_PROTOCOL_ERROR).
-
Когда использовать:
-
Блокировка доступа к запрещенным ресурсам (черный список доменов через SNI на шаге 1).
-
Обнаружение недопустимых сертификатов (например, истекший срок, несоответствие имени, отзыв CRL/OCSP) на шаге 2.
-
Защита от атак или подозрительного поведения при рукопожатии.
-
Пример использования команд:
# 1. Определяем этапыacl step1 at_step SslBump1 # ClientHalloacl step2 at_step SslBump2 # ClientHallo + Certificateacl step3 at_step SslBump3 # как обычный HTTP-трафик внутри туннеля. Доступны методы HTTP, полные URL, заголовки, куки.# 2. Списки доменовacl sites_to_bypass ssl_dom_regex (google\.com|bank\.ru|.*\.local$)# Тоже самое только через файл acl sites_to_bypass regex "/etc/squid/lists/bypass_regex.txt"# Каждая строка - это отдельное регулярное выражение# Экранировать точки нужно обязательно# google\.com# bank\.ru# .*\.local$acl sites_to_bypass dstdomain "/etc/squid/lists/bypass_sites.txt" # для файла Один домен на строку# Чтобы охватить домен и все его поддомены, ставь точку в начале (.domain.com).# Комментарии начинаются с `#`.# ssl_cert_error - Aвтоматически попадает в категорию «плохих», если **проверка сертификата сервера выявила ошибку**.# Это встроенный механизм Squid для валидации SSL-сертификатов на этапе `SslBump2` (когда Squid уже получил сертификат от целевого сайта, но еще не отдал свой клиенту).acl bad_certs ssl_cert_error# 3. Логика Step 1 (SNI)# Если домен в списке исключений - сразу делаем туннель (splice), даже не смотрим сертификат сервера.# Это экономит ресурсы и гарантирует 100% совместимость.ssl_bump splice step1 sites_to_bypass# Если домен в списке блокировки - рвем сразу.# ssl_bump terminate step1 blacklisted_domains# Для всех остальных - смотрим дальше (peek), чтобы получить сертификат сервера.# Смотрим на ClientHello всех соединений (чтобы узнать SNI/домен)ssl_bump peek step1# 4. Логика Step 2 (Сертификат сервера)# Если сертификат вызывает ошибки (истек, неверное имя) - рвем.ssl_bump terminate step2 bad_certs# Если сертификат от доверенного публичного CA и сайт не требует инспекции - можно сделать splice.# (Здесь мы используем преимущество peek: мы видели сертификат, решили не ломать и пробросили оригинал).ssl_bump splice step2 trusted_public_sites# Для всего остального - применяем полную подмену (bump).# Мы уже видели сертификат (благодаря peek на шаге 1 и переходе сюда), теперь генерируем свой.ssl_bump bump step2# 5. Логика Step 3# Если мы дошли сюда, значит туннель с подменой установлен. Просто продолжаем работу.ssl_bump splice step3
Подготовка Системы и Squid для SSL-Bump
# openssl # Добавьте следующую строку в раздел [v3_ca] файла конфигурации openssl.cnf # Разрешает использовать этот сертификат для подписи других сертификатов# Разрешает использовать этот ключ для подписи списков отозванных сертификатовkeyUsage = cRLSign, keyCertSign# Подготовьте среду для хранения SSL-сертификатовmkdir /opt/squid/etc/ssl -pchown proxy:proxy /opt/squid/etc/ssl -Rchmod 700 /opt/squid/etc/ssl -Rcd /opt/squid/etc/ssl# Создаем самоподписанный сертификатopenssl req -new -newkey rsa:4096 -sha256 -days 365 -nodes -x509 -extensions v3_ca -keyout squid_ca.pem -out squid_ca.pem# Преобразуйте созданный сертификат в формат DERopenssl x509 -in squid_ca.pem -outform DER -out squid_ca.der# Экспортируйте сгенерированный сертификат на клиентские компьютеры и установите его на них как сертификат центра сертификации. Способ выполнения этого действия зависит от браузера и операционной системы клиента# Создайте новую базу данных SSL для сервера Squid:# Обатитье внимание, директория ssl_db должна создаваться сама при выплнении командыmkdir /opt/squid/var/lib -p/opt/squid/libexec/security_file_certgen -c -s /opt/squid/var/lib/ssl_db -M 4MBchown proxy:proxy /opt/squid/var/lib -R
Пример конфигурации с SSL-Bump — squid.conf
Для добавления инспекции заменяется одна строка http_port 3128 на это:
# Прослушиваемый портhttp_port 3128 ssl-bump cert=/opt/squid/etc/ssl/squid_ca.pem generate-host-certificates=on dynamic_cert_mem_cache_size=4MB# Этапы проверки SSLacl step1 at_step SslBump1acl step2 at_step SslBump2acl step3 at_step SslBump3# Политика доменов без SSL-инспекцииacl politics_sites_no-inspection dstdomain "/opt/squid/etc/sites_no-inspection"# Проверяем сертификат сервера на ошибки (истек, самоподписанный, имя не совпадает и т.д.)# Создаем ACL, который истинен, если есть ЛЮБАЯ из перечисленных ошибок# Squid объединяет строки с одинаковым именем acl по ORacl politics_bad_certs ssl_error certHasExpired# Срок действия сертификата истек ERR_CERT_DATE_INVALIDacl politics_bad_certs ssl_error certNotYetValid# Сертификат еще не начал действоватьacl politics_bad_certs ssl_error certUntrusted# Издатель сертификата (Certificate Authority, CA) не доверяется Squid'омacl politics_bad_certs ssl_error certSelfSigned# Сертификат подписан самим же владельцем сайта, а не независимым центромacl politics_bad_certs ssl_error certDomainMismatch# Имя домена, к которому ты обращаешься, не совпадает с именем, указанным в сертификате# Пропускать без SSL-инспекции SNI из спискаssl_bump splice step1 politics_sites_no-inspection# Смотрим SNI и переходим к шагу 2, чтобы получить сертификат сервера.ssl_bump peek step1# Теперь у нас есть сертификат сервера. Проверяем его валидность.# Если сертификат плохой -> рвем соединение.# ssl_bump terminate step2 politics_bad_certs# вскрываем (bump) все остальные соединения# Сюда попадут все, кроме банков и сайтов с плохими сертификатамиssl_bump bump step2# Просто продолжаем работуssl_bump splice step3# Укажите расположение и параметры исполняемого файла для генератора сертификатов. security_file_certgen -h #helpsslcrtd_program /opt/squid/libexec/security_file_certgen -s /opt/squid/var/lib/ssl_db -M 4MB
5) Настройка лога и перенаправление на сборщик логов.
Для настройки стоит обратиться к документации официального сайта Там можно найти подробное описание как:
-
не писать лог для нужных ACL.
-
писать лог в файл.
-
отправлять лог по UDP/TCP.
-
писать лог в системный журнал.
Пример с отправкой лога доступа через syslog:
-
Лог расширен и праведен к формату JSON
Более подробно: примеры приведения формата лога к JSON
Проверялись не все, поэтому могут быть ошибки
"timestamp": "%ts.%03tu", # Время: Unix-timestamp с миллисекундами (основа для таймлайна)"time_human": "%tl" # Для человека (стандартный вид: 25/Oct/2023:14:30:05 +0300)"time_iso": "%tl{%Y-%m-%dT%H:%M:%S %z}" # Для человека и сортировки (2023-10-25T14:30:05 +0300)"date": "%tl{%Y-%m-%d}" # Для человека"time": "%tl{%H:%M:%S}" # Для человека"tz": "%z""client_ip": "%>a", # IP-адрес клиента (источник запроса)"client_port": "%>p", # Порт клиента (источник)"client_mac": "%>eui", # MAC-адрес клиента (EUI-48/64), если доступен в сети"user": "%[un", # Имя пользователя (из Auth, External ACL или SSL Cert)"auth_user": "%ul", # Имя пользователя строго из аутентификации (Basic/NTLM/Kerberos)"external_user": "%ue", # Имя пользователя из external_acl helper"ssl_user": "%us", # Имя из Subject SSL-сертификата клиента"http_method": "%rm", # Метод запроса (GET, POST, CONNECT и т.д.)"url": "%ru", # Полный URL запроса (после редиректов и адаптации)"raw_url": "%>ru", # URL точно так, как прислал клиент (до изменений Squid)"upstream_url": "%<ru", # URL, который фактически ушел на сервер назначения#"domain": "%{host}ru", # Домен из URL (удобно для фильтрации по сайтам)"path": "%rp", # Путь к ресурсу без домена и протокола"http_version": "%rv", # Версия HTTP протокола (1.0, 1.1, 2)"http_status": "%>Hs", # HTTP код ответа, отправленный клиенту (200, 403, 502)"upstream_status": "%<Hs", # HTTP код ответа, полученный от сервера/родителя"squid_status": "%Ss", # Статус кэша/действия Squid (TCP_HIT, TCP_MISS, TCP_DENIED, ERR_...)"hierarchy": "%Sh", # Откуда взяты данные (DEFAULT_PARENT, FIRST_PARENT, NONE)"size_response": "%<st", # Размер тела ответа, отправленного клиенту (байты)"size_request": "%>st", # Размер тела запроса от клиента (байты)"size_total_traffic": "%st", # Общий трафик сделки (запрос + ответ)"response_time_ms": "%tr", # Общее время обработки запроса (мс)"dns_time_ms": "%dt", # Время, затраченное на DNS-резолвинг (мс)"peer_time_ms": "%<pt", # Время ответа от вышестоящего прокси/сервера (мс)"forwarding_time_ms": "%<tt", # Общее время форвардинга (включая DNS, ACL, retries)"mime_type": "%mt", # MIME-тип контента (text/html, image/jpeg, application/json)"referer": "%{Referer}>h", # Заголовок Referer (откуда пришел пользователь)"user_agent": "%{User-Agent}>h", # Заголовок User-Agent (браузер/бот/ОС)"content_range": "%<sH", # Смещение конца переданного объекта (для частичного контента)"upstream_obj_size": "%<sS", # Полный размер объекта на источнике (даже если отдана часть)"req_attempts": "%[http::]request_attempts", # Количество попыток пересылки (ретраи)"conn_id": "%transport::>connection_id", # Уникальный ID транспортного соединения (для корреляции) # Чтобы связать строки, относящиеся к одному физическому TCP-соединению (Keep-Alive)"master_xid": "%master_xaction", # ID мастер-транзакции (монотонный счетчик внутри воркера) # Чтобы связать части одного файла (Range requests) или запросы в рамках одной вкладки браузера"local_ip": "%>la", # Локальный IP, на который подключился клиент (важно при мульти-IP)"local_port": "%>lp", # Локальный порт, на который подключился клиент"server_ip": "%<a", # IP адреса сервера назначения (последний хоп)"server_fqdn": "%<A", # FQDN сервера назначения или имя пира"server_port": "%<p", # Порт сервера назначения"QoS_value": "%>qos", # Значение TOS/DSCP пакета клиента (Quality of Service)"netfilter_mark": "%>nfmark", # Netfilter MARK пакета (если используется интеграция с iptables/nftables)"ssl_bump_mode": "%ssl::bump_mode", # Режим SSL Bump (peek, bump, splice, stare, terminate)"ssl_sni": "%ssl::>sni", # SNI (Server Name Indication) от клиента"ssl_client_subject": "%ssl::>cert_subject", # Subject сертификата клиента (если есть mTLS)"ssl_client_issuer": "%ssl::>cert_issuer", # Issuer сертификата клиента"ssl_server_subject": "%ssl::<cert_subject", # Subject сертификата сервера назначения"ssl_server_issuer": "%ssl::<cert_issuer", # Issuer сертификата сервера назначения"ssl_cert_errors": "%ssl::<cert_errors", # Список ошибок валидации сертификата сервера"ssl_tls_version": "%ssl::>negotiated_version", # Согласованная версия TLS (TLSv1.2, TLSv1.3)"ssl_cipher": "%ssl::>negotiated_cipher", # Согласованный шифр (ECDHE-RSA-AES256-GCM-SHA384)"ssl_client_hello_ver": "%ssl::>received_hello_version", # Версия TLS в ClientHello"ssl_max_supported_ver": "%ssl::>received_supported_version", # Макс. версия TLS, поддерживаемая клиентом"handshake_data": "%>handshake", # Сырые байты рукопожатия (Base64), полезно для детекции протоколов"error_code": "%err_code", # Внутренний код ошибки Squid (если запрос не успешен)"error_detail": "%err_detail", # Детальное описание ошибки (разделено '+')"busy_time_ns": "%busy_time", # Время CPU, затраченное Squid на эту транзакцию (нс, экспериментально)"adapt_total_ms": "%adapt::sum_trs", # Суммарное время работы ICAP/eCAP сервисов (мс)"adapt_times_list": "%adapt::all_trs", # Список времени каждого ICAP/eCAP вызова отдельно"proxy_src_addr": "%{proxy_protocol::>h{:src_addr}", # Реальный IP из заголовка PROXY Protocol (если используется балансировщик)"proxy_dst_addr": "%{proxy_protocol::>h{:dst_addr}", # Реальный IP назначения из PROXY Protocol"note_annotation": "%note", # Пользовательские аннотации (метаданные) от адаптеров или скриптов
# Определение формата логаlogformat squid_json {"datetime":"%tl{%Y-%m-%d} %tl{%H:%M:%S}","client_ip":"%>a","client_port":"%>p","auth_user":"%ul","http_method":"%rm","url":"%ru","http_version":"%rv","http_status":"%>Hs","squid_status":"%Ss","hierarchy":"%Sh","size_response":"%<st","size_request":"%>st","mime_type":"%mt","user_agent":"%{User-Agent}>h","conn_id":"%transport::>connection_id","master_xid":"%master_xaction","server_ip":"%<a","server_fqdn":"%<A","server_port":"%<p","QoS_value":"%>qos","ssl_bump_mode":"%ssl::bump_mode","ssl_sni":"%ssl::>sni","ssl_tls_version":"%ssl::>negotiated_version","ssl_cipher":"%ssl::>negotiated_cipher"}# Записывает каждый запрос, обработанный Squid, в файл access.log# Cтандартный шаблонaccess_log stdio:/opt/squid/var/log/squid/access.log# Дополнительно отправляет каждый запрос, обработанный Squid, в файл access.log# Шаблон JSONaccess_log udp://10.0.0.41:5141 squid_json# Служебные сообщения Squid ошибки, предупреждения, отладочная информацияcache_log stdio:/opt/squid/var/log/squid/cache.log
Если не используется SSL-Bump, то некоторые поля могут быть пустыми или ‘-’
6) Настройка дополнительных фич.
6.1) Настройка кэширования.
|
Уровень |
Где хранится |
Для чего |
Настройка |
|---|---|---|---|
|
RAM-кэш |
Оперативная память |
Быстрый доступ к маленьким/частым объектам |
|
|
Дисковый кэш |
Жёсткий диск/SSD |
Хранение больших объектов (картинки, обновления) |
|
Объект сначала попадает в RAM → если долго не запрашивается — перемещается на диск → если место заканчивается — удаляется
# cache_mem <объём># Использовать до 1 ГБ RAM для кэшаcache_mem 1024 MB# Объекты ≤ cache_mem → хранятся только в RAM# Объекты > cache_mem → сразу идут на диск
# cache_dir <тип> <путь> <размер_МБ> [L1] [L2]# - <L1> — количество каталогов первого уровня (обычно 16) - В старых Unix-файловых системах (ext2, UFS) было жёсткое ограничение: содержание файлов в 1 каталоге# - <L2> — количество каталогов второго уровня (обычно 256) - #### Один кэш на SSD (рекомендуется)# Squid рассматривает все cache_dir как единое пространство хранения# Rock — современный движок для SSD/NVMecache_dir rock /opt/squid/var/cache/rock1 20000 # 20 ГБ
Пример использования в конфиге squid.conf
# ACL для обновленийacl ubuntu dstdomain .archive.ubuntu.comacl security_ubuntu dstdomain security.ubuntu.comacl windows_update dstdomain .windowsupdate.com .update.microsoft.com# Кэшировать ТОЛЬКО эти доменыcache allow ubuntucache allow security_ubuntucache allow windows_updatecache deny all############# ACL для внутренних ресурсовacl intranet dstdomain .dd.local .yourcompany.local# Запретить кэширование внутренних сайтовcache deny intranet# Разрешить кэширование всего остальногоcache allow all############### Кэшировать только картинки и CSS# ACL для статикиacl static_content urlpath_regex -i \.(jpg|jpeg|png|gif|css|js)$# Кэшировать только статикуcache allow static_contentcache deny all############### Разные кэши для разных сетей# Сетиacl office src 10.0.1.0/24acl warehouse src 10.0.2.0/24# Office: кэшировать всёcache allow office# Warehouse: кэшировать только обновленияacl updates dstdomain .windowsupdate.comcache allow warehouse updates# Остальное — не кэшироватьcache deny all
Дополнительные параметры:
### Максимальный размер объекта в кэше# Не кэшировать файлы больше 100 МБmaximum_object_size 100 MB# Минимальный размер (по умолчанию 0)minimum_object_size 0 KB### Время хранения объектов# Обновления ОС — кэшировать дольшеrefresh_pattern -i \.(deb|rpm|msi|exe)$ 10080 90% 43200 override-expire# Обычные страницы — стандартное времяrefresh_pattern . 0 20% 4320
6.2) Настройка ограничения скорости.
Возможно вы захотите использовать группы AD для ограничения скорости, но как говорит официальная инструкция, директива delay_class работает только с acl типа “fast”.
Если вы знаете способ обойти это ограничение, прошу подсказать как… Пробовал так же вариант с добавлением пользовательского header для группы, и после определять в пул по наличию этого заголовка header, но столкнулся с ошибкой (увы, уже не вспомню с каклй именно)
В Squid
delay_parametersуказываются в байтах в секунду, а не в битах.
# Формула: Мбит/с → байты/сек# (Мбит × 1_000_000) ÷ 8 = байты/сек# Примеры:# 10 Мбит/с → (10 × 1_000_000) ÷ 8 = 1_250_000 байт/сек# 50 Мбит/с → (50 × 1_000_000) ÷ 8 = 6_250_000 байт/сек# 100 Мбит/с → (100 × 1_000_000) ÷ 8 = 12_500_000 байт/сек# 1 Гбит/с → (1000 × 1_000_000) ÷ 8 = 125_000_000 байт/сек
Squid проверяет пулы по порядку номеров (сначала 1, потом 2). Первый пул, где запрос получает
allow, применяется. Если получаетdeny— переходит к следующему пулу
# Проверяем Пул 1delay_access 1 deny politics_Squid_InternetAccess_speed-full # Группе ЗАПРЕЩЕН Пул 1delay_access 1 allow all # Остальным РАЗРЕШЁН Пул 1# Проверяем Пул 2 (если не попали в Пул 1)delay_access 2 allow politics_Squid_InternetAccess_speed-full # Группе РАЗРЕШЁН Пул 2# (остальным доступ к Пулу 2 неявно запрещён)
Немного теории про классы delay
Алгоритм “Token Bucket” (ведро с токенами)
Squid использует алгоритм, где “байты” — это “токены”, которые:
-
Накапливаются в “ведре” до размера
макс(burst) -
Тратятся при передаче данных
-
Пополняются со скоростью
восст(байт/сек)
delay_parameters <пул> <aggregate_max/aggregate_restore> <individual_max/individual_restore># aggregate_max - Общий "буст" на всех пользователей (3750000) # aggregate_restore - Общая пропускная способность пула (~30 Мбит/с) (3750000)# individual_max - Макс. "буст" для одного пользователя (640000)# **individual_restore - Скорость для одного пользователя (~5.12 Мбит/с) (640000)
Больше информации по классам delay в оф. документации
delay_class — Class 1
delay_class 1 — одно общее ведро на всех.
delay_pools 1delay_class 1 1 # Пул №1 использует Class 1delay_access 1 allow all # Применить ко всем клиентамdelay_parameters 1 3750000/3750000 # Только общий лимит
-
Все клиенты делят одно ведро.
-
Когда любой пользователь передаёт данные — токены списываются из общего пула.
-
Если ведро пусто — все пользователи ждут, пока оно не пополнится.
-
Нет понятия “мой личный лимит” — только “наш общий лимит”.
delay_class — Class 2
delay_class 2 — двухуровневое ограничение: общий пул + индивидуальные лимиты
Синтаксис для Class 2
delay_class <пул> 2delay_parameters 1 3750000/3750000 640000/640000# Умножаем на 8, чтобы перевести байты в биты.
Правила передачи данных:
-
Когда пользователь запрашивает данные, Squid проверяет оба ведра:
-
Есть ли токены в его индивидуальном ведре?
-
Есть ли токены в общем ведре пула?
-
-
Если хотя бы одно ведро пусто → передача приостанавливается до пополнения.
-
Токены списываются из обоих вёдер одновременно.
# Один пользовательПользователь А качает файл→ Тратит из своего individual (640 КБ/сек) → И из aggregate (3.75 МБ/сек)→ Фактическая скорость: ~5 Мбит/сек (лимит individual)# Пять пользователей одновременноКаждый хочет 5 Мбит/с → сумма 25 Мбит/с→ Aggregate лимит: 30 Мбит/с → все получают ~5 Мбит/сНо если 7 пользователей:→ 7 × 5 = 35 Мбит/с > 30 Мбит/с (aggregate)→ Начинается "дележка": каждый получит ~4.3 Мбит/с# Короткий всплеск (burst)Пользователь начинает загрузку:→ Может мгновенно использовать до 640 КБ из индивидуального "бака"→ И до 3.75 МБ из общего "бака"→ После исчерпания — работает только на скорости восстановления
Если хотите ограничить только по индивидууму
# Общий пул делаем "бесконечным" (очень большое значение)delay_parameters 1 -1/-1 640000/640000# -1 = без лимита (только individual). отключает лимит для соответствующего параметра.
delay_class — Class 3
Class 3 — это самый гибкий и сложный тип. Он объединяет логику Class 1 и Class 2, добавляя третий уровень ограничений, который обычно привязывается к сетевым подсетям (CIDR).
Это идеально подходит для провайдеров или крупных офисов, где нужно ограничивать:
-
Весь канал целиком.
-
Отдельных пользователей внутри канала.
-
Целые отделы/подсети (например, “Бухгалтерия” или “Гостевой Wi-Fi”).
delay_class <пул> 3delay_parameters <пул> <net_max/net_restore> <individual_max/individual_restore> <connection_max/connection_restore>
В вашем случае параметры интерпретируются так:
-
Network (Сеть/Подсеть) — лимит для группы IP-адресов (подсети).
-
Individual (Индивидуальный) — лимит для одного IP/пользователя.
-
Connection (Соединение) — Примечание: В старых версиях Squid третий параметр мог называться иначе, но в современной реализации Class 3 обычно использует структуру:
Network / Individual / ConnectionилиAggregate / Network / Individualв зависимости от версии и патчей. Однако стандартная документация Squid для Class 3 описывает три уровня:
Пример конфигурации:
delay_pools 1delay_class 1 3delay_access 1 allow all# Лимиты:# 1. Для всей подсети (Network): 10 Мбит/с# 2. Для одного пользователя (Individual): 2 Мбит/с# 3. Для одного соединения (Connection): 500 Кбит/сdelay_parameters 1 1250000/1250000 250000/250000 62500/62500
7) Пример простого полного конфигурационного файла.
-
Аутентификация пользователей Kerberos + LDAP
-
Списки запрещенных сайтов
-
Настройки лога, кэша
-
Ограничение скорости (3 пула)
-
SSL-Bump
-
Log format JSON
-
Log отправка на Graylog
################################################################################## Squid обрабатывает правила доступа последовательно сверху вниз ############ Применяется первое найденное правило ##################################################################################visible_hostname testproxy.DOMAIN.RU # имя хоста, которое Squid будет использовать в HTTP-заголовках, страницах ошибок, при логировании (в некоторых форматах лога)httpd_suppress_version_string on # Отключает отображение версии Squid HTTP-заголовках, Страницах ошибокcache_effective_user proxy # От какого пользователя Squid будет работать после запуска############################################################################# SSL-Bump# Прослушиваемый портhttp_port 3128 ssl-bump cert=/opt/squid/etc/ssl/squid_ca.pem generate-host-certificates=on dynamic_cert_mem_cache_size=4MB# Этапы проверки SSLacl step1 at_step SslBump1acl step2 at_step SslBump2acl step3 at_step SslBump3# Политика доменов без SSL-инспекцииacl politics_sites_no-inspection dstdomain "/opt/squid/etc/sites_no-inspection"# Проверяем сертификат сервера на ошибки (истек, самоподписанный, имя не совпадает и т.д.)# Создаем ACL, который истинен, если есть ЛЮБАЯ из перечисленных ошибок# Squid объединяет строки с одинаковым именем acl по ORacl politics_bad_certs ssl_error certHasExpired # Срок действия сертификата истек ERR_CERT_DATE_INVALIDacl politics_bad_certs ssl_error certNotYetValid # Сертификат еще не начал действоватьacl politics_bad_certs ssl_error certUntrusted # Издатель сертификата (Certificate Authority, CA) не доверяется Squid'омacl politics_bad_certs ssl_error certSelfSigned # Сертификат подписан самим же владельцем сайта, а не независимым центромacl politics_bad_certs ssl_error certDomainMismatch # Имя домена, к которому ты обращаешься, не совпадает с именем, указанным в сертификате# Пропускать без SSL-инспекции SNI из спискаssl_bump splice step1 politics_sites_no-inspection# Смотрим SNI и переходим к шагу 2, чтобы получить сертификат сервера.ssl_bump peek step1# Теперь у нас есть сертификат сервера. Проверяем его валидность.# Если сертификат плохой -> рвем соединение.ssl_bump terminate step2 politics_bad_certs# вскрываем (bump) все остальные соединенияssl_bump bump step2# Просто продолжаем работуssl_bump splice step3# Генератор сертификатовsslcrtd_program /opt/squid/libexec/security_file_certgen -s /opt/squid/var/lib/ssl_db -M 4MB############################################################################# ЛОГИ# Интерфейсы сервера # Коды ошибокerror_directory /opt/squid/share/errors/en# Отключить сбор статистики сетевых задержек (файл ...squid/netdb.state)netdb_low 0netdb_high 0# Определение формата логаlogformat squid_json {"datetime":"%tl{%Y-%m-%d} %tl{%H:%M:%S}","client_ip":"%>a","client_port":"%>p","auth_user":"%ul","http_method":"%rm","url":"%ru","http_version":"%rv","http_status":"%>Hs","squid_status":"%Ss","hierarchy":"%Sh","size_response":"%<st","size_request":"%>st","mime_type":"%mt","user_agent":"%{User-Agent}>h","conn_id":"%transport::>connection_id","master_xid":"%master_xaction","server_ip":"%<a","server_fqdn":"%<A","server_port":"%<p","QoS_value":"%>qos","ssl_bump_mode":"%ssl::bump_mode","ssl_sni":"%ssl::>sni","ssl_tls_version":"%ssl::>negotiated_version","ssl_cipher":"%ssl::>negotiated_cipher"}# Записывает каждый запрос, обработанный Squid, в файл access.logaccess_log stdio:/opt/squid/var/log/squid/access.log squid_jsonaccess_log udp://10.0.0.7:5141 squid_json# Служебные сообщения Squid ошибки, предупреждения, отладочная информацияcache_log stdio:/opt/squid/var/log/squid/cache.log############################################################################# КЭШ# максимальный объем памяти для кэширования объектовcache_mem 2048 MB# Определяет место, где Squid будет хранить закэшированные данные# Используется тип кэша rock, который оптимизирован для быстрого доступа# Путь, где будет храниться кэш# размер кэша в 10 ГБ (размер в мегабайтах)cache_dir rock /opt/squid/var/cache/rock1 10000 # 10 ГБ# Отвечает за управление объектами в дисковом кэше# Помогает решать, какие объекты следует удалить из кэша при его заполнении, основываясь на частоте их использованияcache_replacement_policy lfuda# Определяет, как Squid будет управлять заменой объектов в оперативной памяти# Оптимизирует управление памятью, минимизируя фрагментацию и обеспечивая более быстрый доступ к даннымmemory_replacement_policy heap### Ограничения времени для обновления кэша и управления терминами, в течение которых объекты будут считаться "свежими".# Этот шаблон применяет правило к FTP-ресурсам (все URL, начинающиеся с ftp:) # 9 - минимальное время, через которое объект может быть обновлён (в минутах). # 10% - процент изменения, необходимый для повторного обновления кэшированного объекта. # 10 - максимальное время, в течение которого объект может оставаться в кэше (в минутах).refresh_pattern -i ^ftp: 9 10% 10 # 0 - объекты не будут предоставляться из кэша по умолчанию. # 0% - не используется, так как минимальное время равно 0. # 0 - нехранить в кэшеrefresh_pattern -i (/cgi-bin/|\?) 0 0% 0 # Для динамических страниц | уникальный контент для каждого пользователяrefresh_pattern . 0 20% 2160 # все остальное 0 минут / 1.5 дня############################################################################# Ограничения скоростиdelay_pools 1 # Создать 1 пул ограничения скоростиdelay_class 1 2 # Пул №1 использует класс 2delay_access 1 allow all # Применить пул №1 ко всем клиентамdelay_parameters 1 3750000/3750000 640000/640000 # (потому что 3750000 × 8 = 30 000 000 бит)############################################################################# Другое# Заглушка для email, имя пользователя по умолчанию для анонимного доступа к FTP-серверам через Squidftp_user anonymous@################################################################################## Раздел ACL- создание правил доступа############################################################################# пример имени acl # politics_Squid_<NameADGroup>_From_AD# пример имени acl # politics_Squid_<Name>############################################################################# Не кэшировать направления на локальный домен .domain.ruacl politics_no_cache_local dstdomain .domain.rucache deny politics_no_cache_local# Кэшировать картинки и CSSacl politics_static_content urlpath_regex -i \.(jpg|jpeg|png|gif|css|js)$ # кэшировать картинкиcache allow politics_static_contentcache deny all # Остальное не кэшировать############################################################################# auth_param - параметры аутентификации пользователей###### АУТЕНТИФИКАЦИЯ Kerberos# Аутентификация пользователья в AD через Kerberosauth_param negotiate program /opt/squid/libexec/negotiate_kerberos_auth \ -d \ -k /opt/squid/etc/squid.keytab \ -s HTTP/testproxy.domain.ru@DOMAIN.RU###### АУТЕНТИФИКАЦИЯ LDAP. Поиск пользователя в группе AD# politics_ldap_Squid_<NameADGroup> - идентификация группы внутри squid# InternetFullAccess - группа ADexternal_acl_type external_ldap_Squid_InternetFullAccess \ ttl=300 negative_ttl=60 \ %LOGIN /opt/squid/libexec/ext_kerberos_ldap_group_acl \ -g InternetFullAccess \ -D DOMAIN.RU \ -u squid@DOMAIN.RU \ -p passwordUser \ -l ldap://DOMAIN.RUacl politics_Squid_InternetFullAccess_From_AD external external_ldap_Squid_InternetFullAccessexternal_acl_type external_ldap_Squid_InternetAccess \ ttl=300 negative_ttl=60 \ %LOGIN /opt/squid/libexec/ext_kerberos_ldap_group_acl \ -g InternetAccess \ -D DOMAIN.RU \ -u squid@DOMAIN.RU \ -p passwordUser \ -l ldap://DOMAIN.RUacl politics_Squid_InternetAccess_From_AD external external_ldap_Squid_InternetAccess# обязательная аутентификацию для всех пользователей# REQUIRED - это ключевое слово означает: «Пользователь считается частью этого списка только если он успешно предоставил логин и пароль»# Должно идти после инструкций auth_paramacl politics_authenticated proxy_auth REQUIRED################################################################################## ПОРТЫacl politics_Safe_ports port 80 # httpacl politics_politics_Safe_ports port 21 # ftpacl politics_Safe_ports port 443 # httpsacl politics_Safe_ports port 444 # https альтернативныйacl politics_Safe_ports port 70 # gopheracl politics_Safe_ports port 210 # waisacl politics_Safe_ports port 1025-65535 # unregistered portsacl politics_Safe_ports port 280 # http-mgmtacl politics_Safe_ports port 488 # gss-httpacl politics_Safe_ports port 591 # filemakeracl politics_Safe_ports port 777 # multiling httpacl politics_SSL_ports port 443 # httpsacl politics_SSL_ports port 444 # https альтернативный###### МЕТОДЫ подключения# Метод CONNECT используется клиентами для установления туннеля через сервер посредник (чаще всего для HTTPS трафика).acl politics_CONNECT method CONNECT###### ПРОТОКОЛЫ# Протокол ftpacl politics_ftp proto FTP################################################################################## ЧЕРНЫЕ/БЕЛЫЕ СПИСКИ# black список. Запрет сайтов для ВСЕХ и для пользователей без авторизации (без ЛОГИНА и ПАРОЛЯ)acl politics_black_list_ALL_andGuest url_regex -i "/opt/squid/etc/black_list_ALL_andGuest"# white список. Для доступа к сайтам для ВСЕХ и для пользователей без авторизации (без ЛОГИНА и ПАРОЛЯ)acl politics_white_list_ALL_andGuest url_regex -i "/opt/squid/etc/white_list_ALL_andGuest"# black список. Запрет сайтов для группы InternetAccessacl politics_black_list_for_InternetAccess url_regex -i "/opt/squid/etc/black_list_for_InternetAccess"################################################################################## Раздел http_access - Применение правли доступа############################################################################# доступ к служебным страницам мониторинга и управления# acl manager proto cache_object # В Squid 7+ manager уже определён по умолчаниюhttp_access deny manager !localhost # Только для него самого# Запретить небезопасные портыhttp_access deny !politics_Safe_ports# Запретить CONNECT к не-SSL портам#http_access deny CONNECT !politics_SSL_ports# acl politics_black_list_ALL_andGuesthttp_access deny politics_black_list_ALL_andGuest# acl politics_white_list_ALL_andGuest# http_access allow politics_white_list_ALL_andGuest# Запретить доступ пользователям без логина и пароляhttp_access deny !politics_authenticated# Доступ для групп AD - InternetFullAccesshttp_access allow politics_Squid_InternetFullAccess_From_AD# black_list - InternetAccesshttp_access deny politics_Squid_InternetAccess_From_AD politics_black_list_for_InternetAccess# Доступ для групп AD - InternetAccesshttp_access allow politics_Squid_InternetAccess_From_AD# ftphttp_access allow politics_ftp # allow ftp# Разрешить остальное с localhosthttp_access allow localhost# Запретить все остальноеhttp_access deny all
Если статья будет многим интересна, то возможно сделаю архив с примером конфигурации основанной на include (вложенности конфигов) и опубликую через GitHub. Имеется в виду конфигурация позволяющая типизировать изменения параметров Squid на основе разбитого squid.conf на отдельные файлы. Что то подобно структуре изображенной на скриншоте:

ссылка на оригинал статьи https://habr.com/ru/articles/1060658/