Прокси-сервер SQUID, вводный пост

21 февраля, 2012 Рубрики: Linux, SQUID, Настройка сервера Linux

Прокси-сервер SQUIDДоброго времени, уважаемые читатели и гости! С данной статьи я начну описание работы кэширующего прокси-сервера SQUID. Эта статья в большинстве своем будет вводная теоретическая.

Что такое proxy-сервер и что такое squid

Начну с основ. squid является кэширующим прокси сервером для HTTP, FTP и др. протоколов. Прокси сервер для HTTP – это программа, выполняющая HTTP-запросы от имени клиентской программы (будь то браузер или другой софт). Proxy может быть кэширующим или не кэширующим. Кэширующий, соответственно, сохраняет все запросы в какое-либо хранилище для более быстрой отдачи клиентам, а не кэширующий – просто транслирует HTTP, ftp или другие запросы. Ранее, кэширование трафика позволяло добиться довольно значительной экономии трафика, но в настроящее время с ростом скоростей интернета это немного утеряло актуальность. Прокси серверА можно выстраивать в иерархии для обработки запросов. При этом, прокси серверА взаимодействуют между собой по протоколу ICP.

Squid разработан и может работать на большинстве операционных систем (как unix, так и windows). Лицензируется под лицензией GNU GPL. Способен обрабатывать и кэшировать  HTTP, FTP, gopher, SSL и WAIS (убрано в 2.6) запросы, а так же DNS. Наиболее частые запросы хранит в оперативной памяти. На текущий момент существуют 2 стабильные версии squid: 2.7 и 3.1. С отличиями можно ознакомиться в ссылках в конце статьи. Все зависимости при установке из пакетов у них одинаковые. Конфигурационный файл версии 2 совместим с версией 3, но в 3 версии добавлены новые параметры. В статье я буду рассматривать версию squid3. Стоит так же заметить, что  если устанавливать squid3 , то он свои конфигурационные файлы будет держать в /etc/squid3, а так же логи по умолчанию в squid3 лежат в каталоге /var/log/squid3/, а не /var/log/squid/, как “любят считать” многие анализаторы логов.

Кучу раз упомянуто слово “кэширование“. А что же это, собственно, такое – кэширование? Это способ хранения запрошенных из Интернет объектов на сервере, находящемся ближе к запрашивающему компьютеру нежели исходный. Интернет-объект это файл, документ или ответ на обращение к какому-либо сервису предоставляемому в Интернет (например, FTP, HTTP, или gopher). Клиент запрашивает интернет-объект из кеша прокси-сервера; если объект ещё не кеширован, то прокси-сервер получает объект (либо от узла сети указанного по запрошенному адресу URL, либо от родительского или соседнего кеша) и доставляет его клиенту.

Режимы работы прокси-сервера Squid

Прокси-сервер Squid может работать в следующих трех основных режимах:

Прозрачный режим

В этом режиме HTTP соединение осуществляемое клиентами перенаправляется на прокси-сервер без их ведома или явной конфигурации. В этом режиме не требуется настройка клиентов. Недостатки данного способа: необходима конфигурация NAT и перенаправления трафика, аутентификация клиентов не работает, не перенаправляются FTP и HTTPS запросы.

Аутентифицирующий режим

Для работы в этом режиме клиенты должны быть настроены для работы с прокси-сервером (в настройках соединения должен быть прописан адрес прокси-сервера). Может выполняться аутентификация и авторизация клиентов через Kerberos, Ldap, NTLM, IP и Radius. Возможно построение взаимодействия с серверами Microsoft Active Directory путем аутентификации клиентов – членов домена, используя протокол Kerberos, и последующей авторизации членов групп домена используя LDAP в прозрачном режиме (пользователь вводит свой пароль только при регистрации в домене). Для авторизированных групп возможно применение различных настроек контроля доступа и QoS (delay pools).

Обратный прокси-сервер

Прокси-сервер кэширует исходящие данные. Обратный прокси-сервер Squid получает данные у HTTP сервера от имени клиента и передает их обратно клиенту (например, в Интернет). Этот режим позволяет осуществить:

  • Использование кэширования, которое снижает нагрузку на HTTP сервера;
  • Распределение нагрузки между HTTP серверами;
  • Маскировку HTTP серверов и их характеристик;
  • Предотвращение web атак на сервера.

Схемы режимов работы SQUID

прозрачный прокси squid

transparent режим

обратный прокси squid

обратный режим

squid в режиме аутентификации

режим аутентификации

На приведенных схемах зелеными стрелками обозначены потоки проксируемого трафика. Движение данных потоков в Linux чаще всего регулируется силами правил iptables и настройками браузера. Кроме того, очень часто, функции маршрутизатора и прокси выполняет одна машина.

Установка SQUID

Перед установкой и настройкой squid необходимо настроить сеть linux и убедиться, что машина, на которой будет работать squid имеет доступ во внешнюю сеть и клиенты, которые будут использовать данный прокси имеют доступ к данной машине. Установка прокси-сервера squid как и другого ПО в Linux возможна различными способами, описанными в статье управление программным обеспечением в linux. Я затрону способ установки из репозитория в Debian. Итак, для установки squid необходимо установить пакет squid3, для этого выполнить вот такую команду:

gw ~ # aptitude install squid3
Следующие НОВЫЕ пакеты будут установлены:
 libltdl7{a} squid-langpack{a} squid3 squid3-common{a}
