Squid proxy настройка

Homepage: Squid

Squid (кальмар) - кэширующий прокси- сервер для протоколов Коды состояния HTTP. Методы и структура протокола HTTP, Раздел FTP: Протокол FTP, серверы, клиенты FTP для Linux и Windows, HTTPS (при соответствующих настройках). Лицензия GNU GPL.

Одной из особенностей squid является возможность работать в режиме «обратного прокси» («reverse proxy»), так же известного как «ускоритель» («HTTP accelerator»). В этом случае вместо кэширования запросов нескольких пользователей к множеству сайтов, кэшируются запросы множества пользователей к нескольким сайтам. В этом режиме принятый запрос проверяется на «динамичность» (нужно ли каждый раз обрабатывать запрос с нуля) и «возраст» (актуальны ли ещё данные). Если данные ещё актуальны и не поменялись, то запрос не передаётся серверу, а отдаётся из кэша squid. Таким образом существенно снижается нагрузка на серверы. «Обратный прокси» способен распределять запросы между несколькими серверами, балансируя нагрузку и/или обеспечивая отказоустойчивость, то есть фактически предоставляет функциональность, аналогичную кластеру. Кластер — группа компьютеров представляющая с точки зрения пользователя единый аппаратный ресурс.

Squid поддерживает работу в режиме "прозрачного прокси". В режиме прозрачности не проксируются FTP- и HTTPS- запросы.

  • OC: Debian GNU/Linux wheezy/sid 3.0.0-1-amd64 #1 SMP x86_64 GNU/Linux
  • Squid 3.1.18-1 Stable
# aptitude install squid3

OC FreeBSD 7.2-RELEASE squid-3.1.0.17 beta. В этой версии наконец-то упростили (уменьшили) конфигурационный файл Squid.

Конечная цель настройка прозрачного прокси Squid с использованием пакетного фильтра Packet Filter Firewall (PF) (обновление 2018.08).

> > cd /usr/ports/www/squid31
> make config
...
[X] SQUID_PF             Enable transparent proxying with PF
...
> make install clean
> ee /usr/local/etc/squid/squid.conf
# выводить сообщения пользователям на украинском языке, по умолчанию английский
error_default_language uk-ua
# Squid слушает порт только на localhost. intercept включаем прозрачный прокси
http_port 127.0.0.1:3128 intercept
visible_hostname = local
# например есть ОЗУ 192 Мб -  можно выставить 64 Mб. Выделение ОЗУ по кеш, а не под процесс SQUID.
cache_mem 64 MB
# размер папки с кешем 800 Мб
cache_dir ufs /usr/local/squid/cache 800 16 256
# пределы для включения механизма очистки кеша от устаревших данных, в процентах
# кеш при достижении 95% заполнения начинает очищаться
cache_swap_low 90
cache_swap_high 95
# политика очистки кеша по умолчанию
memory_replacement_policy lru
#Этот тэг задает размер объекта который может хранится в памяти. Объекты
#больше этого размера, сохранятся в памяти не будут. Объекты из памяти
#достаются быстрее, поэтому там должны содержатся только объекты, которые
#часто запрашиваются клиентами. Увеличение значения этого тэга приводит к снижению производительности сервера.
maximum_object_size_in_memory 512 KB
# минимальный размер файл для сохранения в кеше
minimum_object_size 0 KB 
# максимальный размер файл для сохранения в кеше
maximum_object_size 4096 KB
# Этот тэг позволяет задать пароль ftp пользователю Anonymous(!!!) от имени 
# которого Squid будет осуществлять просмотр анонимных ресурсов по FTP протоколу.
ftp_user Squid@your.domen
# разрешить/запретить пассивный режим FTP
ftp_passive on

#Этот тэг определяет количество ротаций лог-файла. По умолчанию - 10. Это означает, что когда вы введете команду 'squid -k rotate',
то текущий файл журнала получит расширение от 0 до 9 и будет отложен. Вместо него создастся новый файл для ведения журнала и теперь
все записи будут вестись уже в новый файл. Если установить значение тэга logfile_rotate 0, то это отключит ротацию файлов.
logfile_rotate 4
access_log /var/log/squid/access.log squid
# отладочная информация. содержит основную информацию об использовании кэша.
cache_log /var/log/squid/cache.log
# Default: none
#cache_store_log /var/log/squid/store.log

#Этот тэг задает список слов, которые при нахождении их(этих слов) в URL, 
#сообщают Squid то, что объект расположенный по этому URL надо брать 
#напрямую, а не из кэша.
hierarchy_stoplist cgi-bin ?

Проверим конфигурационный файл Squid на ошибки.

> squid -f /usr/local/etc/squid/squid.conf -k parse
2010/03/16 16:40:32| Processing Configuration File: /usr/local/etc/squid/squid.conf (depth 0)

Перед первым запуском нужно создать кеш Squid.

> squid -z
2010/03/16 16:42:05| Creating Swap Directories
2010/03/16 16:42:05| /usr/local/squid/cache exists
2010/03/16 16:42:05| Making directories in /usr/local/squid/cache/00
...

