Кэширующий прокси Squid [208.3]

Рейтинг: 59.6% · 10 голосов
Курс LPIC-2 (201-450 и 202-450): емкостное планирование, ядро, хранилище и RAID/LVM, продвинутая сеть, DNS/BIND, Apache/Nginx, Samba/NFS, DHCP/LDAP, почта, безопасность и VPN.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Кэширующий прокси Squid [208.3]

Сообщение Sergey_Sysadmin »

Оглавление курса (41)
  1. Введение в LPIC-2 и уровень инженера
  2. Измерение и устранение проблем с ресурсами [200.1]
  3. Прогнозирование потребности в ресурсах
  4. Компоненты ядра Linux [201.1]
  5. Сборка ядра из исходников [201.2]
  6. Управление модулями ядра в рантайме [201.3]
  7. Кастомизация запуска системы [202.1]
  8. Восстановление системы [202.2]
  9. Альтернативные загрузчики [202.3]
  10. Работа с файловой системой Linux [203.1]
  11. Обслуживание файловых систем [203.2]
  12. Создание и настройка опций ФС [203.3]
  13. Программный RAID [204.1]
  14. Тюнинг доступа к устройствам хранения [204.2]
  15. Менеджер логических томов LVM [204.3]
  16. Базовая конфигурация сети [205.1]
  17. Продвинутая конфигурация сети [205.2]
  18. Диагностика сетевых проблем [205.3]
  19. Сборка и установка программ из исходников [206.1]
  20. Резервное копирование [206.2]
  21. Оповещение пользователей о событиях
  22. DNS-сервер BIND: базовая настройка [207.1]
  23. Зоны DNS: создание и сопровождение [207.2]
  24. Безопасность DNS-сервера [207.3]
  25. Веб-сервер Apache: базовая настройка [208.1]
  26. Apache и HTTPS [208.2]
  27. Кэширующий прокси Squid [208.3] (вы здесь)
  28. Веб-сервер и обратный прокси Nginx [208.4]
  29. Файловый сервер Samba [209.1]
  30. Файловый сервер NFS [209.2]
  31. DHCP-сервер [210.1]
  32. Аутентификация PAM и SSSD [210.2]
  33. Использование LDAP-клиента
  34. Сервер OpenLDAP [210.4]
  35. Почтовый сервер Postfix [211.1]
  36. Управление доставкой почты и Sieve [211.2]
  37. Доступ к почтовым ящикам: Dovecot [211.3]
  38. Linux как маршрутизатор и фильтр [212.1]
  39. FTP-серверы [212.2]
  40. SSH углублённо [212.3]
  41. Безопасность, IDS и VPN [212.4 + 212.5]
Урок 26. Кэширующий прокси Squid [208.3]

Задача администратора в этом уроке - поставить между клиентами и внешним вебом промежуточное звено, которое решает кто и куда ходит, кэширует то, что можно переиспользовать, и оставляет лог для разбора инцидентов. Squid - это classic forward-прокси: запросы идут от клиентов наружу через него. Разберём squid.conf, списки доступа ACL и правила http_access, кэш, аутентификацию, прозрачный режим, логи и диагностику. И честно поговорим, где Squid в 2026 ещё уместен, а где его вытеснили.

Изображение

Как это работает

Forward-прокси - это посредник для исходящего трафика. Клиент явно знает адрес прокси (например 192.168.1.10:3128) и отправляет ему HTTP-запрос целиком, включая строку GET с полным URL. Squid сам резолвит имя, открывает соединение к серверу назначения, тянет ответ, при необходимости кладёт копию в кэш и отдаёт клиенту. Это противоположность reverse-прокси (nginx перед бэкендом), где посредник работает от имени сервера, а не клиента.

Кэш экономит трафик и ускоряет повторные обращения. Squid опирается на HTTP-заголовки кэширования: Cache-Control, Expires, ETag, Last-Modified. Если объект свежий (не истёк), Squid отдаёт его из кэша без обращения наружу - это HIT. Если объект устарел, Squid делает условный запрос (If-None-Match / If-Modified-Since) и при ответе 304 освежает копию. Если объекта нет или он запрещён к кэшированию - MISS, идём в сеть. Кэш бывает в памяти (cache_mem) и на диске (cache_dir).