0 пакетов обновлено, 4 установлено новых, 0 пакетов отмечено для удаления, и 0 пакетов не обновлено.
Необходимо получить 2 157 kB архивов. После распаковки 10,3 MB будет занято.
Хотите продолжить? [Y/n/?] y
Получить:1 http://ftp.ru.debian.org/debian/ squeeze/main libltdl7 i386 2.2.6b-2 [295 kB]
Получить:2 http://ftp.ru.debian.org/debian/ squeeze/main squid-langpack all 20100628-1 [228 kB]
Получить:3 http://ftp.ru.debian.org/debian/ squeeze/main squid3-common all 3.1.6-1.2+squeeze2 [193 kB]
Получить:4 http://ftp.ru.debian.org/debian/ squeeze/main squid3 i386 3.1.6-1.2+squeeze2 [1 442 kB]
Получено 2 157 kБ в 9с (238 kБ/с)
Выбор ранее не выбранного пакета libltdl7.
(Чтение базы данных ... на данный момент установлено 41133 файла и каталога.)
Распаковывается пакет libltdl7 (из файла .../libltdl7_2.2.6b-2_i386.deb)...
Выбор ранее не выбранного пакета squid-langpack.
Распаковывается пакет squid-langpack (из файла .../squid-langpack_20100628-1_all.deb)...
Выбор ранее не выбранного пакета squid3-common.
Распаковывается пакет squid3-common (из файла .../squid3-common_3.1.6-1.2+squeeze2_all.deb)...
Выбор ранее не выбранного пакета squid3.
Распаковывается пакет squid3 (из файла .../squid3_3.1.6-1.2+squeeze2_i386.deb)...
Обрабатываются триггеры для man-db ...
Настраивается пакет libltdl7 (2.2.6b-2) ...
Настраивается пакет squid-langpack (20100628-1) ...
Настраивается пакет squid3-common (3.1.6-1.2+squeeze2) ...
Настраивается пакет squid3 (3.1.6-1.2+squeeze2) ...
Creating Squid HTTP proxy 3.x spool directory structure
2012/02/15 21:29:41| Creating Swap Directories
Restarting Squid HTTP Proxy 3.x: squid3Creating Squid HTTP Proxy 3.x cache structure ... (warning).
2012/02/15 21:29:43| Creating Swap Directories
.

Как видно, при установке пакета, была попытка создания каталога кэша, но т.к. он не настроен, то вывалилось предупреждение. Так же, squid добавлен в автозагрузку, запущен и принимает подключения на всех интерфейсах. Но т.к. он не настроен, доступ к интернет-страницам через сервер ограничен. Конфиг сквида расположен в /etc/squid3/squid.conf и состоит из более чем 5,5 тысяч строк и синтаксис его практически не отличается от конфига любого другого сервиса. Бросаться менять какие-то настройки срезу – не стоит. Потом не разгребете. Давайте рассмотрим конфиг, который нам предлагается по умолчанию без комментариев и пустых строк:

gw ~ # grep -v ^# /etc/squid3/squid.conf | grep -v ^$
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access deny all
http_port 3128
hierarchy_stoplist cgi-bin ?
coredump_dir /var/spool/squid3
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

Как видно, в конфигурации по умолчанию, прокси-сервер работает и разрешает обращения только с адресов  127.0.0.0/8. Следует внимательно просмотреть весь список и закомментировать строки с портами не нужных или не используемых сервисов. Более полное понимание данного конфига будет после прочтения следующих разделов. Т.о. если мы запустим консольный браузер lunx с указанием на наш прокси, то сможем увидеть заданную страницу:

gw ~ # # запускаем бреузер с указанием страницы ya.ru:
gw ~ # http_proxy=http://127.0.0.1:3128 lynx ya.ru
Идет поиск 'ya.ru' сначала
gw ~ # # в логе видим обращение к заданной странице:
gw ~ # cat /var/log/squid3/access.log
1329527823.407 110 127.0.0.1 TCP_MISS/200 9125 GET http://ya.ru/ - DIRECT/93.158.134.203 text/html

squid работа через браузер lynx Некоторыепараметры в конфигурационом файле squid могут применяться несколько раз (например acl). Некоторые параметры, особенно имеющие одно значение могут использоваться только один раз. При этом, при использовании такого параметра 2 и более раз – будет использовано последнее значение. Например:

logfile_rotate 10
# Несколько значений - кончное будет равно 5
logfile_rotate 5

Управление squid

Демон управляется init-скриптом /etc/init.d/squid3. Прокси-сервер представляет собой процесс /usr/sbin/squid3. Демон поддерживает множество параметров, с которыми можно ознакомиться в man squid, но в таких дистрибутивах, как Debian и RH для управления демоном вполне достаточно init-скрипта.

Проверить работоспособность сервера squid можно следующим образом:

gw ~ # # проверка работоспособности squid на сетевом интерфейсе
gw ~ # netstat -npl | grep 3128
tcp        0      0 0.0.0.0:3128            0.0.0.0:*               LISTEN      25816/(squid)
gw ~ # # проверка, запущен ли процесс демона
gw ~ # ps aux | grep squ
root     25814  0.0  0.0   9316  1644 ?        Ss   Feb15   0:00 /usr/sbin/squid3 -YC -f /etc/squid3/squid.conf
proxy    25816  0.0  0.4  37308 13184 ?        S    Feb15   2:29 (squid) -YC -f /etc/squid3/squid.conf
root     28451  0.0  0.0   3328   784 pts/0    S+   00:20   0:00 grep --colour=auto squ

Как видно, при запуске данный демон стартует с параметрами -YC -f /etc/squid3/squid.conf. Параметр -f задает конфигурационный файл, который используется для работы демона. Параметры -Y и -С мне не совсем ясны. -Y вроде как ускоряет каким-то образом запуск в случае падения, а -С позволяет корректно завершать демона.

