Squid как корпоративный прокси-сервер: фильтрация и контроль для 400 сотрудников «КорпСервис»

Ситуация: 400 сотрудников, нулевой контроль интернет-трафика

Компания «КорпСервис» (400 сотрудников, 3 офиса) обратилась к нам в itfresh.ru с набором проблем: каналы интернета перегружены, сотрудники смотрят YouTube в рабочее время, нет логирования посещений (а это требование ИБ), и нет возможности блокировать вредоносные сайты.

Исходная инфраструктура:

  • Active Directory — Windows Server 2022, 400 учётных записей
  • Интернет — 2 канала по 100 Мбит/с (основной и резервный)
  • Сеть — VLAN для отделов: бухгалтерия, разработка, продажи, руководство
  • Контроль — отсутствует, все ходят в интернет напрямую

Требования заказчика:

  1. Фильтрация — блокировка категорий (соцсети, видеохостинги, файлообменники) для определённых отделов
  2. Аутентификация — привязка к AD, чтобы видеть, кто именно ходит на какие сайты
  3. HTTPS-инспекция — видеть URL даже для HTTPS-сайтов (а не только домен)
  4. Логирование — полный журнал с возможностью генерации отчётов
  5. Лимиты — ограничение полосы для скачивания больших файлов
  6. Прозрачность — минимальное влияние на работу пользователей

Установка и базовая конфигурация Squid

Squid — проверенный proxy-сервер, работающий на Linux/FreeBSD. Мы установили его на Rocky Linux 9 с поддержкой SSL Bump (компиляция из исходников, т.к. пакетная версия идёт без --enable-ssl-crtd):

# Установка зависимостей
sudo dnf install -y gcc gcc-c++ make openssl-devel libxml2-devel \
  libcap-devel libtool-ltdl-devel perl-Digest-MD5 \
  openldap-devel cyrus-sasl-devel

# Компиляция Squid 6.x с SSL и LDAP
wget http://www.squid-cache.org/Versions/v6/squid-6.8.tar.gz
tar xzf squid-6.8.tar.gz && cd squid-6.8

./configure --prefix=/usr/local/squid \
  --enable-ssl-crtd \
  --with-openssl \
  --enable-auth-basic="LDAP" \
  --enable-auth-negotiate="kerberos" \
  --enable-icap-client \
  --enable-delay-pools \
  --enable-linux-netfilter \
  --with-large-files

make -j$(nproc) && sudo make install

# Создание пользователя и каталогов
sudo useradd -r -s /sbin/nologin squid
sudo mkdir -p /var/log/squid /var/spool/squid /usr/local/squid/var/cache
sudo chown -R squid:squid /var/log/squid /var/spool/squid /usr/local/squid/var

# Инициализация кэша
sudo /usr/local/squid/sbin/squid -z -N

# Systemd unit
sudo cat > /etc/systemd/system/squid.service << 'EOF'
[Unit]
Description=Squid Proxy Server
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/squid/var/run/squid.pid
ExecStartPre=/usr/local/squid/sbin/squid -k parse
ExecStart=/usr/local/squid/sbin/squid
ExecReload=/usr/local/squid/sbin/squid -k reconfigure
ExecStop=/usr/local/squid/sbin/squid -k shutdown
Restart=on-failure
User=root

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable squid

ACL: контроль доступа по отделам, URL и времени

ACL (Access Control Lists) — сердце Squid. Мы создали многоуровневую систему правил, учитывающую отдел сотрудника, категорию сайта и время суток.

# /usr/local/squid/etc/squid.conf — секция ACL

# === Сети отделов ===
acl network_accounting src 10.10.10.0/24    # Бухгалтерия
acl network_dev       src 10.10.20.0/24    # Разработка
acl network_sales     src 10.10.30.0/24    # Продажи
acl network_mgmt      src 10.10.40.0/24    # Руководство
acl network_all       src 10.10.0.0/16     # Все внутренние сети