Для запуска Squid нужно добавить строку squid_enable=yes в файл rc.conf

> /usr/local/etc/rc.d/squid start
ext_if_a="tun0"
int_if_a="rl0"
int_if_b="rl1"
LanAll =  "{10.90.90.0/24, 192.168.35.0/24, 192.168.1.0/24}"
Lanint_if_b = "{10.90.90.0/24, 192.168.35.0/24}"

# RDR transparent proxy
rdr on $int_if_b inet proto tcp from $Lanint_if_b to any port 80 -> 127.0.0.1 port 3128
rdr on $int_if_a inet proto tcp from 192.168.1.0/24 to any port 80 -> 127.0.0.1 port 3128
# NAT
nat on $ext_if_a inet from $LanAll to any -> ($ext_if_a)
  • Ошибка: IpIntercept.cc(316) PfInterception: PF open failed: (13) Permission denied. Для ее устранения нужно дать доступ (чтение) Squid к PF.
chown root:squid /dev/pf
chmod 660 /dev/pf
> crontab -e
@daily squidstat.sh
> ee squidstat.sh
#!/bin/sh
#
/usr/local/www/lightsquid/lightparser.pl
/usr/local/sbin/squid -k rotate
rm /usr/local/squid/logs/access.log.0
rm /usr/local/squid/logs/cache.log.0
rm /usr/local/squid/logs/store.log.0
  • Скрипт для проверки работы Squid: если Squid упал -запускает его.
> ee cron_start_squid.sh
#!/bin/sh

if [ -s /usr/local/squid/squid.pid ]
        then 
        else echo start squid: `date` >> /var/log/squid_down.log ; `/usr/local/etc/rc.d/squid start >> /dev/null`
fi

Настройка доступа в Squid настраивается через списки доступа ACL. Правила читаются и применяются сверху вниз - то есть последовательность расположения директив http_access важна.

Ограничения к ресурсам происходит в два этапа:

  • определение условия запроса
  • разрешить или запретить определенное на первом шаге условие
acl dbserv src 192.168.1.11/32 #описывает единственную машину с адресом 192.168.1.11 и назначает ей ACL с dbserv
http_access deny dbserv #запрет доступа в интернет ACL dbserv

Настройка аутентификации при помощи программы ncsa_auth. Пользователи и пароли хранятся в файле /etc/squid/passwd, который создается при помощи утилиты htpasswd.

#Recommended minimum configuration per scheme:
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/passwd 
auth_param basic children 5
# после realm можно написать любу. строку. Она будет отображаться в заголовке окна ввода пароля
auth_param basic realm Squid proxy-caching DARK
# проверяет изменил ли сис. администратор пароль в файле /etc/squid/passwd. Если да пользователя попросят ввести новый пароль.
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off

Эти правила должны быть применены к ACL, например

# Указали Squid что настроили аутентификацию
acl auth proxy_auth REQUIRED
# Описали единичный компьютер
acl winxp src 10.5.21.4/32
# Указали разрешить доступ этому компьютеру после ввода логина и пароля
http_access allow winxp auth
Squid должен быть собран с опцией [х] SQUID_DELAY_POOLS Enable delay pools
http_access allow winxp

delay_pools 1
delay_class 1 1
delay_parameters 1 8000/8000
#64KB
delay_access 1 allow winxp
delay_access 1 deny all
  • delay_pools Этот тэг отвечает за количество используемых delay pools. Например, если у вас есть один delay pool класса 2 и один delay pool класса 3, то в целом вы имеете 2 delay pool. Соответственно, в этом случае, тэгу следует задать значение равное 2. По умолчанию: delay_pools 0
  • delay_parameters ограничить скорость на пулах, например
    # без ограничений
    #delay_parameters 1 -1/-1
    # ограничить скорость 64Kbit/c
    #delay_parameters 1 8000/8000
    # ограничить скорость 256Kbit/c
    #delay_parameters 1 32000/32000
    # если пользователь пытается скачать файл размера больше чем 32000 - тогда ограничить скорость 800
    #delay_parameters 1 800/32000
    

В файле /var/log/squid/cache.log появляется строка с ошибкой:

2010/07/19 13:29:28| IpIntercept.cc(316) PfInterception: PF open failed: (13) Permission denied

Исправить эту ошибку можно несколькими способами

  • Первый: chmod +r /dev/pf - что не является безопасным.
  • Второй:
    > ee /etc/devfs.conf
    # Allow Squid read acess to /dev/pf
    own     pf      root:squid
    perm    pf      0640
    /etc/rc.d/devfs restart

Статистика Squid

Скриптов для сбора статистики Squid довольно много.

  • LightSquid
  • Sarg анализатор логов Squid - Squid Analysis Report Generator
  • Calamaris - анализирует файлы журнала (logfiles) множества разнообразных Web прокси-серверов и генерирует отчет о максимальном использовании (peak-usage), способах запросов (request-methods), отчетах статуса входящих и исходящих запросов, вторичных и высокоуровневых адресатах, типах содержания и производительности.

Ссылки

PQ VPS сервера в 28+ странах.