Программа squid3 с ключом -k и дополнительным параметром позволяет удобно управлять демоном, не прерывая пользователей. Примеры:

  • -k – послать команду работающему серверу:
    • reconfigure – посылка сигнала HUP – перечитать и использовать файл конфигурации
    • rotate – обрезать логи; сигнал USR1
    • shutdown – корректно остановить squid; сигнал TERM
    • interrupt – убить squid; сигнал INT
    • kill – жестко убить squid; сигнал KILL
    • debug – начать/закончить полную трассировку; сигнал USR2
    • check – проверить корректность работы squid (без сообщений – работает корректно); сигнал ZERO
    • parse – проверить синтаксис squid.conf

Собственно, изменив squid.conf, выполнив squid3 -k parse, можно убедиться в корректности внесенных изменений, далее выполнив squi3 -k reconfigure можно практически не обрывая пользователей применить изменения. Очистку кэша (пересоздание) можно выполнить командой squid3 -z.

Будет неправильно, если я не обращу внимание на следующий момент. При установке squid из репозиториев Вашего дистрибутива, пакет является уже настроенным и имеет какие-то заданные настройки по умолчанию. Например, расположение каталога журнала, каталога конфигурационных файлов, поддерживаемые методы проверки подлинности и множество других. Какие настройки задавать при сборке бинарного пакета определяется сборщиком пакета и сообществом, которое осуществляет поддержку дистрибутива. Если параметры по умолчанию Вас не устраивают, то необходимо будет установить squid из исходников.

Параметры, с которыми был собран squid Вашего дистрибутива можно посмотреть командой squid3 -v. Например, в Debian squeezу squid собран с параметрами, приведенными ниже:

--prefix=/usr - префикс для других ключей:
--mandir=${prefix}/share/man - каталог хранения man-страниц
--libexecdir=${prefix}/lib/squid3 - каталог с исполняемыми модулями (в том числе и хелперы)
--sysconfdir=/etc/squid3 - каталог хранения конфигурации
--with-logdir=/var/log/squid3 - каталог хранения журналов
и мн. др...

Настройка squid

Описание настроек squid3 начну с основных настроек, которые желательно произвести при настройке любой конфигурации прокси-сервера. Конфиг сквида расположен в /etc/squid3/squid.conf, это основной конфигурационный файл, в котором содержатся все настройки. (В дистрибутивах Debian и RedHat так же при запуске просматриваются параметры из стартовых файлов настроек /etc/default/squid3 и /etc/sysconfig/squid3, соответственно). Так же, я упоминал, что там более 5 тысяч строк и что сразу рваться настраивать что-то не разобравшись – не стоит. Синтаксис конфига squid3 классический: строки с # – это комментарии, параметры представляют собой строки “параметр значение“, возможно использование переменных. Конфигурационный файл разбит на разделы для удобства, но важно помнить, что разбор параметров производится “сверху вниз” в порядке очередности. Так же, с помощью параметра include можно подключать внешние конфигурационные файлы.

По умолчанию разрешение имени узла, на котором работает Squid, происходит при помощи gethostname(), в зависимости от установок DNS, он иногда не может однозначно определить имя, которое будет фигурировать в журналах и выводах об ошибках “Generated … by server.com (squid/3.0.STABLE2)”. Для корректной записи имени хоста, необходимо это имя (FQDN??) занести в параметр:

visible_hostname myproxy

По умолчанию, squid принимает подключения на всех интерфейсах. Если у нас сервер одним из сетевых интерфейсов смотрит во внешний мир, то желательно ограничить подключения только на интерфейсе локальной сети (допустим, 10.0.0.10/24). За это отвечает параметр http_port:

http_port 10.0.0.10:3128

Как работают данные параметры можно увидеть в следующем листинге:

gw ~ # # проверяем работу демона до настройки:
gw ~ # netstat -antp | grep squ
tcp        0      0 0.0.0.0:3128            0.0.0.0:*               LISTEN      25816/(squid)
gw ~ # # внесенные изменения:
gw ~ # grep ^http_port /etc/squid3/squid.conf
http_port 10.0.0.10:3128
gw ~ # # перечитываем измененный конфиг
gw ~ # /etc/init.d/squid3 reload
Reloading Squid HTTP Proxy 3.x configuration files.
done.
gw ~ # # проверяем работу с измененным конфигом:
gw ~ # netstat -antp | grep squ
tcp        0      0 10.0.0.10:3128          0.0.0.0:*               LISTEN      25816/(squid)

Как видно, теперь демон работает только на интерфейсе заданной сети. Стоит так же отметить, что новые версии squid (<3.1) поддерживают задание нескольких параметров http_port. При этом, у разных параметров могут быть указанны дополнительные ключи такие как intercept, tproxy, accel и др., например:

gw ~ # grep ^http_port /etc/squid3/squid.conf
http_port 10.0.0.10:3128
http_port 10.0.0.10:3129 tproxy

Данные параметры задают режи работы прокси-сервера. Например tproxy (старый синтаксис – transparent) задает режим прозрачного прокси. Данные режимы достойны отдельных статей и в будущем возможно будет рассмотрены.

Теперь необходимо настроить клиентский компьютер и пользоваться интернетом. Но по умолчанию, доступ разрешен только с локалхоста и при попытке доступа к веб пользователь получит ошибку “Доступ запрещен”. В логе /var/log/squid3/access.log будет примерно такое сообщение:

1329649479.831 0 10.0.1.55 TCP_DENIED/403 3923 GET http://ya.ru/ - NONE/- text/html

Для того, чтобы клиенты локальной сети могли работать, необходимо настроить разрешения с помощью списков контроля доступа.

Настройка доступа squid

