Инструкция по настройке 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.gz tar -xzf openssl-3.6.1.tar.gz cd 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 install ldd /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_filter wget https://github.com/squid-cache/squid/releases/download/SQUID_7_5/squid-7.5.tar.gz tar -zxf squid-7.5.tar.gz cd 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 all make install # Проверить завивимости, скорее всего чего то будет не хватать ldd /opt/squid/sbin/squid # Установим необходимую зависимость для работы Squid и AD sudo 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.keytab Type=forking PIDFile=/opt/squid/var/run/squid.pid ExecStartPre=/opt/squid/sbin/squid -z # Инициализация кэша Squid ExecStart=/opt/squid/sbin/squid ExecReload=/opt/squid/sbin/squid -k reconfigure ExecStop=/opt/squid/sbin/squid -k shutdown User=root # Squid запускается от root, для использования socket, потом переходит в режим пользователя указанного в конфигурации. Group=root LimitNOFILE=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 # Генерируем keytab ktpass /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.keytab chmod 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 # Ставим нужные lib sudo apt install -y \ krb5-user \ # если не стало то проверить есть ли зависимость libkrb5-3 - может быть версия зависимости таже что нужна просто "патченная осью OS" libkrb5-dev \ libldap2-dev \ libsasl2-dev \ ldap-utils
Содержимое файла /etc/krb5.conf
[libdefaults] default_realm = DOMAIN.RU # Основной домен AD dns_lookup_realm = false # Не искать realm через DNS dns_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.ru admin_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.RU httpd_suppress_version_string on cache_effective_user proxy http_port 3128 debug_options ALL,1 33,2 28,2 50,2 # подробный лов для debug access_log stdio:/opt/squid/var/log/squid/access.log cache_log stdio:/opt/squid/var/log/squid/cache.log # Аутентификация Kerberos auth_param negotiate program /opt/squid/libexec/negotiate_kerberos_auth -d / -k /opt/squid/etc/squid.keytab / -s HTTP/servername.domain.ru@DOMAIN.RU auth_param negotiate children 20 auth_param negotiate keep_alive on # Доступ всем прошедшим аутентификацию acl auth proxy_auth REQUIRED http_access allow auth
Пример определения группы пользователя на основе LDAP в конфиге squid.conf:
visible_hostname servername.DOMAIN.RU httpd_suppress_version_string on cache_effective_user proxy http_port 3128 access_log stdio:/opt/squid/var/log/squid/access.log cache_log stdio:/opt/squid/var/log/squid/cache.log auth_param negotiate program /opt/squid/libexec/negotiate_kerberos_auth \ -d \ -k /opt/squid/etc/squid.keytab \ -s HTTP/servername.domain.ru@DOMAIN.RU ############################################################################ # АУТЕНТИФИКАЦИЯ LDAP. Поиск пользователя в группе AD external_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_type acl politics_Squid_ADGroup_InternetAccess_From_AD external ldap_Squid_ADGroup_InternetAccess acl politics_authenticated proxy_auth REQUIRED # Запрет для не авторизованных http_access deny !politics_authenticated # Доступ для групп AD - ADGroup_InternetAccess http_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 # ClientHallo acl step2 at_step SslBump2 # ClientHallo + Certificate acl 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 -p chown proxy:proxy /opt/squid/etc/ssl -R chmod 700 /opt/squid/etc/ssl -R cd /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 # Преобразуйте созданный сертификат в формат DER openssl 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 4MB chown 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 # Этапы проверки SSL acl step1 at_step SslBump1 acl step2 at_step SslBump2 acl step3 at_step SslBump3 # Политика доменов без SSL-инспекции acl politics_sites_no-inspection dstdomain "/opt/squid/etc/sites_no-inspection" # Проверяем сертификат сервера на ошибки (истек, самоподписанный, имя не совпадает и т.д.) # Создаем ACL, который истинен, если есть ЛЮБАЯ из перечисленных ошибок # Squid объединяет строки с одинаковым именем acl по OR acl politics_bad_certs ssl_error certHasExpired # Срок действия сертификата истек ERR_CERT_DATE_INVALID acl 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 #help sslcrtd_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 # Шаблон JSON access_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/NVMe cache_dir rock /opt/squid/var/cache/rock1 20000 # 20 ГБ
Пример использования в конфиге squid.conf
# ACL для обновлений acl ubuntu dstdomain .archive.ubuntu.com acl security_ubuntu dstdomain security.ubuntu.com acl windows_update dstdomain .windowsupdate.com .update.microsoft.com # Кэшировать ТОЛЬКО эти домены cache allow ubuntu cache allow security_ubuntu cache allow windows_update cache 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_content cache deny all ############ ### Разные кэши для разных сетей # Сети acl office src 10.0.1.0/24 acl warehouse src 10.0.2.0/24 # Office: кэшировать всё cache allow office # Warehouse: кэшировать только обновления acl updates dstdomain .windowsupdate.com cache 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— переходит к следующему пулу
# Проверяем Пул 1 delay_access 1 deny politics_Squid_InternetAccess_speed-full # Группе ЗАПРЕЩЕН Пул 1 delay_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 1 delay_class 1 1 # Пул №1 использует Class 1 delay_access 1 allow all # Применить ко всем клиентам delay_parameters 1 3750000/3750000 # Только общий лимит
Все клиенты делят одно ведро.
Когда любой пользователь передаёт данные — токены списываются из общего пула.
Если ведро пусто — все пользователи ждут, пока оно не пополнится.
Нет понятия “мой личный лимит” — только “наш общий лимит”.
delay_class - Class 2
delay_class 2 - двухуровневое ограничение: общий пул + индивидуальные лимиты
Синтаксис для Class 2
delay_class <пул> 2 delay_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 <пул> 3 delay_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 1 delay_class 1 3 delay_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 # Этапы проверки SSL acl step1 at_step SslBump1 acl step2 at_step SslBump2 acl step3 at_step SslBump3 # Политика доменов без SSL-инспекции acl politics_sites_no-inspection dstdomain "/opt/squid/etc/sites_no-inspection" # Проверяем сертификат сервера на ошибки (истек, самоподписанный, имя не совпадает и т.д.) # Создаем ACL, который истинен, если есть ЛЮБАЯ из перечисленных ошибок # Squid объединяет строки с одинаковым именем acl по OR acl politics_bad_certs ssl_error certHasExpired # Срок действия сертификата истек ERR_CERT_DATE_INVALID acl 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 0 netdb_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.log access_log stdio:/opt/squid/var/log/squid/access.log squid_json access_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 использует класс 2 delay_access 1 allow all # Применить пул №1 ко всем клиентам delay_parameters 1 3750000/3750000 640000/640000 # (потому что 3750000 × 8 = 30 000 000 бит) ############################################################################ # Другое # Заглушка для email, имя пользователя по умолчанию для анонимного доступа к FTP-серверам через Squid ftp_user anonymous@ ############################################################################ ###### Раздел ACL- создание правил доступа ############################################################################ # пример имени acl # politics_Squid_<NameADGroup>_From_AD # пример имени acl # politics_Squid_<Name> ############################################################################ # Не кэшировать направления на локальный домен .domain.ru acl politics_no_cache_local dstdomain .domain.ru cache deny politics_no_cache_local # Кэшировать картинки и CSS acl politics_static_content urlpath_regex -i \.(jpg|jpeg|png|gif|css|js)$ # кэшировать картинки cache allow politics_static_content cache deny all # Остальное не кэшировать ############################################################################ # auth_param - параметры аутентификации пользователей ###### АУТЕНТИФИКАЦИЯ Kerberos # Аутентификация пользователья в AD через Kerberos auth_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 - группа AD external_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.RU acl politics_Squid_InternetFullAccess_From_AD external external_ldap_Squid_InternetFullAccess external_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.RU acl politics_Squid_InternetAccess_From_AD external external_ldap_Squid_InternetAccess # обязательная аутентификацию для всех пользователей # REQUIRED - это ключевое слово означает: «Пользователь считается частью этого списка только если он успешно предоставил логин и пароль» # Должно идти после инструкций auth_param acl politics_authenticated proxy_auth REQUIRED ############################################################################ ###### ПОРТЫ acl politics_Safe_ports port 80 # http acl politics_politics_Safe_ports port 21 # ftp acl politics_Safe_ports port 443 # https acl politics_Safe_ports port 444 # https альтернативный acl politics_Safe_ports port 70 # gopher acl politics_Safe_ports port 210 # wais acl politics_Safe_ports port 1025-65535 # unregistered ports acl politics_Safe_ports port 280 # http-mgmt acl politics_Safe_ports port 488 # gss-http acl politics_Safe_ports port 591 # filemaker acl politics_Safe_ports port 777 # multiling http acl politics_SSL_ports port 443 # https acl politics_SSL_ports port 444 # https альтернативный ###### МЕТОДЫ подключения # Метод CONNECT используется клиентами для установления туннеля через сервер посредник (чаще всего для HTTPS трафика). acl politics_CONNECT method CONNECT ###### ПРОТОКОЛЫ # Протокол ftp acl 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 список. Запрет сайтов для группы InternetAccess acl 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_andGuest http_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 - InternetFullAccess http_access allow politics_Squid_InternetFullAccess_From_AD # black_list - InternetAccess http_access deny politics_Squid_InternetAccess_From_AD politics_black_list_for_InternetAccess # Доступ для групп AD - InternetAccess http_access allow politics_Squid_InternetAccess_From_AD # ftp http_access allow politics_ftp # allow ftp # Разрешить остальное с localhost http_access allow localhost # Запретить все остальное http_access deny all
Если статья будет многим интересна, то возможно сделаю архив с примером конфигурации основанной на include (вложенности конфигов) и опубликую через GitHub. Имеется в виду конфигурация позволяющая типизировать изменения параметров Squid на основе разбитого squid.conf на отдельные файлы. Что то подобно структуре изображенной на скриншоте:

VovaUzh
бьіло бьі интересно глянуть на такое :-)