Проблема
Прокси сервер это шлюз между локальной сетью и интернетом. Он позволяет контролировать трафик, кэшировать часто запрашиваемые ресурсы, ограничивать доступ к нежелательным сайтам и скрывать внутреннюю структуру сети. В небольших и средних организациях часто возникает необходимость развернуть прокси без лишних затрат, но стандартные настройки Squid могут быть избыточно сложными для понимания. Администратору нужно не просто установить пакет, но и грамотно настроить доступ, аутентификацию, прозрачный режим (без настройки браузеров) и интеграцию с Active Directory при необходимости. В этой статье мы разберём практическую настройку Squid с нуля, акцентируя внимание на гибкости и безопасности.
Решение
Squid это высокопроизводительный прокси сервер с открытым исходным кодом, поддерживающий HTTP, HTTPS и FTP. Полная документация доступна на официальном сайте Squid и в wiki проекта. Основные возможности перечислены ниже.
Кэширование веб контента для ускорения загрузки и экономии трафика. Контроль доступа на основе ACL (Access Control Lists) по IP, времени, доменам, URL, аутентификации. Прозрачный режим (transparent proxy), при котором клиенты не требуют настройки прокси в браузере. Работа с аутентификацией через NCSA, LDAP, NTLM.
В статье мы настроим Squid в режиме прозрачного прокси с ограничением доступа по времени и категориям сайтов, а также добавим базовую аутентификацию для дополнительного контроля. В качестве дистрибутива используем Ubuntu 22.04 LTS, но команды будут аналогичны для Debian, а для RHEL подобных будут указаны отличия.
Пошаговая инструкция
1. Установка Squid
Ubuntu, Debian.
text
sudo apt update
sudo apt install squid
RHEL, CentOS, Rocky Linux.
text
sudo dnf install squid
sudo systemctl enable --now squid
Проверяем статус.
text
sudo systemctl status squid
По умолчанию Squid слушает порт 3128. Основной конфигурационный файл это /etc/squid/squid.conf. Перед изменениями создадим резервную копию.
text
sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.bak
2. Базовая настройка ACL и доступа
Откроем /etc/squid/squid.conf и добавим настройки. В Squid порядок ACL и правил важен. Сначала определяются ACL, затем правила http_access, которые проверяются сверху вниз.
Определим локальную сеть (ACL для подсети 192.168.1.0/24).
text
acl localnet src 192.168.1.0/24
Разрешим доступ из локальной сети.
text
http_access allow localnet
Запретим доступ всем остальным.
text
http_access deny all
Настроим порт.
text
http_port 3128
После изменений проверяем конфигурацию и перезапускаем Squid.
text
sudo squid -k check
sudo systemctl restart squid
Теперь клиенты из сети 192.168.1.0/24 могут использовать прокси, указав в браузере IP сервера и порт 3128.
3. Настройка прозрачного прокси
Прозрачный режим позволяет перенаправлять HTTP трафик (порт 80) на прокси без изменений на клиентах. Для HTTPS (порт 443) прозрачное проксирование сложнее, обычно используется SSL инспекция (SSL Bumping), описанная в документации Squid.
Шаг 1. Добавим в конфигурацию Squid порт для прозрачного режима.
text
http_port 3128 intercept
intercept означает, что Squid будет принимать перенаправленные соединения с межсетевого экрана.
Шаг 2. Настроим перенаправление трафика с помощью iptables. Предположим, что сетевой интерфейс, смотрящий в локальную сеть, это eth0. Перенаправляем входящий HTTP трафик на порт 3128.
text
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
Для локальных запросов, генерируемых самой машиной, используются правила в цепи OUTPUT с учётом владельца процесса.
text
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -m owner --uid-owner proxy -j ACCEPT
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 3128
Для постоянства правил установите пакет iptables-persistent (Ubuntu) или сохраните через netfilter-persistent. В RHEL можно добавить правила в firewalld.
Шаг 3. Настроим маршрутизацию, если сервер является шлюзом.
text
sudo sysctl -w net.ipv4.ip_forward=1
Для постоянного включения раскомментируйте net.ipv4.ip_forward=1 в /etc/sysctl.conf.
После этого клиенты без настройки прокси будут автоматически направлять HTTP запросы через Squid.
4. Ограничение доступа по времени и сайтам
Допустим, нужно разрешить доступ только в рабочее время (9:00–18:00) и запретить доступ к категории «соцсети» (на примере блокировки по доменам).
Создадим ACL для времени.
text
acl worktime time MTWHF 09:00-18:00
M понедельник, T вторник, W среда, H четверг, F пятница, A суббота, S воскресенье.
Создадим ACL для запрещённых доменов. Файл /etc/squid/blocked_domains.
text
facebook.com
vk.com
instagram.com
Загрузим список в ACL.
text
acl social_networks dstdomain "/etc/squid/blocked_domains"
Применим правила. Порядок важен.
text
http_access deny social_networks
http_access allow localnet worktime
http_access deny !worktime
Правило deny social_networks блокирует доступ к доменам из списка. Затем разрешаем доступ из локальной сети только в рабочее время. Вне рабочего времени доступ запрещён (правило deny !worktime).
5. Настройка аутентификации (Basic Auth)
Для дополнительного контроля можно требовать логин и пароль. Используем базовую аутентификацию с NCSA совместимым файлом паролей.
Создадим файл паролей с помощью утилиты htpasswd (установите apache2-utils).
text
sudo apt install apache2-utils
sudo htpasswd -c /etc/squid/passwd user1
Добавим новых пользователей без -c.
text
sudo htpasswd /etc/squid/passwd user2
Настроим Squid для использования аутентификации. Добавим в squid.conf.
text
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm Squid Proxy
auth_param basic credentialsttl 2 hours
acl auth_users proxy_auth REQUIRED
http_access allow auth_users
auth_users это ACL, требующий аутентификации. Правило http_access allow auth_users следует разместить выше общих разрешений. Если нужна аутентификация только для определённых сетей, можно комбинировать.
text
http_access allow localnet auth_users
После перезапуска Squid клиенты должны будут вводить логин и пароль.
6. Оптимизация кэша и производительности
Squid по умолчанию использует каталог /var/spool/squid для кэша. Размер кэша задаётся директивой cache_dir.
text
cache_dir ufs /var/spool/squid 10000 16 256
10000 размер в МБ (10 ГБ). 16 количество подкаталогов первого уровня. 256 количество подкаталогов второго уровня. Параметры влияют на производительность. Для больших объёмов используйте aufs вместо ufs. После изменения размера кэша необходимо инициализировать каталог.
text
sudo squid -z
7. Включение доступа к HTTPS через CONNECT
Squid может проксировать HTTPS трафик, используя метод CONNECT. Для этого не требуется дополнительной настройки, достаточно разрешить метод в ACL. По умолчанию метод CONNECT разрешён только для портов 443 и 563 (SSL). Чтобы разрешить для других портов, используйте ACL port.
text
acl SSL_ports port 443 8443
http_access allow CONNECT SSL_ports
Для полной фильтрации HTTPS сайтов (по URL) требуется SSL инспекция (SSL Bumping), описанная в документации Squid.
8. Настройка логов
Логи Squid находятся в /var/log/squid/access.log. Формат логов настраивается директивой logformat, информация доступна в официальной документации. Для анализа можно использовать sarg или calamaris.
Устранение распространённых проблем
ПроблемаВероятная причинаРешениеTCP_DENIED/403 в логахACL запрещает доступ, нет правил http_access allowПроверить порядок правил. Разрешающие должны идти до запрещающих. Убедиться, что ACL localnet определён и содержит нужную подсеть.Ошибка (13) Permission denied при запускеSquid не может записать кэш или pid файлПроверить права на /var/spool/squid и /var/run/squid. Владелец должен быть proxy:proxy (или squid:squid в RHEL).В прозрачном режиме браузер не открывает сайтыНеправильное перенаправление iptables, или Squid не слушает interceptПроверить правило iptables: iptables -t nat -L. Убедиться, что http_port указан с опцией intercept.Клиенты не могут пройти аутентификациюНе установлена программа аутентификации, неправильный путьПроверить путь к basic_ncsa_auth (в Ubuntu: /usr/lib/squid/basic_ncsa_auth). Убедиться, что файл паролей существует и права доступа позволяют читать Squid.Медленная работа при большом количестве клиентовНедостаточно памяти под кэш, маленькое число дочерних процессовУвеличить cache_mem (до 1/3 оперативной памяти), увеличить cache_dir, поднять maximum_object_size_in_memory и maximum_object_size.Ошибка при запуске после добавления cache_dirНе инициализирована структура каталогов кэшаВыполнить squid -z для создания каталогов кэша.
Мы настроили прокси сервер Squid в Linux, реализовав прозрачный режим, ограничения по времени и доменам, базовую аутентификацию. Полученная конфигурация позволяет эффективно управлять интернет трафиком в офисе, экономить канал с помощью кэширования и обеспечивать дополнительную безопасность. Настройка прокси сервера Linux с использованием Squid это проверенное решение, которое легко масштабируется и интегрируется с существующей инфраструктурой. При необходимости можно расширить функционал инспекцией HTTPS, интеграцией с антивирусом и детальной отчётностью. Детальную информацию по всем директивам можно найти в официальной документации Squid.