# === Категории сайтов (файлы со списками доменов) ===
acl blocked_social     url_regex -i "/usr/local/squid/etc/acl/social.txt"
acl blocked_video      url_regex -i "/usr/local/squid/etc/acl/video.txt"
acl blocked_gambling   url_regex -i "/usr/local/squid/etc/acl/gambling.txt"
acl blocked_malware    url_regex -i "/usr/local/squid/etc/acl/malware.txt"
acl allowed_whitelist  dstdomain "/usr/local/squid/etc/acl/whitelist.txt"

# === Временные ACL ===
acl work_hours time MTWHF 09:00-18:00
acl lunch_time time MTWHF 12:00-13:00

# === Типы файлов для ограничения скачивания ===
acl large_downloads url_regex -i \.(exe|msi|iso|zip|rar|7z|tar\.gz|mp4|mkv|avi)$

# === Правила доступа ===
# Руководство — без ограничений
http_access allow network_mgmt

# Вредоносные сайты — блокировать для всех
http_access deny blocked_malware

# Белый список — всегда разрешён
http_access allow allowed_whitelist

# Разработка — блокировать соцсети в рабочее время, кроме обеда
http_access allow network_dev blocked_social lunch_time
http_access deny  network_dev blocked_social work_hours

# Бухгалтерия — блокировать соцсети и видео всегда
http_access deny network_accounting blocked_social
http_access deny network_accounting blocked_video

# Продажи — блокировать видео в рабочее время
http_access deny network_sales blocked_video work_hours

# Разрешить всё остальное для внутренних сетей
http_access allow network_all

# Запретить всё остальное
http_access deny all

Файлы списков:

# /usr/local/squid/etc/acl/social.txt
\.vk\.com
\.ok\.ru
\.facebook\.com
\.instagram\.com
\.tiktok\.com
\.twitter\.com
\.x\.com

# /usr/local/squid/etc/acl/video.txt
\.youtube\.com
\.youtu\.be
\.rutube\.ru
\.vimeo\.com
\.twitch\.tv
\.dzen\.ru/video

# /usr/local/squid/etc/acl/whitelist.txt
.gosuslugi.ru
.nalog.ru
.cbr.ru
.consultant.ru
.garant.ru
.1c.ru

Аутентификация через LDAP и Active Directory

Для персонализированных правил и логирования с именами пользователей нужна аутентификация. Squid поддерживает LDAP/AD аутентификацию через basic_ldap_auth хелпер.

# /usr/local/squid/etc/squid.conf — LDAP аутентификация

# Basic LDAP auth (проверка логин/пароль)
auth_param basic program /usr/local/squid/libexec/basic_ldap_auth \
  -R -b "dc=corp,dc=local" \
  -D "cn=squid-bind,ou=Service Accounts,dc=corp,dc=local" \
  -W /usr/local/squid/etc/ldap_password \
  -f "sAMAccountName=%s" \
  -h 10.10.1.5

auth_param basic children 10 startup=3 idle=5
auth_param basic realm KorpServis Proxy
auth_param basic credentialsttl 2 hours

# ACL для аутентифицированных пользователей
acl authenticated proxy_auth REQUIRED

# Группы AD через LDAP
external_acl_type ldap_group %LOGIN /usr/local/squid/libexec/ext_ldap_group_acl \
  -R -b "dc=corp,dc=local" \
  -D "cn=squid-bind,ou=Service Accounts,dc=corp,dc=local" \
  -W /usr/local/squid/etc/ldap_password \
  -f "(&(objectclass=person)(sAMAccountName=%v)(memberOf=cn=%a,ou=Groups,dc=corp,dc=local))" \
  -h 10.10.1.5

acl group_admins    external ldap_group IT-Admins
acl group_dev       external ldap_group Developers
acl group_finance   external ldap_group Finance
acl group_sales     external ldap_group Sales
acl group_directors external ldap_group Directors

# Правила на основе AD-групп (имеют приоритет над IP-правилами)
http_access allow group_directors
http_access allow group_admins
http_access deny  group_finance blocked_social
http_access deny  group_finance blocked_video
http_access deny  group_sales blocked_video work_hours
http_access allow authenticated

