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

LXF76:Hardcore Linux1

Материал из Linuxformat
Перейти к: навигация, поиск

Содержание

Squid Настройка прокси-сервера

Пол Хадсон (Paul Hudson) затевает новую серию статей для продвинутых пользователей.

Недавно мучились с головоломной настройкой прокси-сервера? Ну и зря. О нудных проблемах должны заботиться небритые системные администраторы, сутками не вылезающие из офиса и ведрами хлебающие кофе. В данной рубрике мы будем рассказывать о вещах, подобных гоночным болидам: мощных и невероятно сложных. Зато интересных!

Squid — это круто

Вы угадали: Squid — это прокси-сервер. Но почему крутой? Скоро узнаете. У нас, в LinuxFormat, все начинают бесноваться, если какой-нибудь web-сайт открывается дольше наносекунды, переводя наше драгоценное время. При этом мы постоянно скачиваем новые дистрибутивы, так что пробки в канале нас тоже волнуют. Однако ситуация поправима: есть способ сэкономить — сразу! — и время, и полосу пропускания. Имя ему — правильно, Squid. Этот свободный скоростной прокси-сервер кэширует сайты и контролирует права доступа к сетевым ресурсам, а если его хорошенько попросить, то и порядок у вас наведет. В процессе урока вы узнаете, как:

  • базовая установка Squid оптимизирует Интернет-соединение
  • продвинутый Squid защищает детей от гадких сайтов
  • Squid’но подшутить над вашими коллегами

Ну что ж, довольно слов. Начнем, пожалуй!

Кэш в руках

Некоторые дистрибутивы запускают Squid автоматически при загрузке; в других, например, Fedora и SUSE, это нужно делать вручную. Для запуска Squid в Fedora, выполните от лица суперпользователя команду service squid start, а для подключения при загрузке — chkconfig -level 345 squid on. В SUSE, откройте YaST, выберите настройку системных сервисов (System Services) в разделе System (Система), отыщите в списке Squid, и активируйте его, щелкнув по кнопке Enable. Squid стартует, а потом будет сам включаться при загрузке системы. На худой конец, выполните команду /etc/init.d/squid start (или /etc/rc.d/squid start), она запускает Squid в большинстве дистрибутивов.

Мы запустили Squid без всякой настройки, и теперь он работает в фоновом режиме, ожидая HTTP-запросов. Чтобы убедиться, что он действительно работает, настроим-ка браузер на доступ в сеть через прокси.

Если вы используете Firefox, зайдите в Preferences (Настройки) в меню Edit (Правка), щелкните на кнопке Connection Settings (Настройки соединения) и выберите Manual Proxy Configuration (Ручная конфигурация прокси). Укажите в качестве прокси 127.0.0.1, а в качестве порта — 3128. Поставьте «галочку» напротив Use this proxy server for all protocols (Использовать этот прокси для всех протоколов).

Пользователям Konqueror следует зайти в Настройки Konqueror (Settings -> Configure Konqueror), перейти на вкладку Proxy (Прокси), щелкнуть на Manually Specify Proxy Settings (Указать настройки прокси-сервера вручную). В окне настроек введите 127.0.0.1 и 3128.

Теперь откройте окно терминала и выполните следующую команду от лица суперпользователя: tail -f /var/log/Squid/access.log. Да, запуск программ от лица root может быть опасен, однако Squid устанавливает права доступа к своим каталогам так, что читать их могут только пользователь «Squid» (или «proxy», это зависит от дистрибутива) и root. Так что обычным пользователям файлы журналов Squid не прочитать, и никто не догадается, по каким сайтам вы полазили! Откройте браузер и введите какой-нибудь адрес, не спуская глаз с окна терминала tail -f. Если все нормально заработало, там должны мелькать сообщения о том, что запрошенная страница в кэше не обнаружена и Squid получает ее из сети («TCP_MISS/200»).

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

Все для всех

Пока вы не побежали звонить своим друзьям/коллегам и приглашать их срочно опробовать ваш замечательный прокси-сервер, спешу сказать — обождите. По умолчанию Squid блокирует запросы со всех машин, кроме вашей, так что друзья-коллеги получат одни сообщения об ошибках. Чтобы пресечь это, а заодно и дурацкую манеру Squid использовать порт 3128, нужно отредактировать /etc/squid/squid.conf, небольшой конфигурационный файлик на пару тысяч строк кода. Отставить валерьянку! Объясняю: большинство из них — комментарии. Мы обойдемся десятью-пятнадцатью строками (только никому не рассказывайте).

