Журнал LinuxFormat - перейти на главную

LXF123:Proxy

Материал из Linuxformat
Версия от 13:41, 17 сентября 2010; Crazy Rebel (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
Сети Свяжем ваши Linux-ПК, и пускай они вас обслуживают

Содержание

Squid: Поднимем прокси-сервер

Часть 8: Хотите, чтобы web-серфинг стал быстрее и безопаснее? Нейл Ботвик покажет, как достичь этого, а заодно уменьшить потребление трафика!

Большая часть содержимого web-страницы в вашем браузере не менялась с прошлого просмотра. Да, слова могут быть другими, но картинки, особенно логотипы и кнопки, остаются теми же. Браузер кэширует эти данные, и они не загружаются каждый раз заново, но что если другой пользователь вашей сети заходит на тот же самый сайт или у вас несколько компьютеров? Даже переключение на другой браузер отбирает часть отнюдь не безграничной ширины канала.

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

Может, вы уже и пользуетесь прокси-сервером – большинство провайдеров применяют их для экономии трафика, нередко реализуя так называемый «прозрачный» [правильнее сказать – перехватывающий, – прим. ред.] режим, когда трафик принудительно направляется через прокси-сервер, даже если вы не указали этого в настройках браузера.

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

Самый популярный прокси-сервер с открытым исходным кодом – это Squid (http://www.squid-cache.org), поэтому начнем с его настройки, а потом более подробно познакомимся с проксированием и фильтрацией.

Web через прокси

После установки Squid через менеджер пакетов вы можете захотеть изменить пару опций в его конфигурационном файле /etc/squid/squid.conf. В нем почти пять тысяч строк – это настоящий монстр. Но большинство строк – комментарии, описывающие опции, и многие параметры можно оставить без изменения; зато видно, сколько всего можно подрегулировать. Из-за потенциальной сложности индивидуальной настройки лучше всего держаться поближе к варианту по умолчанию и менять отдельные опции постепенно, сохраняя резервные копии файлов работающих конфигураций, чтобы при необходимости в любой момент откатиться к ним (подробности ищите в статье о Git для /etc в LXF121).

Установки по умолчанию – идеальная стартовая точка, и теоретически с ними все должно сразу заработать. После установки Squid запустите его из менеджера служб вашего дистрибутива и расскажите о нем своему браузеру. Установите адрес прокси-сервера в доменное имя или IP-адрес компьютера, на котором запущен Squid (или в localhost, если это ваша локальная машина), а номер порта – в 3128 (вариант Squid по умолчанию). Squid прячет кэшированные файлы в каталоге /var/cache/squid/ – следующая команда покажет, сколько дисковой памяти он сейчас использует (пока не очень много, ибо вы еще ничего не поместили в кэш):

du -sh /var/cache/squid/

Теперь откройте несколько сайтов и снова выполните команду. Вы должны увидеть, что используется больше места, то есть Squid закэшировал текст и картинки для только что просмотренных страниц.

Итак, прокси-сервер запущен; зададим необходимые настройки в ПО, которое с ним работает. Для начала сделайте это во всех браузерах. Впрочем, браузеры – не единственные программы, загружающие данные по HTTP или FTP (Squid обрабатывает и FTP-запросы): менеджеры пакетов тоже качают немало, и если на нескольких компьютерах установлен один и тот же дистрибутив, то одни и те же пакеты будут загружаться снова и снова, что, конечно, нежелательно. В некоторых менеджерах пакетов, например, Synaptic, можно задать прокси-сервер в настройках, но также можно установить переменные окружения, используемые большинством утилит командной строки (а все графические менеджеры пакетов полагаются на эти утилиты). Нужно установить значения двух переменных http_proxy и ftp_proxy (имена в нижнем регистре) в http://ваш.прокси.сервер:3128. Как это сделать, зависит от дистрибутива. В некоторых системах есть соответствующая опция в параметрах сети, в других нужно добавить пару строк в файл /etc/profile.d:

export http_proxy=http://your.proxy.server:3128
 export ftp_proxy=http://your.proxy.server:3128

Тонкая настройка

Ну вот, Squid работает, и можно подкрутить еще кое-что. Основные опции, которые нужно проверить – это http_port (номер порта, который слушает Squid; по умолчанию 3128) и cache_dir (каталог, где Squid будет хранить кэшированные данные). Последний параметр также определяет тип хранилища и максимальный размер. По умолчанию это:

cache_dir ufs /var/cache/
squid 100 16 256

что означает стандартный метод хранения (ufs) в каталоге /var/cache/squid с максимальным размером в 100 МБ. Максимальный размер должен быть несколько меньше объема доступного места, чтобы избежать фрагментации файловой системы. Однако чрезмерно большой кэш может оказаться медленным, и при этом хранить такие старые файлы, которые уже никогда не будут востребованы повторно.


Остальные два числа – количество каталогов и подкаталогов, используемых для хранения данных – лучше оставить как есть. Существуют и другие типы хранилищ, но они опять же для более продвинутого использования. Например, diskd более эффективен, когда объем трафика большой, но работает медленнее, когда трафик умеренный. Также нужно установить в cache_mgr адрес электронной почты, куда будут отправляться сообщения о серьезных ошибках.

Кэш Squid также можно установить перед сервером или кластером серверов, снизив их загрузку и увеличив производительность, но это выходит за рамки наших четырех страниц.

Кто идет куда?

Прокси-серверы – мишень для неавторизованного использования. Если доступ на некий сайт блокирован брандмауэром (например, в компании, не желающей истратить весь свой месячный трафик на YouTube), пользователи могут попытаться найти открытый прокси-сервер, подключиться к нему и получить доступ к заблокированным сайтам. Предотвратить это можно двумя способами. Простейший – запретить доступ к прокси-серверу с любого компьютера вне локальной сети, закрыв порт 3128 на маршрутизаторе. Альтернативы – различные схемы аутентификации. Самая простая из них использует файл такого же формата, как .htpasswd в Apache, и добавить пользователей в него можно командой htpasswd:

htpasswd /etc/squid/passwd username

При первом запуске добавьте ключ -c, чтобы создать файл. После этого не указывайте -c снова, а то удалите существующие записи. Теперь добавьте в файл squid.conf следующие строки:

auth_param basic program /usr/libexec/ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

Они велят Squid запускать названную программу для аутентификации (/usr/libexec/ncsa_auth включена в Squid, хотя путь в вашем дистрибутиве может слегка отличаться) и разрешают поддерживать до пяти процессов (все остальные попытки аутентификации будут ждать своей очереди). Параметр realm – просто сообщение, выдаваемое Squid при запросе пароля, а последняя опция устанавливает период, в течение которого действительна сессия (время жизни). Если пользователям неохота каждый раз вводить имя и пароль, можно занести их в настройки прокси в браузере или в переменную окружения http_proxy в стандартном формате URL:

http://username:password@my.proxy.com:3128

Здесь мы лишь устанавливаем метод аутентификации. Мы еще не требуем ни от кого войти в систему, за это отвечает секция ACL (Access Control List – список контроля доступа) файла squid.conf. Списки задаются с помощью ключевого слова acl, например:

acl lan src 192.168.0.0/24
acl users proxy_auth user1 user2
acl allusers proxy_auth REQUIRED

Каждая строка определяет правило ACL (второе слово задает имя правила, а последующие описывают его суть). Первое правило отвечает любому запросу, приходящему из сети 192.168.0.0/24, так что любой компьютер локальной сети будет ему соответствовать. Вторая строка соответствует заданным пользователям, при условии, что они ввели пароль и прошли аутентификацию в соответствии с auth_param. Третья строка похожа на вторую, за исключением опции REQUIRED, которая означает соответствие любому действительному пользователю. Теперь используем директиву http_access, чтобы применить эти правила.

http_access allow lan
http_access allow users
http_access deny all

Это разрешает доступ пользователям из списков lan или users и запрещает всем остальным. Таким образом, вы можете подключаться по локальной сети без пароля или извне с указанием пароля – все остальные не могут. Если запрос не соответствует ни одному из правил доступа, он считается соответствующим самому последнему из них, поэтому в общем случае лучше делать его правилом deny. Если это deny all, то никаких сомнений не остается, потому что он соответствует любому запросу, который забирается так далеко. Правила рассматриваются по порядку, и применяется первое совпадение, поэтому правило lan должно предшествовать users, иначе у пользователей локальной сети все равно будет запрашиваться пароль.

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

Squid может работать в прозрачном режиме, хотя тогда в аутентификации смысла нет. Это позволяет избежать необходимости ввода настроек прокси в браузере; все запросы будут восприняты и отправлены через него, несмотря ни на что. Для этого компьютер со Squid должен быть также и интернет-шлюзом, чтобы все запросы гарантированно проходили через него. Затем измените http_port в squid.conf на

http_port 80 transparent

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

Кто идет когда?

Мы рассмотрели далеко не все возможности списков ACL. В частности, они позволяют фильтровать запросы по различным критериям. Одна из интересных возможностей – правила со временем действия. Если вы не хотите ликвидировать доступ к сайтам социальных сетей полностью, а просто желаете, чтобы они не мешали работе, можно задать правила, блокирующие доступ к ним в рабочие часы, но не во время обеда или когда ребенок уже выполнил домашнее задание.

acl manager proxy_auth me
acl lunchtime time MTWHF 12:30-1:30
acl weekend time SA
acl social_networks dstdomain .facebook.com .twitter.com
http_access allow me
http_access deny social_networks !lunchtime !weekend
http_access allow lan
http_access deny all

Первая строка acl задает пользователя, который может обойти эти ограничения – вовсе не смешно самому оказаться за бортом, заблокировав заодно и себя. Следующие два правила определяют периоды времени, а последний acl содержит список доменов, доступ к которым будет блокироваться вне данных периодов. Первая строка access разрешает вам делать то, что вы хотите, тогда как в следующей строке несколько списков acl определяются в одном правиле доступа. В таком случае для срабатывания правила необходимо совпадение со всеми списками сразу. ! изменяет смысл запрета на противоположный, так что эта строка блокирует доступ к социальным сетям, если время не обеденное и день не выходной. Наконец, как и прежде, мы разрешаем доступ всем пользователям локальной сети и запрещаем всем остальным. Конечно, это простейшая настройка, но ее можно улучшить, добавив другие строки acl и http_access.

С приумножением правил конфигурационный файл станет неповоротливым. Есть несколько способов разбить его на части. В качестве аргумента правила acl могут принимать имя файла, содержащего параметры по одному в каждой строке. Поэтому строку social_networks можно заменить на

acl social_networks dstdomain /etc/squid/social_networks.acl

где указанный файл содержит строки

.facebook.com
.twitter.com
.thenextfad.com

Внутри squid.conf можно пользоваться директивой include, поэтому все правила acl можно поместить в отдельный файл и добавить строку

include /etc/squid/acl.conf

в squid.conf. Чтобы вы ни делали, тщательно комментируйте свои действия, иначе, заглянув в правила через полгода, вы едва ли поймете, что имели в виду.

Требования к серверу

Два основных критерия при оценке ресурсов, которые нужно выделить прокси-серверу – число запросов, которые он будет обрабатывать, и объем работы на каждый запрос. Обслуживать домашнюю сеть с несколькими пользователями и простейшим кэшированием способен и старый, маломощный компьютер, а для сети компании с большим количеством пользователей и фильтрацией, естественно, потребуется больше. Производительность процессора – не главное требование: важнее объем оперативной памяти и производительность диска, а также и отношение объема ОЗУ к объему жесткого диска. Чем больше каталог кэша, тем больше места потребуется для дисковых буферов, чтобы не уронить производительность.

Люди Squid (нет, это не персонажи второсортного фильма из 1950-х) рекомендуют сверх требований ОС иметь 32 МБ свободной памяти на каждый ГБ кэша. Понятно, что понадобится приличная сетевая скорость с не менее чем гигабитным соединением всех сетей, кроме самых маленьких.

Фильтрация содержимого

Squid умеет вызывать из своего конфигурационного файла другие программы – мы уже видели такой пример с аутентификацией, вызывающей программу /usr/libexec/ncsa_auth. Это означает, что к Squid можно прицепить различные средства фильтрации и блокировать доступ к нежелательному содержимому. Альтернативный подход – заставить программу фильтрации обращаться к Squid. Так работает DansGuardian (http://dansguardian.org). DansGuardian блокирует доступ различными способами, включающими черный список URL-адресов и доменов и фильтр содержимого. Последний анализирует содержимое web-страницы, прежде чем решить, передавать ее или нет. В этом отношении он похож на спам-фильтр. У обоих методов есть преимущества и недостатки, а их сочетание обеспечивает надежную защиту.

Установите DansGuardian обычным способом (из менеджера пакетов дистрибутива); значения по умолчанию в его конфигурационном файле /etc/dansguardian/dansguardian.conf весьма разумны. Возможно, они покажутся вам чересчур ограничивающими, но файл хорошо закомментирован, и нетрудно сообразить, как расширить доступ. Самые важные строки в нем –

filterip =
filterport = 8080
proxyip = 127.0.0.1
proxyport = 3128
language = ‘russian’
contentscanner = ‘/etc/dansguardian/contentscanners/clamdscan.conf’


Первая задает IP-адрес, на котором работать DansGuardian; оставьте его пустым, чтобы слушать на всех сетевых интерфейсах. Чтобы определить более одного адреса, указывайте каждый новый на отдельной строке со своим filterip. Параметр filterport – порт, который прослушивает DansGuardian. Следующие две строки – это IP-адрес и порт сервера Squid, откуда ясно, что DansGuardian и Squid могут работать на отдельных компьютерах, хотя это увеличивает сетевой трафик. Параметр language задает язык, используемый на web-странице, возвращаемой DansGuardian как оповещение о блокировке запрошенного документа.

Последняя строка – установка по умолчанию, но не исключено, что вам захочется ее закомментировать. Она велит DansGuardian прогонять каждый объект через ClamAV для проверки на вирусы, но вот беда: перед передачей ClamAV файл нужно загрузить полностью, а это исключает потоковую передачу данных. Удовлетворившись настройкой, запустите программу с помощью менеджера сервисов дистрибутива и настройте ее старт при загрузке системы.

Вам также потребуется изменить настройки прокси в браузерах, так как теперь запросы должны приходить на порт 8080, откуда они будут перенаправлены к Squid на порт 3128. Если вы уже настроили несколько компьютеров на использование Squid на порту 3128, быстрое и простое решение – изменить порт Squid на что-то другое. Укажите это в dansguardian.conf и заставьте DansGuardian слушать порт 3128. Номера портов не являются неприкосновенными, хотя для прокси обычно используются эти два.

Если к DansGuardian или к Squid подключиться не удается, сначала загляните в файл системного журнала на сервере. Например, с некоторыми настройками ядра DansGuardian может выдать ошибку «Failed to get client’s original destination IP» («Не могу получить исходный IP-адрес клиента»); тогда нужно установить параметр originalip=off в dansguardian.conf.

Теперь у вас должен быть рабочий прокси-сервер, который разгрузит канал, ускорит просмотр сайтов и позволит вам указывать, кому, когда и куда ходить. И в Squid, и в DansGuardian есть масса возможностей, которых мы не коснулись, и подробную информацию о том, как еще подправить их густо закомментированные файлы конфигурации, можно найти в разделе документации соответствующих сайтов. LXF

Персональные инструменты
купить
подписаться
Яндекс.Метрика