Преимущество AD-групп перед IP-подсетями: сотрудник может работать из любой сети (VPN, Wi-Fi, другой офис) — правила привязаны к учётной записи, а не к IP.

# Создание служебной учётной записи в AD (PowerShell на DC)
New-ADUser -Name "squid-bind" \
  -SamAccountName "squid-bind" \
  -UserPrincipalName "squid-bind@corp.local" \
  -Path "OU=Service Accounts,DC=corp,DC=local" \
  -AccountPassword (ConvertTo-SecureString "P@ssw0rd!Squid" -AsPlainText -Force) \
  -Enabled $true \
  -PasswordNeverExpires $true \
  -CannotChangePassword $true

SSL Bump: HTTPS-инспекция

Без SSL Bump Squid видит только домен (например, youtube.com), но не полный URL. С SSL Bump можно видеть и фильтровать конкретные страницы даже для HTTPS.

Важно: SSL Bump — это man-in-the-middle. Требуется установка корневого сертификата на все клиентские машины. Перед внедрением необходимо согласование с юридическим отделом и уведомление сотрудников.

# Генерация корневого CA для SSL Bump
sudo mkdir -p /usr/local/squid/etc/ssl
cd /usr/local/squid/etc/ssl

# Генерация CA ключа и сертификата (10 лет)
sudo openssl req -new -newkey rsa:4096 -sha256 -days 3650 -nodes \
  -x509 -keyout squid-ca.pem -out squid-ca.pem \
  -subj "/C=RU/ST=Moscow/O=KorpServis/CN=KorpServis Proxy CA"

# Конвертация в DER для распространения на Windows-клиенты
sudo openssl x509 -in squid-ca.pem -outform DER -out squid-ca.der

# Инициализация SSL certificate database
sudo /usr/local/squid/libexec/security_file_certgen -c -s \
  /usr/local/squid/var/ssl_db -M 64MB
sudo chown -R squid:squid /usr/local/squid/var/ssl_db
# squid.conf — SSL Bump конфигурация

# HTTPS порт с SSL Bump
http_port 3128 ssl-bump \
  cert=/usr/local/squid/etc/ssl/squid-ca.pem \
  generate-host-certificates=on \
  dynamic_cert_mem_cache_size=16MB

sslcrtd_program /usr/local/squid/libexec/security_file_certgen \
  -s /usr/local/squid/var/ssl_db -M 64MB
sslcrtd_children 8 startup=2 idle=2

# ACL для SSL Bump
acl step1 at_step SslBump1
acl step2 at_step SslBump2
acl step3 at_step SslBump3

# Не перехватываем банки и финансовые сайты (конфиденциальность)
acl no_bump_domains ssl::server_name "/usr/local/squid/etc/acl/nobump.txt"

# Логика SSL Bump:
# 1. peek — посмотреть SNI (имя домена) в ClientHello
# 2. splice — пропустить без перехвата (для банков)
# 3. bump — перехватить и подменить сертификат (для остальных)
ssl_bump peek step1 all
ssl_bump splice no_bump_domains
ssl_bump bump all
# /usr/local/squid/etc/acl/nobump.txt — сайты без перехвата HTTPS
.sberbank.ru
.tinkoff.ru
.vtb.ru
.alfabank.ru
.nalog.ru
.gosuslugi.ru
.mos.ru
.cbr.ru

Распространение CA-сертификата через GPO (Group Policy) в AD:

# На контроллере домена:
# 1. Скопировать squid-ca.der в сетевую папку
# 2. Group Policy Management → Default Domain Policy → Edit
# 3. Computer Configuration → Policies → Windows Settings
#    → Security Settings → Public Key Policies
#    → Trusted Root Certification Authorities
# 4. Import → squid-ca.der
# 5. gpupdate /force на клиентах или дождаться автоприменения

WPAD, delay pools и transparent proxy

WPAD (Web Proxy Auto-Discovery) — автоматическая настройка прокси на клиентах. Вместо ручной настройки на каждом компьютере — один файл wpad.dat:

