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

Проблема

Прокси-сервер это шлюз между локальной сетью и интернетом, который позволяет контролировать трафик, кэшировать часто запрашиваемые ресурсы, ограничивать доступ к нежелательным сайтам и скрывать внутреннюю структуру сети. В небольших и средних организациях часто возникает необходимость развернуть прокси без лишних затрат, но стандартные настройки 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:

sudo apt update
sudo apt install squid

RHEL / CentOS / Rocky Linux:

sudo dnf install squid
sudo systemctl enable --now squid

Подробнее об установке в разных дистрибутивах можно прочитать в ArchWiki Squid  и официальной документации Squid.

Проверяем статус:

sudo systemctl status squid

По умолчанию Squid слушает порт 3128. Основной конфигурационный файл — /etc/squid/squid.conf. Перед изменениями создадим резервную копию:

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):

acl localnet src 192.168.1.0/24

Разрешим доступ из локальной сети:

http_access allow localnet

Запретим доступ всем остальным:

http_access deny all

Настроим порт:

http_port 3128

После изменений проверяем конфигурацию и перезапускаем Squid:

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 порт для прозрачного режима:

http_port 3128 intercept

intercept означает, что Squid будет принимать перенаправленные соединения с межсетевого экрана.

Шаг 2. Настроим перенаправление трафика с помощью iptables:

Предположим, что сетевой интерфейс, смотрящий в локальную сеть,  eth0. Перенаправляем входящий HTTP-трафик на порт 3128:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

Для локальных запросов, генерируемых самой машиной, используются правила в цепи OUTPUT с учётом владельца процесса :

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. Настроим маршрутизацию, если сервер является шлюзом:

sudo sysctl -w net.ipv4.ip_forward=1

Для постоянного включения раскомментируйте net.ipv4.ip_forward=1 в /etc/sysctl.conf.

После этого клиенты без настройки прокси будут автоматически направлять HTTP-запросы через Squid.

4. Ограничение доступа по времени и сайтам

Допустим, нужно разрешить доступ только в рабочее время (9:00–18:00) и запретить доступ к категории «соцсети» (на примере блокировки по доменам).

Создадим ACL для времени (формат описан в официальной документации Squid):

acl worktime time MTWHF 09:00-18:00

Где M — понедельник, T — вторник, W — среда, H — четверг, F — пятница, A — суббота, S — воскресенье .

Создадим ACL для запрещённых доменов (файл /etc/squid/blocked_domains):

facebook.com
vk.com
instagram.com

Загрузим список в ACL:

acl social_networks dstdomain "/etc/squid/blocked_domains"

Применим правила (порядок важен):

http_access deny social_networks
http_access allow localnet worktime
http_access deny !worktime

Правило deny social_networks блокирует доступ к доменам из списка. Затем разрешаем доступ из локальной сети только в рабочее время, а вне рабочего времени запрещаем (правило deny !worktime).

5. Настройка аутентификации (Basic Auth)

Для дополнительного контроля можно требовать логин и пароль. Используем базовую аутентификацию с NCSA-совместимым файлом паролей это стандартный подход, описанный в Squid Wiki .

Создадим файл паролей с помощью утилиты htpasswd (установите apache2-utils):

sudo apt install apache2-utils
sudo htpasswd -c /etc/squid/passwd user1

Добавим новых пользователей без -c:

sudo htpasswd /etc/squid/passwd user2

Настроим Squid для использования аутентификации :

Добавим в squid.conf:

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

Описание helper-программы basic_ncsa_auth доступно в man-странице Debian . Она поддерживает алгоритмы хеширования Blowfish, SHA256, SHA512, MD5 и DES.

auth_users  ACL, требующий аутентификации. Правило http_access allow auth_users следует разместить выше общих разрешений. Если нужна аутентификация только для определённых сетей, можно комбинировать:

http_access allow localnet auth_users

После перезапуска Squid клиенты должны будут вводить логин и пароль.

6. Оптимизация кэша и производительности

Squid по умолчанию использует каталог /var/spool/squid для кэша. Размер кэша задаётся директивой cache_dir. Подробная документация по настройке кэша доступна в Squid Wiki :

cache_dir ufs /var/spool/squid 10000 16 256
  • 10000 — размер в МБ (10 ГБ).
  • 16 — количество подкаталогов первого уровня.
  • 256 — количество подкаталогов второго уровня.

Параметры влияют на производительность; для больших объёмов используйте aufs вместо ufs. После изменения размера кэша необходимо инициализировать каталог :

sudo squid -z

7. Включение доступа к HTTPS через CONNECT

Squid может проксировать HTTPS-трафик, используя метод CONNECT. Для этого не требуется дополнительной настройки, достаточно разрешить метод в ACL. По умолчанию метод CONNECT разрешён только для портов 443 и 563 (SSL). Чтобы разрешить для других портов, используйте ACL port:

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.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Популярные
Новые Старые

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
Menu