Начнем с HTTP-порта. 3128 — не очень удачное число, сложновато для запоминания. Да и как только выйдет эксплойт для Squid, хакеры именно с этого порта и начнут. Большинство обладателей Squid меняют порт на 80, 1080, 8000 или 8080, это несложно: откройте в любимом редакторе Squid.conf (с правами root) и поищите строку http_port. Скорее всего, первым вхождением будет «TAG: http_port», начало директивы установки порта http_port. Спустившись ниже, вы обнаружите строку «# http_port 3128». # в начале строки обозначает комментарий, то есть данная строка Squid’ом игнорируется (3128-й порт явно устанавливать не нужно, он назначен по умолчанию). Удалите # и вместо 3128 подставьте нужный вам порт, например, 8080. Разумеется, настройку браузера тоже надо скорректировать.

Сохраните файл и запустите команду Squid -k reconfigure (с правами суперпользователя), чтобы Squid перечитал конфигурационный файл. Если вы не ищете легких путей, могу особо предложить другой вариант: kill -SIGHUP `cat /var/run/ squid.pid`. Результат тот же, просто это для любителей забивать гвозди микроскопом.

Уладив проблемы с портом, приступим к открытию доступа к прокси-серверу другим пользователям. Вернитесь в файл squid.conf и поищите в нем строку «acl all». ACL - аббревиатура от «Access Control List»: списки контроля доступа. Доступ, естественно, надо ограничить, чтобы до вас не добрались злые хакеры. По строке «acl all» вы найдете блок из 16-и строк — «рекомендуемая минимальная конфигурация» (оставьте его в покое), потом кое-какие комментарии и, наконец, строки http_access allow localhost (разрешен доступ к прокси-серверу с локальной машины) и http_access deny all (блокировать всех).

Как проще всего открыть доступ к вашему прокси-серверу? Всего-навсего поменять http_access deny all на http_access allow all! После этого сохраните squid.conf и выполните squid -k reconfigure. Теперь к вам может достучаться каждый встречный. Только не оставляйте прокси-сервер в таком состоянии надолго: разве что полные чайники держат прокси-сервер открытым настежь, зато и внушительный счет на оплату «левого» трафика им обеспечен.

Если все заработало (есть контакт с другими машинами), остановите Squid и снова измените правило на http_access deny all. Вы, наверное, удивитесь: чему тут не работать? Дело в том, что мы будем устанавливать гораздо более сложные ACL, и предварительно следует убедиться, что ваш прокси-сервер не блокирован собственным брандмауэром и проблемы могут возникать только у Squid. Кстати, если при «allow all» прокси-сервер не работает, либо выключите брандмауэр (метод грубой силы), либо разрешите на нем использование порта 8080.

Адреса закажет CIDR

Squid позволяет вам ограничить доступ по IP-адресам пользователей, причем вы можете указать точные адреса или задать группу адресов с помощью CIDR-нотации. Начнем с простейшей конфигурации для небольшой локальной сети, когда список адресов (назовем его «internal_network») вводится вручную. Компьютеры, не включенные в список, подключиться к вашему прокси-серверу не смогут. Вставьте в конфигурационный файл перед «http_access deny all» следующие строки:

acl internal_network src 192.168.133.1 192.168.133.2 192.168.133.3 192.168.133.22
http_access allow internal_network

(естественно, вы должны ввести IP-адреса компьютеров вашей локальной сети). Сохраните файл и заставьте Squid его перечитать — Squid -k reconfigure. Теперь убедимся, что «кому доступ, а кому и от ворот поворот»: с любого из перечисленных ip вы должны успешно зайти на сервер, а на попытку зайти с ip-адресов, не указанных в списке, получить сообщение «Access Denied» (Доступ запрещен).

[Прим. переводчика: Squid можно научить сообщать об ошибках на русском языке. Проверьте, есть ли у вас директория /usr/share/Squid/errors/Russian-koi8-r, и не пуста ли она. Если там имеются текстовые файлы, то стоит открыть /etc/Squid/Squid.conf и поменять значение переменной «error_directory» на «/usr/share/Squid/errors/Russian-koi8-r». После перезапуска Squid будет ругаться по-русски.]

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

Кратко поясним: люди привыкли видеть IP-адреса в формате 123.123.123.123. А вот компьютеры работают с т. н. «длинным» IP-адресом, например, 2071690107 — думаете, случайное число? Вы будете смеяться, но это эквивалент 123.123.123.123.

В ip-адресах мы используем, разделяя точками, числа от 0 до 255. Самое малое число в двоичной системе будет выглядеть как 00000000 (0), а самое большое — как 11111111 (255). Компьютер переводит каждый сегмент ip-адреса в двоичную систему счисления и «склеивает» с остальными в одно длинное число. Например, число 123 — это 01111011, значит, адрес 123.123.123.123 преобразуется в 01111011011110110 1111011. В десятичной системе счисления получится как раз 2071690107. Улавливаете связь?