Фактически настройка доступа заключается в описании объекта доступа через параметр acl, а затем разрешении или запрете работы описанному объекту acl при помощи параметра “http_access”. Простейший формат данных настроек имеет следующий вид:

acl  имя_списка  тип_отбора  характеристики_типа_отбора

где acl – параметр описывающий список контроля доступа, имя которого задается значением имя_списка. Имя чувствительно к регистру букв. тип_отбора задает тип, которому будет соответствовать заданная далее характеристика_типа_отбора. Данная характеристика может принимать такие часто используемые значения, как src (от source) – источник запроса, dst – адрес назначения, arp – МАС-адрес, srcdomain и dstdomain – доменное имя источника и назначения соответственно, port – порт, proto – протокол, time – время и многие другие. Соответственно, значение характиристики_типа_отбора будут формироваться в зависимости от типа_отбора.

Можно указывать несколько строк acl с одинаковыми именами и типами_отбора, в таком случае, данные acl будут объеденены в один список с логической операцией ИЛИ. Например:

acl site dstdomain site.com
acl site dstdomain site.org
# аналогичен записи:
acl site dstdomain site.com site.org

Словами это звучит так: списку доступа с именем site принадлежат все запросы, отправленные на сайт site.com ИЛИ site.org. Кроме того, имена_спаска чувствительны к регистру, то есть acl site и acl Site это 2 разных списка доступа.

Когда списки доступа сформированы, при помощи параметра http_access разрешаем или запрещаем доступ указанному ACL. Общий формат вызова такой:

http_access allow|deny [!]имя_списка

где, http_access – параметр задающий последующее правило разрешения (allow) или запрещения (deny) доступ, указанному далее имени_списка. При этом, необязательный восклицательный знак инвертирует значение имени списка. То есть при восклицательном знаке значение имени_списка будет звучать как все, кроме тех, кто в принадлежит данному списку. Кроме того, можно задавать несколько списков через пробел, тогда доступ будет разрешен при условии принадлежности ко всем заданным спискам. При этом, все разрешающие правила необходимо указывать до запрещающего ВСЁ правила:

http_access deny all

Может возникнуть резонный вопрос: зачем задавать данное правило, если мы, например, разрешим доступ к сквиду только избранным acl? Ведь остальные, кто не попадают в данный acl итак “проходят мимо”… Все просто. По-умолчанию, squid использует разрешающее/запрещающее правило противоположное последнему. Например:

# у нас есть единственное разрешеющее правило для некоторого acl user:
http_access allow user
# если при доступе к squid, клиент не попал в этот acl, то к нему будет применено действие deny.
# А если у нас есть два правила
http_access allow user
http_access deny user2
# и клиент не входит ни в acl user, ни в acl user2, то к нему применится allow.
# То есть действие противоположное последнему http_access deny user2

Именно поэтому везде рекомендуется завершать разрешающие правила – запрещающим для всех.

Это, как говориться – основы основ. Давайте рассмотрим простой пример. Предположим, у нас есть 2 сети 10.0.1.0/24 и 10.0.0.0/24, а так же хост 10.0.4.1, которым необходимо разрешить доступ к интернету. Для разрешения доступа необходимо создать описание нового списка доступа в секции “ACCESS CONTROL” файла squid.conf:

acl lan src 10.0.1.0/24 10.0.0.0/24
acl lan src 10.0.4.1

Для бОльшего удобства, можно задать эти правила в отдельном файле, указав путь к нему в место характеристики_типа_отбора. Вот:

gw ~ # # создадим отдельный каталог для хранения списков доступа
gw ~ # mkdir /etc/squid3/acls/
gw ~ # # занесем наши подсети и хосты в отдельный файл
gw ~ # vim /etc/squid3/acls/lan.acl
gw ~ # cat /etc/squid3/acls/lan.acl
10.0.1.0/24
10.0.0.0/24
10.0.4.1
gw ~ # # опишем созданный файл в конфиге (путь необходимо заключить в кавычки)
gw ~ # grep lan.acl /etc/squid3/squid.conf
acl lan src "/etc/squid3/acls/lan.acl"

Разрешим созданному списку доступа lan доступ в интернет и скажем сквиду перечитать конфигурационный файл:

gw ~ # grep lan /etc/squid3/squid.conf | grep acce
http_access allow lan
gw ~ # service squid3 reload
Reloading Squid HTTP Proxy 3.x configuration files.
done.

Подводя маленький итог данному разделу, в двух словах можно сказать, что acl идентифицирует Web запрос, а http_access разрешает или запрещяет идентифицированный запрос. Теперь наши локальные клиенты с радостью пользуются интернетом, предварительно настроив браузер!

Настройка параметров кэша squid

Важным моментом настройки squid является настройка параметров кэширования в squid. Место размещения кэша задается параметром cache_dir в squid.conf. Формат параметр следующий:

cache_dir  тип  путь  размер  L1 L2  [options]

где, тип – это алгоритм формирования кэша, может быть: ufs (unix file system), aufs (async ufs), diskd (внешние процессы для избежания блокировки squid на дисковом вводе/выводе). Рекомендуется использовать ufs, хотя некоторые хвалят aufs. Путь – задает место размещения кэша в файловой системе (должен существовать и иметь права доступа на запись для пользователя, под которым работает squid – обычно proxy). Размер – задает максимальный размер, после которого кэш начнет очищаться. В сети существует множество холиваров по этому параметру. Идеальный размер кеша – от 2 до 10 ГБ в зависимости от числа клиентов. Приблизительно 1 ГБ кеша на каждые 100 тысяч запросов/день. Я придерживаюсь значения в 5 Гб. В Squid каждый кешируемый объект располагается в отдельном файле, сами файлы не сваливаются в одно место, а используется двухуровневая иерархия каталогов. Количество каталогов 1 и 2 уровней и определяют параметры L1 и L2. Эти значения можно оставить по умолчанию. Но для ориентирования в ситуации приведу цитату с bog.pp.ru:

