Прокси-сервер 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
На приведенных схемах зелеными стрелками обозначены потоки проксируемого трафика. Движение данных потоков в 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 могут применяться несколько раз (например 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!
Другие материалы в категории Настройка сервера Linux
- SQUID настройка ACL и http_access
- squid, использование опции debug_options или диагностика компонентов squid
- Использование ramdisk в Linux (ramdisk, ramfs, tmpfs) или препарирование рамдисков
- Rsyslog на Debian, настройка сервера сбора логов
- HOWTO SAMBA на 2 интерфейса и 2 сети с разными smb.conf
- SQUID аутентификация (Kerberos и LDAP) на основе доменных групп Active Directory
- squid, настройка delay pools
- Аутентификация и авторизация squid (basic, Digest, NTLM, negotiate)
- Прокси-сервер SQUID, вводный пост
- SSH сервер на Debian
Спасибо: толковая и приятная для чтения статья…. впрочем как всегда
Спасибо за хорошую вводную заметку о 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
Большинство этих параметров в статье есть, а остальные – не сильно критичные для производительности и работы сквида и они есть в переводах squid.conf. А вот кэш в 32 Гб, конечно порадовал. Это, наверно для 10000 пользователей или больше
А в целом – спасибо за предложение.
32 GB = 33554432 KB
Отличная статья так держать. Ваш сайт в избранные.
Здравствуйте Мас’sim.
Интересно было бы узнать ваше мнение об анонимных и искажающих proxy. И особенно, в качестве бонуса, пример настройки.
Заранее спасибо. С уважением к Вам, ваш читатель.
Честно говоря, не приходилось организовывать такие конфигурации. Но если хочется анонимно посидеть в интернете, то могу посоветовать использовать Tor https://www.torproject.org/. Но это не панацея…
Добавил информацию о конфигурации по умолчанию
Спасибо.
Дополнил http_access
В что еще почитать добавил отличную книгу.
Что-то книжку 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: Нет файлов для извлечения
Хм.. Странно. Заменил ссылку на обычный pdf.
Подскажите как полностью отключить кеширование в SQUID 2.7
Думаю, что минимально необходимо добавить строку
cache deny all
Это правило запредяет кэширование для acl c bvtytv all.
Если вообще по джедайски, то необходимо добавить каталог с кэшем и типом null
cache_dir null /tmp
но для этого сквид должен быть собран с параметром
–enable-storeio=null
C интересом читал, но дойдя до
ошибка. Стал читать дальше и наткнулся на
Ощутил позыв к ошибка, но сдержался, потому, что я не граммар-наци.
Читаю дальше и снова натыкаюсь на
.
Снова ошибка.
Спасибо за комментарии. Хотелось бы несколько более адекватно получать замечания )
Автору – респектище! Молодчина!
Не желает ли достопочтенный Max проконсультировать нас еще и относительно RADIUS-аутентификации?
Впрочем, возможно, автор подскажет иное решение по следующей проблеме: все больше пользователей покупают девайсы, которые не могут быть аутентифицированы по Kerberos. Другие схемы либо не вполне безопасны, либо неудобны для применения в больших сетях. В моей сети аутентификация всяческих iPxxx и Samsung проходит через RADIUS (с помощью личного сертификата). Было бы очень полезно рассмотреть здесь и этот тип авторизации клиентов. Спасибо.
Спасибо за отзыв.
Возможно когда-то доберусь до этого (RADIUS), но не обещаю.
В данных случаях я выделял под таких клиентов в отдельную подсеть и по подсети им разрешал доступ.
Спасибо за ответ.
C RADIUS-аутентификацией я разобрался сам – в общем, ничего сложного. Но есть одна проблема: хелпер squid_radius_auth поддерживает только метод PAP. Для проверки сертификатор нужен MS-CHAP v2. Значит, RADIUS не подходит в моем случае. Нет ли у автора соображений по способу проверки подлинности именно с использованием сертификатов – подсети никак не подойдут (слишком много клиентов, их трудно учитывать).
Я с RADIUS только однажды на практике работал в плотную и это было довольно давно. Посему могу задавать не очень корректные вопросы/советы ))
Вижу 2 выхода:
1. разрешить на RADIUS PAP
2. Написать свой хелпер, вот хороший пример на php http://www.freesoftwaremagazine.com/articles/authentication_with_squid
Mc.Sim, огромное спасибо за Ваши статьи. Мануалов понятнее,иформативнее и актуальнее по данной тематике не найти.
Скажите, вы не сталкивались с проблемой отображения имен пользователей на кириллице в файле access.log?
Спасибо за отзыв.
Нет, не сталкивался. Я специально всех пользователей переводил в латиницу, чтобы потом не “приседать” с данной проблемой.
FeanaR, присмотритесь к утилите “free-sa”.
Ссылка, которая может вам пригодиться:
http://sourceforge.net/apps/phpbb/free-sa/viewtopic.php?f=2&t=17
Михаил, спасибо большое, ознакомлюсь.
нужно ли маскарадить мне интерфейс который настроен на сторону интернета для того чтобы вся сеть ходила под одним адресом в интернет. (настроен сквид на сервере на котором выход в нет, прокси не прозрачный)
Нет не нужно, squid же сам ходит от Вашего внешнего адреса, squid – он же прокси. То есть проксирует (выступает в качестве доверенного) локальную сеть в интернет. )
Доброе время суток! спасибо за статью!
и не могли бы вы мне помочь!
у меня не получается кешировать большие файлы.
не могли бы помочь!?
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
Как вы поняли, что большие файлы не кэшируются?
И для чего Вам это нужно?
Просмотрел 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
Благодарю за ответ!
не только от squid зависит, попадет объект в кэш или нет. Можно максимально заставить кэшировать все, что доступно squid, балуясь с опцией
refresh_pattern http://www.squid-cache.org/Doc/config/refresh_pattern/.
Для примера, вот тут ( http://www.opennet.ru/openforum/vsluhforumID12/5098.html#4 ) есть интересный пример конфига для кэширования всего.
но такая конфигурация опасна некорректным отображением страниц.
а как по Вашему было бы правильно настроить прокси сервер на 100 мбит канал, пользователей до 1000 и сервер с 32гб оперативки и слабыми сата дисками? отключать дисковый кеш или переводить его в tmpfs и какой баланс соблюдать между кешем в RAM и размером tmpfs?
Это чисто практический вопрос. В общем, можно ограничиться и tmpfs. Тут необходим мониторинг. Куда пользователи ходят, какой контент качают, какие нагрузки на HDD, если использовать только HDD кэш…
Спасибо! Самая отличная статья) Очень помогла.
У меня канал до 100 мбит/с (если тестировать без прокси). А вот с прокси, еле до 10 мбит/с дотягивает. Не подскажете, какие параметры можно улучшить?
Думаю, что стоит перенести кэш в RAM.
А вообще, если кроме того, что вы обнаружили разницу в цифрах, больше проблем нет (например, медленной работы), то не стоит делать тюнинг )
Добрый день.
Подскажите, могу ли я как то встроить в каждый ответ http\https Кальмара свой код? Чтобы каждая открытая страница в конце показывала Вы используете бесплатный ВаФай такой то. Спасибо.
Можно использовать директиву редирект на какой-нибудь парсер страниц.
Но:
1. это будет работать только по http
2. это НЕ будет работать на сайтах, использующих авторизацию/куки и др кэширующие технологии
В целом, идея мне кажется бесполезной.