Теперь самая сложная часть. Диапазон ip-адресов в CIDR-нотации (ее еще называют краткой формой записи группы адресов) задается указанием неизменных разрядов и маски. Например, так: 192.168.100.0/24. Это значит, что первые 24 разряда двоичного эквивалента 192.168.100.0 остаются неизменными (это 192.168.100), а последние 8 бит могут меняться (0-255). А если адрес такой: 10.0.0.0/8, то фиксированы только первые 8 разрядов (это как раз первое число — 10), а остальные числа могут меняться. То есть вместо того, чтобы перечислять в конфигурационном файле все адреса от 192.168.0.1 до 192.168.0.255, мы можем указать их в краткой форме: 192.168.0.0/24.

Надеюсь, теорию вы усвоили. Продолжим настройку Squid:

acl internal_network src 192.168.132.0/24 192.168.133.0/24 192.168.134.10
http_access allow internal_network

Тут мы указали две группы адресов в CIDR-нотации (192.168.132.1-255 и 192.168.133.1-255) и еще один ip-адрес в обычном виде (192.168.134.10). Убедитесь, что правило «deny all» стоит после этих строк.

Детишки под контролем

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

Во-первых, можно просто перекрыть доступ к Интернету в определенное время дня — это будет хорошим стимулом сделать, наконец, домашнее задание (сообразительный малютка все равно откопает игру «Сапер», но тут уж ваша вина: нечего было использовать Windows в учебном процессе). Ограничение по времени устанавливается в ACL типа «time», только укажите день недели и временной промежуток. Дни недели обозначаются буквами: M — понедельник, T — вторник, W — среда, H — четверг, F — пятница, A — суббота, S — воскресенье; комбинация MTWHF (рабочие дни) — D. Так, для того, чтобы создать ACL для периода с Воскресенья по Четверг с 19:00 до 20:00, вставьте в Squid.conf такую строку:

acl homework_time time SMTWH 19:00-20:00

Раньше мы использовали ACL только для ограничения по ip-адресам. Теперь к ним добавятся ограничения по времени. Разграничим адреса детей (kids) и взрослых (adult):

acl kids_computers src 192.168.133.3 192.168.133.4 192.168.133.5
acl adult_computers src 192.168.133.0/24

Адреса взрослых расположены в диапазоне 192.168.133.1-255, но три адреса, хотя и входят в этот диапазон, в списке адресов взрослых не числятся, потому что раньше были указаны в другом списке — kids_computers. Создадим правила доступа для них:

http_access deny kids_computers homework_time
http_access allow kids_computers
http_access allow adult_computers

Второе и третье правила очевидны, однако в первом можно увидеть два параметра: kids_computers и homework_time. Squid работает с правилами в том порядке, в каком вы их записали. То есть в данном случае, он при попытке соединения смотрит на первое правило — если компьютер принадлежит списку kids_computers и текущее время входит во временной промежуток homework_time, то он сразу запрещает соединение и отправляется на заслуженный отдых. При несоблюдении хотя бы одного из указанных условий он переходит к разборке следующего правила, и так далее. Короче, соединение либо его запрет устанавливается на основании первой найденной строки, для которой выполняются все условия. Если список начинается с «accept all», то ни до каких дальнейших ограничений дело не дойдет. Главное — понять этот принцип и соблюдать правильный порядок (прокрутите свои правила в уме).

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

Анализу подлежат три объекта: сомнительные сайты, о которых вы знаете, сомнительные сайты, о которых вы не знаете, и файлы, которые могут нагадить приютившему их компьютеру.

Для первого случая (запрет конкретного ресурса) предусмотрена директива dstdomain. Вот пример ее использования:

acl banned_sites dstdomain bbc.co.uk
http_access deny kids_computers homework_time
http_access deny kids_computers banned_sites
http_access allow kids_computers

Мы запретили детям посещать любые сайты во время выполнения домашнего задания и bbc.co.uk в любое время. Причем в список запрещенных сайтов не попадают, например, news.bbc.co.uk и www.bbc.co.uk. Для того, чтобы запретить все ресурсы домена bbc.co.uk, нужно добавить перед ним точку: .bbc.co.uk.

Неизвестные вам сайты, не предназначенные для малолеток, вычисляются по употреблению нехороших слов, например «sex», «porno», «freeipod». Конечно, всех не перевешаешь, но мы можем воспользоваться регулярными выражениями:

acl noporno url_regex -i porno

Параметр -i означает, что регулярное выражение не различает строчных и заглавных букв (то есть включает Porno, PORNO, PoRNo и т. д.). Теперь блокируем все сомнительные сайты:

acl nosex url_regex -i sex
acl nofreeipod url_regex -i freeipod
acl noporno url_regex -i porno

Наконец, хорошо бы запретить детишкам скачивать подозрительные файлы. В регулярных выражениях можно использовать знаки «^» и «$», означающие начало и конец строки соответственно. Так, для того, чтобы заблокировать скачивание исполняемых файлов для Windows (с расширением exe), следует добавить что-то вроде этого:

acl noexe $ url_regex -i exe$

Знак доллара означает конец строки URL, так что сайт www.hexen.com не вызовет никаких подозрений у Squid, а вот http://evilsite.com/virus.exe будет заблокирован.


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