Контроль доступа - это сердце конфига. Сначала вы описываете ACL - именованные множества (диапазоны IP, порты, домены, методы, регулярки на URL, время суток). Сами по себе ACL ничего не разрешают и не запрещают, это просто метки. Решения принимают директивы http_access allow и http_access deny, которые проверяются СВЕРХУ ВНИЗ и срабатывают на первом совпадении. Правила ниже сработавшего уже не смотрятся. Важнейшее следствие: порядок строк определяет логику, а в самом конце всегда стоит неявный deny all противоположный последнему явному правилу.

Прозрачный (intercept) режим - это когда клиент НЕ настроен на прокси, а трафик заворачивается на Squid фаерволом (в 2026 это nftables, исторически iptables через REDIRECT/TPROXY). Squid слушает порт со специальным флагом intercept и достаёт адрес назначения из перехваченного соединения. Минус режима известен: для HTTPS он честно работать не может без подмены сертификата, потому что клиент думает что говорит напрямую с сайтом, а внутри TLS никакого заголовка Host для прокси нет.

Команды и примеры

Установка. В Debian 13 / Ubuntu 24.04 пакет и конфиг в /etc/squid/, в RHEL 10 / Fedora 41+ аналогично, но управление через dnf:

Код: Выделить всё

# Debian / Ubuntu
apt install squid
systemctl enable --now squid

# RHEL / Fedora
dnf install squid
systemctl enable --now squid
Главный файл - /etc/squid/squid.conf. Минимальный осмысленный конфиг с ACL и доступом:

Код: Выделить всё

# порт прокси
http_port 3128

# ACL - это просто именованные множества
acl localnet src 192.168.1.0/24
acl SSL_ports port 443
acl Safe_ports port 80 21 443 70 210 1025-65535
acl CONNECT method CONNECT

# запрещаем CONNECT куда угодно кроме 443
http_access deny CONNECT !SSL_ports
http_access deny !Safe_ports

# доступ к менеджеру только локально
acl localhost src 127.0.0.1/32
http_access allow localhost manager
http_access deny manager

# разрешаем своей сети, остальным запрет
http_access allow localnet
http_access deny all
Кэш на диске и в памяти. Тип ufs/aufs - классика, rock - для мелких объектов:

Код: Выделить всё

cache_mem 512 MB
maximum_object_size_in_memory 1 MB

# каталог 10 ГБ, 16 каталогов 1-го и 256 2-го уровня
cache_dir aufs /var/spool/squid 10000 16 256
maximum_object_size 256 MB
После задания cache_dir структуру нужно создать ОДИН раз при остановленном демоне, иначе кэш не работает:

Код: Выделить всё

systemctl stop squid
squid -z          # инициализация swap-каталогов
systemctl start squid
Проверка и перечитывание конфига без перезапуска (kill -HUP под капотом):

Код: Выделить всё

squid -k parse      # проверить синтаксис, ничего не запуская
squid -k reconfigure
Аутентификация на прокси через basic-хелпер с файлом паролей. Создаём базу и подключаем хелпер:

Код: Выделить всё

# Debian: htpasswd из apache2-utils, RHEL: из httpd-tools
htpasswd -c /etc/squid/passwd ivan

Код: Выделить всё

auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic realm Proxy CyberLake
acl authenticated proxy_auth REQUIRED
http_access allow authenticated
http_access deny all
Прозрачный режим. Отдельный порт с флагом intercept плюs правило nftables (показываю и nft, и легаси-iptables):

Код: Выделить всё

http_port 3129 intercept

Код: Выделить всё

# nftables (актуально 2026)
nft add rule ip nat prerouting ip saddr 192.168.1.0/24 tcp dport 80 redirect to :3129

# iptables (наследие, для экзамена)
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3129
Логи и диагностика. Два ключевых файла - access.log (каждый запрос) и cache.log (состояние демона и ошибки):

Код: Выделить всё

tail -f /var/log/squid/access.log
# поля: время длит. клиент HIT/MISS статус байты метод URL ...