Эксперимент показал, что при кэше в 700 МБ используется только 2 директории первого уровня. То есть для  при стандартной структуре директорий кеша в него “с комфортом” влезает миллион объектов (9 GB), если их больше, то надо увеличить число директорий верхнего уровня

Можно использовать несколько cache_dir. Это положительно сказывается на производительности, особенно, если разместить кэш на разных дисках. Еще больше ускорить работу кэша можно, разместив кэш в tmpfs. Для каждого параметра cache_dir можно в разделе options определить параметр read-only (только чтение) и max-size (максимальный размер объекта).

Максимальный размер объекта в кэше определяется параметром maximum_object_size, значение по умолчанию – 4 Мб. Я данное значение увеличил до 60 Мб, т.к. сотрудникам в локальной сети часто приходится скачивать однотипные файлы до указанного размера:

maximum_object_size 61440 KB

Аналогично? есть и параметр minimum_object_size отвечающий за минимальный размер объекта, по умолчанию его значение “0” то есть отключен. Я рекомендую значение этого параметра увеличить до 2-3 Кб, что снизит нагрузку на диск при поиске маленьких объектов.

Объем ОЗУ, используемый сквидом задается в параметре cache_mem, значение по умолчанию 256 Мб (в версии 3.1). Данное значение я оставил по умолчанию. Менять это значение стоит лишь в том случае, если сквид вас об этом попросит в логах. После данных изменений, необходимо перезапустить сквид, при этом будет создана структура каталогов:

gw ~ # service squid3 start
Starting Squid HTTP Proxy 3.x: squid3Creating Squid HTTP Proxy 3.x cache structure ... (warning).
2012/02/19 22:58:21| Creating Swap Directories
2012/02/19 22:58:21| /var/spool/squid3 exists
2012/02/19 22:58:21| Making directories in /var/spool/squid3/00
2012/02/19 22:58:21| Making directories in /var/spool/squid3/01
2012/02/19 22:58:21| Making directories in /var/spool/squid3/02
2012/02/19 22:58:21| Making directories in /var/spool/squid3/03
2012/02/19 22:58:21| Making directories in /var/spool/squid3/04
2012/02/19 22:58:21| Making directories in /var/spool/squid3/05
2012/02/19 22:58:21| Making directories in /var/spool/squid3/06
2012/02/19 22:58:21| Making directories in /var/spool/squid3/07
2012/02/19 22:58:21| Making directories in /var/spool/squid3/08
2012/02/19 22:58:21| Making directories in /var/spool/squid3/09
2012/02/19 22:58:21| Making directories in /var/spool/squid3/0A
2012/02/19 22:58:21| Making directories in /var/spool/squid3/0B
2012/02/19 22:58:21| Making directories in /var/spool/squid3/0C
2012/02/19 22:58:21| Making directories in /var/spool/squid3/0D
2012/02/19 22:58:21| Making directories in /var/spool/squid3/0E
2012/02/19 22:58:21| Making directories in /var/spool/squid3/0F
.

Много интересных вопросов и ответов на них по использованию кэша и памяти squid’ом описано тут. На этом, можно считать типовое решение по настройке прокси-сервера законченным.

Пример настройки прозрачного прокси squid

Что есть прозрачный прокси? Это режим работы прокси сервера, когда клиент не настраивается на работу через прокси и посылает запросы в сеть по протоколу HTTP, как если бы клиент браузер работал напрямую с веб-сервером. При этом, силами firewall (в linux – iptables) исходящие запросы на HTTP направляются на порт, на котором запущен прокси. Прокси-сервер же, в свою очередь, преобразовывает HTTP запросы в запросы протокола прокси-сервера и посылает ответы клиенту, как веб сервер. Т.о. для клиента прозрачно происходит взаимодействие с прокси-сервером.

Важно понимать и знать! Данный метод поддерживает только HTTP протокол, и не поддерживает gopher, FTP или другое проксирование.  А так же, Squid не умеет одновременно работать в прозрачном режиме и в режиме аутентификации.

Для настройки прозрачного режима, необходимо:

1. Задать прозрачный режим в настройках прокси. Это делается в параметре http_port, например:

http_port ip:port  transparent

2. Завернуть пользователей соответствующим правилом на нужный порт силами iptables:

iptables -t nat -A PREROUTING -i имя_входящего_интерфейса -s подсеть_локльной_сети -p tcp --dport 80 -j REDIRECT --to-port порт_squid, пример:
iptables -t nat -A PREROUTING -i eth1 -s 10.0.0.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128

Все. Можно наслаждаться завернутыми и ничего не подозревающими пользователями на наш прокси-сервер.

Траблешуттинг

В первую очередь, диагностика работы squid заключается в просмотре журналов, расположенных в /var/log/squid3. Большинство проблем решается данным способом. Если это не помогло решить проблему, то переключив демона в дебаг режим командой squid3 -k debug проблему будет найти проще. Собственно, что из себя представляет лог сквида? Файлы логов содержат различную информацию о загрузке и производительности Squid. В log пишутся кроме информации о доступе, /preеще и системные ошибки и информация о потреблении ресурсов, таких, например, как память или дисковое пространство.

Формат log файлов Squid представляет собой строку из значений, разделенных одним или несколькими пробелами:

время.мс время_отклика ip_src Squid_req_status/HTTP_status byte_snd  метод URL user squid_her_status/ip_dst MIME
  • время – время в формате unix (Количество секунд от 00:00 1970.01.01)
  • мс – миллисекунды с точностью до 3х знаков
  • время_отклика –  время отклика, миллисекунд
  • ip_src – IP адрес источника
  • Squid_req_status – статус запроса у squid  (например, TCP_HIT для ранее кешируемых объектов, TCP_MISS если запрашиваемый объект взят не из локального кеша, UDP_HIT и UDP_MISS то же для братских запросов)
  • HTTP_status – статус http протокола ( 200 для удачных, 000 для UDP запросов, 403 для перенаправлений, 500 для ошибок )
  • byte_snd – передано, байт в ответ включая HTTP заголовок
  • метод – метод запроса GET или POST
  • URL – запрошенный url-адрес
  • user – имя авторизованного пользователя
  • squid_her_status – статус иерархии squid –  Результат запросов к братским/родительским кешам
  • ip_dst – IP адрес запрашиваемого узла
  • MIME – mime-type

Рассмотрим на примере:

1329732295.053 374 10.0.1.55 TCP_MISS/200 1475 GET http://www.youtube.com/live_comments? - DIRECT/173.194.69.91 text/xml

Как видно, запрос сделан в  1329732295.053, ответ удаленного сервера составил 374 мс, хост, запросивший страницу имеет IP 10.0.1.55, запрошенный объект был передан не из локального кэша (TCP_MISS), код ответа сервера – 200, клиенту передано 1475 байт методом GET, был запрошен URL  http://www.youtube.com/live_comments?, имя пользователя не определено, объект был получен напрямую от сервера с IP 173.194.69.91, был передан текст, т.к. mime –  text/xml. Вот.

Некоторые заключительные моменты о squid3

В статье я рассмотрел основные принципы работы прокси сервера, а так же, базовые настройки, позволяющие реализовать простейший кэширующий сервер, а так же организовать работу squid в прозрачном (transparent) режиме. Squid поддерживает несколько вариантов авторизации (по IP, через  LDAP, MySQL, NTLM и др.), возможности ограничения пропускной способности канала и контроля доступа к ресурсам интернет. Работу сквида с методами различной авторизации и примеры контроля трафика я рассмотрю в следующих статьях.

Что еще почитать:

В SQUID-FAQ есть много интересной и полезной информации, с которой определенно стоит ознакомиться: http://unix1.jinr.ru/faq_guide/net_management/squid/squid_faq.html
Описание разницы между 2 и 3 squid: http://www.tux.in.ua/articles/731
Перевод squid.conf: http://break-people.ru/cmsmade/index.php?page=translate_squid_conf_file
Еще один перевод: http://www.opennet.ru/base/net/squid_conf.txt.html
Много информации на русском о сквиде: http://squid.opennet.ru/
Отличная книга Squid Proxy Server 3.1 Beginner’s Guide Saini K. (http://books.google.ru/books/about/Squid_Proxy_Server_3_1.html?id=C_c7mAEACAAJ)
Squid. The definitive guide (http://etutorials.org/Server+Administration/Squid.+The+definitive+guide/ )

Upd 2012.02.26: добавил информацию о конфигурации по умолчанию
Upd 2012.03.30: дополнил информацию о http_access
Upd 2012.04.07: дополнил некоторую информацию
Upd 2012.04.08: добавил Squid Proxy Server 3.1 Beginner’s Guide

С Уважением, Mc.Sim!




Теги: , , , ,

39 комментариев к “Прокси-сервер SQUID, вводный пост”

  1. oldbay
    21 февраля, 2012 at 01:39
    1

    Спасибо: толковая и приятная для чтения статья…. впрочем как всегда :)

  2. Михаил
    21 февраля, 2012 at 05:18
    2

    Спасибо за хорошую вводную заметку о SQUID.
    Предлагаю чуть подробнее расписать о кэше в памяти:

    # объем кеша в памяти
    cache_mem 512 MB
    # максимальный размер файла, хранящегося в кеше в ОЗУ
    maximum_object_size_in_memory 1024 KB
    # максимальный размер файла, хранящегося в кеше на диске
    maximum_object_size 32768 KB
    # Настраиваем политику замещения файлов в памяти и дисковом кэше, мы используем
    # сочетание LFUDA и GDSF. Политика GDSF оптимизирует скорость объектов, храня
    # маленькие популярные объекты в кэше поэтому она имеет больше шансов на совпадение.
    # Она достигает более низкой скорости, чем LFUDA, так как она исключает
    # большие (возможно, популярные) объекты.
    cache_replacement_policy heap LFUDA
    memory_replacement_policy heap GDSF
    # объем кеша на диске – 32 Гб
    cache_dir ufs /var/spool/squid 32000 128 256

    • 21 февраля, 2012 at 11:19
      3

      Большинство этих параметров в статье есть, а остальные – не сильно критичные для производительности и работы сквида и они есть в переводах squid.conf. А вот кэш в 32 Гб, конечно порадовал. Это, наверно для 10000 пользователей или больше :)
      А в целом – спасибо за предложение.

      • Alex
        1 декабря, 2023 at 19:45
        4

        32 GB = 33554432 KB

  3. semperN
    21 февраля, 2012 at 08:40
    5

    Отличная статья так держать. Ваш сайт в избранные.

  4. Tina
    26 февраля, 2012 at 17:04
    6

    Здравствуйте Мас’sim.
    Интересно было бы узнать ваше мнение об анонимных и искажающих proxy. И особенно, в качестве бонуса, пример настройки.
    Заранее спасибо. С уважением к Вам, ваш читатель.

    • 26 февраля, 2012 at 17:22
      7

      Честно говоря, не приходилось организовывать такие конфигурации. Но если хочется анонимно посидеть в интернете, то могу посоветовать использовать Tor https://www.torproject.org/. Но это не панацея…

  5. 26 февраля, 2012 at 18:14
    8

    Добавил информацию о конфигурации по умолчанию

  6. Tina
    26 февраля, 2012 at 19:02
    9

    Спасибо.

  7. 30 марта, 2012 at 12:26
    10

    Дополнил http_access

  8. 8 апреля, 2012 at 23:20
    11

    В что еще почитать добавил отличную книгу.

  9. Михаил
    9 апреля, 2012 at 04:02
    12

    Что-то книжку winrar не распаковывает. :(
    ! D:\Saini_K._Squid_Proxy_Server_3.1.Beginners_Guide_-_2011.zip: Неизвестный метод в Saini K. – Squid Proxy Server 3.1. Beginner’s Guide – 2011.pdf
    ! D:\Saini_K._Squid_Proxy_Server_3.1.Beginners_Guide_-_2011.zip: Нет файлов для извлечения

    • 9 апреля, 2012 at 09:57
      13

      Хм.. Странно. Заменил ссылку на обычный pdf.

  10. sisdba
    27 августа, 2012 at 22:07
    14

    Подскажите как полностью отключить кеширование в SQUID 2.7 *CRAZY*

    • 6 сентября, 2012 at 19:58
      15

      Думаю, что минимально необходимо добавить строку
      cache deny all
      Это правило запредяет кэширование для acl c bvtytv all.
      Если вообще по джедайски, то необходимо добавить каталог с кэшем и типом null
      cache_dir null /tmp
      но для этого сквид должен быть собран с параметром
      –enable-storeio=null

  11. Я не граммар наци, но...
    21 сентября, 2012 at 12:29
    16

    C интересом читал, но дойдя до

    # если при доступе к squid, клиент не попал в этот acl, то для негопримениться действие deny.

    ошибка. Стал читать дальше и наткнулся на

    если клиент не входит не в acl user не в acl user2

    Ощутил позыв к ошибка, но сдержался, потому, что я не граммар-наци.
    Читаю дальше и снова натыкаюсь на

    то к нему примениться allow.

    .
    Снова ошибка.

    • 21 сентября, 2012 at 13:56
      17

      Спасибо за комментарии. Хотелось бы несколько более адекватно получать замечания )

  12. Uzunbey
    12 ноября, 2012 at 17:38
    18

    Автору – респектище! Молодчина!
    Не желает ли достопочтенный Max проконсультировать нас еще и относительно RADIUS-аутентификации? ;)
    Впрочем, возможно, автор подскажет иное решение по следующей проблеме: все больше пользователей покупают девайсы, которые не могут быть аутентифицированы по Kerberos. Другие схемы либо не вполне безопасны, либо неудобны для применения в больших сетях. В моей сети аутентификация всяческих iPxxx и Samsung проходит через RADIUS (с помощью личного сертификата). Было бы очень полезно рассмотреть здесь и этот тип авторизации клиентов. Спасибо.

    • 14 ноября, 2012 at 23:10
      19

      Спасибо за отзыв.
      Возможно когда-то доберусь до этого (RADIUS), но не обещаю.
      В данных случаях я выделял под таких клиентов в отдельную подсеть и по подсети им разрешал доступ.

  13. Uzunbey
    15 ноября, 2012 at 16:05
    20

    Спасибо за ответ.
    C RADIUS-аутентификацией я разобрался сам – в общем, ничего сложного. Но есть одна проблема: хелпер squid_radius_auth поддерживает только метод PAP. Для проверки сертификатор нужен MS-CHAP v2. Значит, RADIUS не подходит в моем случае. Нет ли у автора соображений по способу проверки подлинности именно с использованием сертификатов – подсети никак не подойдут (слишком много клиентов, их трудно учитывать).

    • 15 ноября, 2012 at 21:59
      21

      Я с RADIUS только однажды на практике работал в плотную и это было довольно давно. Посему могу задавать не очень корректные вопросы/советы ))
      Вижу 2 выхода:
      1. разрешить на RADIUS PAP
      2. Написать свой хелпер, вот хороший пример на php http://www.freesoftwaremagazine.com/articles/authentication_with_squid

  14. FeanaR
    2 декабря, 2013 at 10:04
    22

    Mc.Sim, огромное спасибо за Ваши статьи. Мануалов понятнее,иформативнее и актуальнее по данной тематике не найти.

    Скажите, вы не сталкивались с проблемой отображения имен пользователей на кириллице в файле access.log?

    • 2 декабря, 2013 at 15:25
      23

      Спасибо за отзыв.
      Нет, не сталкивался. Я специально всех пользователей переводил в латиницу, чтобы потом не “приседать” с данной проблемой.

  15. Михаил
    2 декабря, 2013 at 17:07
    24

    FeanaR, присмотритесь к утилите “free-sa”.
    Ссылка, которая может вам пригодиться:
    http://sourceforge.net/apps/phpbb/free-sa/viewtopic.php?f=2&t=17

    • FeanaR
      9 декабря, 2013 at 09:39
      25

      Михаил, спасибо большое, ознакомлюсь.

  16. max
    15 января, 2014 at 15:53
    26

    нужно ли маскарадить мне интерфейс который настроен на сторону интернета для того чтобы вся сеть ходила под одним адресом в интернет. (настроен сквид на сервере на котором выход в нет, прокси не прозрачный)

    • 17 января, 2014 at 15:29
      27

      Нет не нужно, squid же сам ходит от Вашего внешнего адреса, squid – он же прокси. То есть проксирует (выступает в качестве доверенного) локальную сеть в интернет. )

  17. Вячеслав
    18 марта, 2014 at 22:23
    28

    Доброе время суток! спасибо за статью!
    и не могли бы вы мне помочь!
    у меня не получается кешировать большие файлы.
    не могли бы помочь!?

    cache_dir ufs /var/spool/squid3 4048 32 256
    http_access deny all
    coredump_dir /var/spool/squid3
    cache_mem 1200 MB
    maximum_object_size 61440 KB
    minimum_object_size 2 KB
    memory_pools on
    memory_pools_limit 1000 MB
    reload_into_ims on

    • 20 марта, 2014 at 10:52
      29

      Как вы поняли, что большие файлы не кэшируются?
      И для чего Вам это нужно?

      • Вячеслав
        20 марта, 2014 at 18:24
        30

        Просмотрел access.log ну и по скорости отдачи видно.
        я приведу часть лога.
        где sockso-1.1.8.zip имеет размер 3495938 находится в кеше (TCP_HIT/200)
        а Duplicate%20Cleaner%203.2.3.exe размер 8281441 (TCP_MISS/200) без кеша

        1395324156.617 22 192.168.1.5 TCP_MISS/302 595 GET http://soft.xx/get/2202? - HIER_DIRECT/XX.XX.XX.XX text/html
        1395324162.301 5680 192.168.1.5 TCP_HIT/200 3495938 GET http://d.soft.xx/_new/developing/scripts/sockso-1.1.8.zip - HIER_NONE/- application/zip
        1395324249.519 415 192.168.1.5 TCP_MISS/302 603 GET http://soft.xx/get/6254? - HIER_DIRECT/XX.XX.XX.XX text/html
        1395324271.326 21805 192.168.1.5 TCP_MISS/200 8281441 GET http://d.soft.xx/_new/system/cleaners/Duplicate%20Cleaner%203.2.3.exe - HIER_DIRECT/XX.XX.YY.YY application/octet-stream
        1395324356.911 16 192.168.1.5 TCP_MISS/302 603 GET http://soft.xx/get/6254? - HIER_DIRECT/XX.XX.XX.XX text/html
        1395324371.555 14642 192.168.1.5 TCP_MISS/200 8281441 GET http://d.soft.xx/_new/system/cleaners/Duplicate%20Cleaner%203.2.3.exe - HIER_DIRECT/XX.XX.YY.YY application/octet-stream
        1395324399.572 125 192.168.1.5 TCP_MISS/302 603 GET http://soft.xx/get/6254? - HIER_DIRECT/XX.XX.XX.XX text/html
        1395324412.539 12964 192.168.1.5 TCP_MISS/200 8281441 GET http://d.soft.xx/_new/system/cleaners/Duplicate%20Cleaner%203.2.3.exe - HIER_DIRECT/XX.XX.YY.YY application/octet-stream
        1395324521.605 237 192.168.1.5 TCP_MISS/302 603 GET http://soft.xx/get/6254? - HIER_DIRECT/XX.XX.XX.XX text/html
        1395324535.116 13509 192.168.1.5 TCP_MISS/200 8281441 GET http://d.soft.xx/_new/system/cleaners/Duplicate%20Cleaner%203.2.3.exe - HIER_DIRECT/XX.XX.YY.YY application/octet-stream

        Благодарю за ответ!

        • 26 марта, 2014 at 00:19
          31

          не только от squid зависит, попадет объект в кэш или нет. Можно максимально заставить кэшировать все, что доступно squid, балуясь с опцией
          refresh_pattern http://www.squid-cache.org/Doc/config/refresh_pattern/.
          Для примера, вот тут ( http://www.opennet.ru/openforum/vsluhforumID12/5098.html#4 ) есть интересный пример конфига для кэширования всего.

          • 26 марта, 2014 at 00:20
            32

            но такая конфигурация опасна некорректным отображением страниц.

  18. Romashka
    24 февраля, 2015 at 16:20
    33

    а как по Вашему было бы правильно настроить прокси сервер на 100 мбит канал, пользователей до 1000 и сервер с 32гб оперативки и слабыми сата дисками? отключать дисковый кеш или переводить его в tmpfs и какой баланс соблюдать между кешем в RAM и размером tmpfs?

    • 7 июня, 2015 at 20:05
      34

      Это чисто практический вопрос. В общем, можно ограничиться и tmpfs. Тут необходим мониторинг. Куда пользователи ходят, какой контент качают, какие нагрузки на HDD, если использовать только HDD кэш…

  19. Николай
    26 марта, 2015 at 08:42
    35

    Спасибо! Самая отличная статья) Очень помогла.

  20. wp2
    25 августа, 2015 at 09:19
    36

    У меня канал до 100 мбит/с (если тестировать без прокси). А вот с прокси, еле до 10 мбит/с дотягивает. Не подскажете, какие параметры можно улучшить?

    • 10 октября, 2015 at 14:04
      37

      Думаю, что стоит перенести кэш в RAM.
      А вообще, если кроме того, что вы обнаружили разницу в цифрах, больше проблем нет (например, медленной работы), то не стоит делать тюнинг )

  21. Дмитрий
    7 августа, 2016 at 16:12
    38

    Добрый день.
    Подскажите, могу ли я как то встроить в каждый ответ http\https Кальмара свой код? Чтобы каждая открытая страница в конце показывала Вы используете бесплатный ВаФай такой то. Спасибо.

    • 28 марта, 2017 at 09:11
      39

      Можно использовать директиву редирект на какой-нибудь парсер страниц.
      Но:
      1. это будет работать только по http
      2. это НЕ будет работать на сайтах, использующих авторизацию/куки и др кэширующие технологии
      В целом, идея мне кажется бесполезной.

Написать комментарий