# /var/www/html/wpad.dat (раздаётся через HTTP)
function FindProxyForURL(url, host) {
    // Внутренние ресурсы — напрямую
    if (isInNet(host, "10.0.0.0", "255.0.0.0") ||
        isInNet(host, "192.168.0.0", "255.255.0.0") ||
        host == "localhost") {
        return "DIRECT";
    }

    // Всё остальное — через прокси
    return "PROXY proxy.corp.local:3128; DIRECT";
}

# DNS-запись для WPAD (автообнаружение)
# В DNS-сервере AD:
wpad.corp.local.  IN  A  10.10.1.20

# DHCP-опция 252 (WPAD URL):
# option 252 = "http://wpad.corp.local/wpad.dat"

Delay pools — ограничение полосы пропускания для определённых типов трафика:

# squid.conf — delay pools

# Pool 1: ограничение скачивания больших файлов до 1 Мбит/с на пользователя
delay_pools 2

# Pool 1: класс 3 (ограничение по сети + по пользователю)
delay_class 1 3
# Общий лимит: 50 Мбит/с, на подсеть: 10 Мбит/с, на пользователя: 1 Мбит/с
delay_parameters 1 6250000/6250000 1250000/1250000 125000/250000
delay_access 1 allow large_downloads network_all
delay_access 1 deny all

# Pool 2: видео-стриминг (если не заблокировано) — 512 Кбит/с на пользователя
delay_class 2 2
delay_parameters 2 3125000/3125000 64000/128000
acl streaming_sites url_regex -i \.(youtube|rutube|vimeo)\.com
delay_access 2 allow streaming_sites network_all
delay_access 2 deny all

Transparent proxy — перехват трафика без настройки на клиентах. Настраивается через iptables на шлюзе:

# На шлюзе (или Squid-сервере, если он является шлюзом):

# Перенаправление HTTP (порт 80) на Squid
iptables -t nat -A PREROUTING -i eth1 -s 10.10.0.0/16 \
  -p tcp --dport 80 -j REDIRECT --to-port 3129

# Перенаправление HTTPS (порт 443) на Squid SSL Bump порт
iptables -t nat -A PREROUTING -i eth1 -s 10.10.0.0/16 \
  -p tcp --dport 443 -j REDIRECT --to-port 3130

# squid.conf — дополнительные порты для transparent mode
http_port 3129 intercept
https_port 3130 intercept ssl-bump \
  cert=/usr/local/squid/etc/ssl/squid-ca.pem \
  generate-host-certificates=on \
  dynamic_cert_mem_cache_size=16MB

Мы выбрали WPAD вместо transparent proxy, потому что transparent mode не поддерживает аутентификацию (нельзя определить имя пользователя).

Логирование и отчётность: SARG и LightSquid

Логирование — обязательное требование ИБ. Squid пишет детальные логи, а SARG или LightSquid генерируют человекочитаемые отчёты.

# squid.conf — настройка логирования

# Формат лога с именем пользователя
logformat combined %>a %[un %tl "%rm %ru HTTP/%rv" %>Hs %h" "%{User-Agent}>h" %Ss:%Sh

access_log /var/log/squid/access.log combined
cache_log /var/log/squid/cache.log

# Ротация логов (хранить 90 дней)
logfile_rotate 90

SARG — генератор HTML-отчётов из access.log:

# Установка SARG
sudo dnf install -y sarg

# /etc/sarg/sarg.conf
access_log /var/log/squid/access.log
output_dir /var/www/html/squid-reports
date_format e
overwrite_report yes
resolve_ip no
user_ip no
topuser_sort_field BYTES reverse
exclude_hosts /etc/sarg/exclude_hosts
charset UTF-8

# Ежедневная генерация отчётов (cron)
# /etc/cron.daily/sarg-daily
#!/bin/bash
/usr/bin/sarg -d "$(date -d 'yesterday' '+%d/%m/%Y')"

LightSquid — альтернатива SARG, легче и быстрее:

# Установка LightSquid
wget https://github.com/nickolay-sys/lightsquid/archive/refs/heads/master.zip
unzip master.zip && cd lightsquid-master
sudo cp -r * /var/www/html/lightsquid/

# Настройка
sudo vim /var/www/html/lightsquid/lightsquid.cfg
# $logpath = "/var/log/squid";
# $reportpath = "/var/www/html/lightsquid/report";
# $lang = "ru";

# Генерация отчёта
sudo /var/www/html/lightsquid/lightparser.pl

# Cron для ежедневной генерации
echo '30 0 * * * root /var/www/html/lightsquid/lightparser.pl' >> /etc/crontab

Отчёты показывают: топ сайтов, топ пользователей, объём трафика по отделам, блокированные запросы. Доступ к отчётам — через внутренний веб-сервер с аутентификацией (только для ИТ-отдела и руководства).

Результаты и выводы

Через месяц после внедрения Squid для «КорпСервис»:

МетрикаДоПосле
Утилизация интернет-канала95% (постоянная перегрузка)45% (с кэшированием)
Время загрузки повторных ресурсовКак первое обращениеВ 3-5 раз быстрее (кэш)
Блокированных вредоносных URL/день0~150
Видимость трафика для ИБНет100% (логи + отчёты)
Жалобы на медленный интернет5-10/день1-2/неделя
Время развёртки для нового офисаРучная настройкаWPAD — автоматически

Squid — зрелое и проверенное решение для корпоративного проксирования. Для 400 пользователей его производительности хватает с запасом (сервер 4 CPU, 8 GB RAM). Основные альтернативы: pfSense/OPNsense (если нужен полноценный firewall), Kerio Control (коммерческий, проще в управлении), FortiGate (hardware, дороже). Squid выигрывает гибкостью ACL и нулевой стоимостью лицензий. Если вам нужна настройка корпоративного прокси — обращайтесь к нам в itfresh.ru.

Часто задаваемые вопросы

В России работодатель имеет право контролировать использование рабочего оборудования и корпоративной сети (ТК РФ, ст. 22). Однако сотрудники должны быть уведомлены: в трудовом договоре или внутреннем регламенте должен быть пункт о мониторинге. Банковские и медицинские сайты рекомендуется исключить из перехвата (splice в конфигурации).
Squid легко обрабатывает 400 пользователей на сервере с 4 CPU и 8 GB RAM. Типичная нагрузка офиса — 500-1000 запросов/секунду, Squid может обработать 5000+ req/s. Узкое место обычно не CPU, а диск для кэша — используйте SSD. Для 1000+ пользователей рекомендуется выделить 16 GB RAM и настроить cache_mem.
Если прокси настроен как transparent (через iptables), обход через VPN затруднён — весь трафик проходит через шлюз. Если через WPAD — пользователь может вручную отключить прокси. Решение: блокировать на firewall прямой доступ в интернет (DROP на порты 80/443), оставив только прокси-сервер. Дополнительно — блокировка популярных VPN-протоколов на периметре.
Squid — forward proxy (пользователи ходят через него в интернет). Nginx — reverse proxy (внешние пользователи ходят через него к вашим серверам). Nginx как forward proxy работает, но не поддерживает ACL по пользователям, кэширование forward-запросов, delay pools и SSL Bump. Для корпоративного прокси Squid — правильный выбор.
Два подхода: 1) скачивать готовые списки (ShallaList, UT1) через cron и конвертировать в формат Squid ACL; 2) интегрировать Squid с SquidGuard или e2guardian, которые поддерживают категорийные списки с автообновлением. Мы рекомендуем комбинацию: базовые списки из ShallaList + ручные дополнения от ИБ-отдела.

Нужна помощь с проектом?

Специалисты АйТи Фреш помогут с архитектурой, DevOps, безопасностью и разработкой — 15+ лет опыта

📞 Связаться с нами
#Squid proxy#корпоративный прокси#ACL#SSL Bump#LDAP аутентификация#WPAD#delay pools#content filtering
Комментарии 0

Оставить комментарий

загрузка...