# живая статистика через cache manager
squidclient -h 127.0.0.1 mgr:info
squidclient mgr:5min
В строке access.log самое полезное - код результата: TCP_HIT (из кэша), TCP_MISS (ходили в сеть), TCP_REFRESH_UNMODIFIED (освежили, 304), TCP_DENIED (зарезан правилом). По ним сразу видно эффективность кэша и сработавшие запреты.

Частые грабли
  • Порядок http_access. Если allow localnet стоит выше deny на запрещённый домен - запрет не сработает, потому что решение принято на первом совпадении.
  • Забыли deny all в конце. Неявное правило инвертирует последнее явное, и поведение становится неочевидным. Всегда ставьте явный http_access deny all последней строкой.
  • Не сделали squid -z. Демон стартует, но кэш на диск не пишется, всё мимо. Сначала остановить службу, потом инициализировать.
  • SELinux на RHEL/Fedora блокирует нестандартный cache_dir или порт. Симптом - permission denied в cache.log при правильных правах. Чините через semanage port -a и контексты, не отключением SELinux.
  • Ждать кэширования HTTPS в прозрачном режиме без SSL-bump. Внутри TLS прокси ничего не видит, объекты не кэшируются, только CONNECT-туннель.
  • Правка squid.conf без squid -k parse. Опечатка валит демон при reconfigure, и вы узнаёте об этом, когда сеть уже встала.
  • Думать что Squid сам себя обновит при reload. После смены cache_dir или auth_param чаще нужен полный restart, reconfigure не всё подхватывает.
Мини-лаба
  • Поставьте squid, запустите squid -k parse - убедитесь что дефолтный конфиг валиден.
  • Опишите acl localnet на свою подсеть, разрешите её, в конце поставьте deny all. Перечитайте конфиг через squid -k reconfigure.
  • На клиенте пропишите прокси и откройте дважды одну статичную страницу. В access.log найдите TCP_MISS и затем TCP_HIT.
  • Добавьте acl badsite dstdomain .example.com и http_access deny badsite ВЫШЕ allow localnet. Проверьте TCP_DENIED в логе.
  • Включите basic-аутентификацию, заведите пользователя htpasswd, убедитесь что без логина прокси отдаёт 407.
  • Через squidclient mgr:info посмотрите Request Hit Ratio и число клиентов.
Контрольные вопросы
  • В каком порядке Squid проверяет правила http_access и что происходит при первом совпадении?
  • Чем отличается определение ACL от директивы http_access и может ли ACL сам по себе что-то разрешить?
  • Зачем нужна команда squid -z и почему её делают при остановленном демоне?
  • Почему прозрачный режим не кэширует HTTPS без SSL-bump и в чём тут принципиальная проблема?
  • Какой код в access.log говорит, что объект отдан из кэша, а какой - что запрос зарезан правилом доступа?
  • Чем basic_ncsa_auth отличается по безопасности от digest или внешнего LDAP-хелпера и где это критично?
👍4 ❤️ 🔥1 😄 🤔
Аватара пользователя
lazysegfault
Сообщения: 1
Зарегистрирован: 30 май 2026, 20:08

Re: Кэширующий прокси Squid [208.3]

Сообщение lazysegfault »

А если у меня клиенты ходят почти только по https, смысл от кэша Squid вообще остаётся или это уже мёртвая затея без ssl-bump?
👍1 ❤️1 🔥 😄 🤔
Аватара пользователя
egor777
Сообщения: 1
Зарегистрирован: 28 май 2026, 06:35

Re: Кэширующий прокси Squid [208.3]

Сообщение egor777 »

Поймал TCP_DENIED на нужном сайте - оказалось allow localnet стоял выше моего deny. Переставил строки местами и заработало, спасибо за акцент на порядке.
👍 ❤️ 🔥2 😄 🤔
Ответить
← Предыдущая глава
Apache и HTTPS [208.2]
Следующая глава →
Веб-сервер и обратный прокси Nginx [208.4]

Все главы курса «LPIC-2: инженер Linux (201 + 202)»

Поделиться темой: ✈ Telegram VK
  • Похожие темы

Вернуться в «LPIC-2: инженер Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость