Лабораторные работы по ПО/Настройка Proxy-сервера Squid

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску

Прокси-сервер (от англ. proxy — «представитель, уполномоченный») — служба в компьютерных сетях, позволяющая клиентам выполнять косвенные запросы к другим серверам. Сначала клиент подключается к прокси-серверу и запрашивает какой-либо ресурс (например, web-страницу), расположенный на другом сервере. Затем прокси-сервер либо подключается к указанному серверу и получает ресурс, либо возвращает ресурс из собственного кэша.

Основные задачи, решаемые с помощью proxy-сервера:

  • Кэширование данных, проходящих через основной сервер сети (это единственный способ кэширования информации)
  • Блокировка доступа к нежелательным web-сайтам или нежелаемому контенту (это единственный способ блокировки информации по типу данных или по содержимому)
  • Поточная проверка данных, передаваемых в сеть, на вирусы (единственный способ)
  • Изменение содержания передаваемой клиенту информации (например, блокировка рекламы, подмена на свой логотип)

Существует большое количество реализаций системы проксирования (3proxy, usergate, kerio и др.). Мы будем рассматривать самый распространенный в Internet прокси-сервер Squid.

Установка Squid

Как и другие программы в пакетных дистрибутивах Linux, squid устанавливается с помощью пакетного менеджера из репозитория.

Вам нужно проверить подключен ли репозиторий и дать команду обновить список доступных пакетов:

sudo aptitude update

Далее, даем команду для установки прокси-сервера squid

sudo aptitude install squid

Базовая настройка Squid

Для правильной работы proxy-сервера Squid вам понадобится сделать базовые настройки в файле /etc/squid/squid.conf

sudo nano /etc/squid/squid.conf


Вам нужно найти и проверить следующие параметры:

Порт, по которому будет доступен ваш proxy-сервер

http_port 3128


Адрес DNS сервера (сервера преобразования имен). В некоторых случая полезно указать этот параметр прямо в конфигурационном фале.

dns_nameservers 192.168.10.1


Имя вашего proxy-сервера, которое будет отображаться в сообщениях об ошибках

visible_hostname http-proxy


Сделав эти настройки перезапустите ваш proxy-сервер:

sudo /etc/init.d/squid restart
sudo squid -k reconfigure (под ubuntu 10.10)

Проверка работоспособности установленного proxy-сервера

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

FireFox proxy configuration.jpg

В нашем случае web-браузером будет FireFox.

  • Откройте меню Правка -> Настройки
  • Перейдите в раздел Дополнительно
  • Закладка Сеть
  • Нажмите кнопку Настроить
  • В появившемся окне укажите "Использовать Proxy-сервер"
  • Введите ip адрес вашего proxy-сервера и укажите порт, который вы указывали в параметре http_port при настройке squid


Теперь попробуйте ввести любой интернет адрес и посмотрите на результат.

Если вы получаете ответ от Proxy-сервера типа:

  • Access Denied - настроки вашего прокси запрещают доступ с вашего рабочего компьютера к ресурсам интернет
  • Can not retrieve address - проверьте параметр dns_nameservers
  • Cannot access site - существует проблема на сегменте подключения вашего proxy-сервера к интернет


При появлении предупреждения о запрете доступа ("access denied") сного вернуться к настройке вашего proxy-сервера squid

sudo nano /etc/squid/squid.conf

Доступ к Internet-ресурсам в proxy-сервере squid организуется через ACL листы. Описание правил доступа похоже не программирование:

1. Вы описываете переменную и присваиваете ей значение

acl NET155 src 192.168.155.0/255.255.255.0

2. Далее, вы описываете правила доступа к ресурсам Internet для этой переменной

http_access allow NET155

Все правила добавляются перед (до) параметра запрещения доступа

http_access deny all

Все правила доступа проверябтся последовательно и если вы уберете строку http_access deny all либо добавите правила разрешения после нее - ваш proxy-сервер будет работать не так, как вы запланировали.

Запретить доступ к определенному сайту

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

Попытка блокировки доступа к сайту средствами iptables приведет к необходимости выяснения всех ip-адресов соответствующих доменному имени блокируемого сайта (firewall работают на сетевом уровне стека протокола TCP/IP и не имеют доступа к адресам сайтов внутри IP пакетов).

Нашей задачей будет заблокировать доступ к сайту linux.org.ru.

Как было упомянуто ранее, все правила Squid начинаются с acl записи описания переменной. Опишем переменную для адреса блокируемого сайта.

acl  BlockSite  dstdomain  .linux.org.ru 

Здесь:

  • BlockSite - имя "переменно", которое мы будет использовать в дальнейшем в правилах запрещения либо разрешения доступа. Имя переменной выбирается по вашему выбору. Учитывайте, лишь что регистр букв важен (большие и малые буквы различаются).
  • dstdomain - тип "переменной", в данном случае - имя домена. Существуют так же типы: dst - ip-адрес; url_regex - список адресов сайтов с регулярными выражениями и т.д.
  • .linux.org.ru - адрес того сайта, к которому блокируем доступ. Точка в начале означает что доступ будет блокироваться и к www.linux.org.ru и к www1.linux.org.ru и к ftp.linux.org.ru и т.д.

Описав "переменную" с адресом сайта мы можем добавить правило для блокировки.

http_access   deny   all   BlockSite

Здесь:

  • deny - тип действия, в данном случае запрет доступа. allow - разрешение доступа.
  • all - кому запрещать доступ. Если вы поищите в конфигурационном файле /etc/squid/squid.conf по строке "acl all" то найдете строку "acl all src 192.168.0.0/16". Переменная all символизирует весь диапазон IP-адресов
  • BlockSite - куда запретить доступ компьютерам из списка "all". В нашем случае, на сайт .linux.org.ru

В конфигурационный файл /etc/squid/squid.conf, после окончания существующих acl записей, нужно добавить следующие строки:

sudo nano /etc/squid/squid.conf
...
acl  BlockSite  dstdomain  .linux.org.ru .lug.nnov.ru
http_access   deny   all   BlockSite

После этого сохраните файл и перезапустите Squid

/etc/init.d/squid restart

Теперь в настроенном web-браузере на вашем компьютере введите адрес linux.org.ru и посмотрите на результат.

Если все настроено верно то при просмотре файла /var/log/squid/access.log вы увидите что то вроде:

tail /var/log/squid/access.log
...
271423496.478      0 192.168.1.60 TCP_HIT/200 10584 GET http://css.yandex.net/css/search/f9/_search.css - NONE/- text/css
1271423496.501     20 192.168.1.60 TCP_HIT/200 28915 GET http://css.yandex.net/css/search/f9/_search.js - NONE/- application/x-javascript
1271423496.543      0 192.168.1.60 TCP_HIT/200 1849 GET http://lego.static.yandex.net/2.1/common/block/b-head-logo/b-head-logo.png - NONE/- image/png
1271423496.673      0 192.168.1.60 TCP_HIT/200 834 GET http://suggest.yandex.ru/jquery.crossframeajax.html - NONE/- text/html
1271423496.696    107 192.168.1.60 TCP_MISS/200 567 GET http://www.tns-counter.ru/V13a****yandex_ru/ru/CP1251/tmsec=yandex_serp/0 - DIRECT/217.73.200.169  image/gif
1271423496.720    108 192.168.1.60 TCP_MISS/302 352 GET http://kiks.yandex.ru/su/ - DIRECT/77.88.21.143 -
1271423496.734    118 192.168.1.60 TCP_MISS/200 532 GET http://mc.yandex.ru/watch/731962 - DIRECT/77.88.21.90 image/gif
1271423496.743      8 192.168.1.60 TCP_HIT/200 2026 GET http://kiks.yandex.ru/system/fc06.html - NONE/- text/html
1271423496.767     23 192.168.1.60 TCP_HIT/200 1834 GET http://kiks.yandex.ru/system/fc06.swf - NONE/- application/x-shockwave-flash

По логу видно:

  • с какого IP был запрос на доступ к сайту
  • какой ответ был получен при операции (TCP_HIT/200 - код 200 - все нормально)
  • объем трафика при доступе к сайту
  • к какому сайту было обращение

Если вы видите строку

1271423496.734    118 192.168.1.60 TCP_MISS/200 532 GET http://linux.org.ru - DIRECT/217.76.32.61 text/html

Это значит что все отлично работает.

Запретить доступ к Internet для определенного компьютера вашей локальной сети

Сразу после установки Squid настроен по принципу "запрещено все, что не разрешено". В правилах доступа присутствует только:

acl all src 0.0.0.0/0.0.0.0 
...
http_access deny all

Что означает запрет доступа к интернет через Squid для всех IP.

При настройке Squid вам следует придерживаться принципа "запрещено все что не разрешено" и добавлять разрешение на доступ в Internet лишь для определенных компьютеров либо диапазонов IP-адресов.

В начале лабораторной работы мы разрешили доступ к интернет для компьютеров из подсети 192.168.155.0/24. Давайте запретим доступ к сайту linux.org.ru с компьютера 192.168.155.5 (используйте ip вашего компьютера).

acl  BlockSite  dstdomain  .linux.org.ru 
acl  Host-155.5 src 192.168.155.5
....
http_access deny Host-155.5 BlockSite

Проверка работы правил

  • Попробуйте зайти на сайт linux.org.ru с вашего компьютера и проверить работу блокировки
  • Попробуйте зайти на yandex.ru и проверить что сайты, отличные от linux.org.ru, доступны с вашего компьютера.

Запретить загрузки файлов определенного типа

Для выполнения этой задачи нам нужно будет познакомиться с основами Регулярных Выражений (Regular Expressions, RegExp).

Т.к. squid работает с URL в запросах с вашего компьютера, нам потребуется составить правила с выражениями, которые будут соотвествтовать только URL с именами файлов интересующего нас типа. И не будут соответствовать другим.

Элементы регулярных выражений (RegExp)

  • Символ ^ символизирует начало строки. ^http://* будет означать все URL, начинающиеся на http://
  • Символ * означает любое количество символов.
  • Символ $ символизирует конец строки. *\.avi$ будет соответствовать всем путям, заканчивающимся на ".avi".
  • Символ \ разделяет блоки в строке. Если вы хотите наложить строкое правило, на присутствие двух характерных последовательностей символов с троке, то вам следует это сделать так: sex.*\.avi$ Это выражение будет соответствовать всем путям, заканчивающимся на .avi и содержащих в пути слово sex.


Для использования регулярных выражений при описании переменной вам следует указать ее тип urlpath_regex.

Параметр -i определяет НЕ чувствительность выражений к синтаксису. Буква m будет соответствовать и M и m в пути.


Составим правила для блокировки всех .mp3 и .avi файлов:

1. Опишем переменную с выражениями, соответствующими URL с именами mp3 и avi файлов:

acl media urlpath_regex -i \.mp3$ \.avi$

2. Опишем сеть NET155 (если она еще не описана)

acl NET155 src 192.168.155.0/255.255.255.0

3. Создадим правило запрета скачивания mp3 и avi файлов для сети NET155

http_access deny media NET155

4. Перезапустим squid для применения правила

sudo /etc/init.d/squid restart

проверяем корректность работы правил

Выполнить блокировку рекламных банеров

Блокировка рекламных банеров с помощью proxy-сервера squid производится на основе списков (текстовых файлов). Squid поддерживает различные типы списков. Мы с вами будем использовать два из них:

  • Тип списка url_regex - в этом типе списков задаются образцы адресов сайтов, которые будут блокироваться (часть полного адреса между http:// и до первого /)
  • Тип списка urlpath_regex - в этом типе списков задаются образцы имен файлов, которые будут блокироваться (часть полного адреса, после первого /)


1. Создадим файл со списком образцов адресов сайтов, на которых обычно размещают рекламные банеры:

nano /etc/squid/bad_url

 ^http://.*doubleclick 
 ^http://.*-ad.flycast.com/server/img/ 
 ^http://1000.stars.ru/cgi-bin/1000.cgi 
 ^http://1000.stars.ru/cgi-bin/1000.cgi 
 ^http://12.16.1.10/~web_ani/ 

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

2. Создадим второй файл со списками образцов имен файлов (банерных картинок) которые в дальнейшем будем блокировать:

nano /etc/squid/bad_url_path

 88x31.*gif
 88x31.*GIF
 100x80.*gif
 100x80.*GIF 
 100x100.*gif
 100x100.*GIF
 120x60.*gif

В этом списке содержатся образцы имен файлов, загрузка которых будет блокироваться. Любые изображения, в именах которых встретиться 88x31 и расширение их будет gif будут заблокированы.

3. Создадим третий пустой файл, в который будем добавлять исключения для "хороших" сайтов, которые будут подпадать под созданные нами выше образцы.

nano /etc/squid/good_url

Оставляем его пустым и сохраняем.

4. Создав эти файлы мы можем приступать к добавлению правил блокировки интернет-контента на основе данных из этих списков. Откроем на редактирование конфигурационный файл squid'а и добавим туда нужные правила:

nano /etc/squid/squid.conf

Находим секцию, где уже описаны acl записи для других правил и добавим туда следующие строки

acl good_url url_regex "/etc/squid/good_url" 
acl bad_urlpath urlpath_regex "/etc/squid/bad_urlpath" 
acl bad_url url_regex "/etc/squid/bad_url" 

Этими записями мы описали 3 "переменных" good_url, bad_urlpath и bad_url и поставили им в соответствие содержимое соответствующих файлов. Теперь, при загрузке squid будет перечитывать содержимое этих файлов и вносить данные из них в эти "переменные".

После описания мы можем использовать эти "переменные" в правилах блокировки интернет-контента

Ищем ниже по содержимому конфигурационного файла squid секцию, где описываются http_access правила и добавляем в конец уже имеющихся но до правила http_access deny all наши правила блокировки рекламных банеров.

http_access deny bad_urlpath !good_url 
http_access deny bad_url !good_url

Первым правилом мы заблокировали весь интернет-контент, в именах файлов которого содержаться образцы их списка bad_url_path и имен этих файлов нет в списке исключений good_url. Т.е. если адрес сайта, с которого производится загрузка "запрещенного" контента, есть в списке "хороших" сайтов good_url, то пользователь получит и увидит эти файлы. По аналогии работает и второе правило. Оно блокирует контент по второму списку.

5. Проверка. После выполнения настроек перезапустите squid и проверьте, работает ли блокировка банеров.

Для проверки, зайдите на сайт http://nn.ru и проверьте, происходит ли блокировка рекламных банеров

дополнение

Данный подход позволяет снизить нагрузку на Internet-канал организации. Пользователи не прокачивают блокируемый объем рекламы.

Обеспечить работу приложений через PROXY-сервер SQUID (ICQ)

Ограничить скорость доступа

Для ограничения скорости доступа к интернет-контенту в squid существует система Пулов (pool).

Существует три вида пулов для ограничения скорости доступа различным способом:

  1. тип пулов позволяет указать лимит скорости для всей подсети. Указанная скорость делится равномерно между всеми активными компьютерами из данной подсети
  2. тип пула позволяет указать отдельно ограничение для всей подсети целиком и для каждого компьютера из этой подсети по отдельности. Т.е. отдельный компьютер не получит скорость больше указанного первонального лимита. Но в то же время, если все компьютеры из подсети начнут закачку одновременно они не превысят скорости выделенной для подсети целиком.
  3. тип пула позволяет указать по отдельности максимальную скорость для всей сати, максимальную скорость для одной подсети и для каждого компьютера в ней. Т.е. мы получаем три отдельных параметра.

Есть еще одна особенность указания параметров скорости при использовании системы пулов в squid. Скорость указывается двумя параметрами, например 1000/4000:

  • 4000 - определяет максимальную скорость загрузки в килобайтах в секунду
  • 1000 - определяет количество килобайт, после которого начинается применение данного ограничения

Для чего это может быть нужно?

Вы хотите что бы пользователи получали текстовую информацию с сайтов быстро и могли начать читать содержимое. И пока пользователь читает основную информацию картинки успеют загрузиться с пониженной скоростью. За счет этого другие пользователи сети так же могут увидеть текстовое содержимое сайта очень быстро.


В "Запрете загрузки файлов определенного типа" мы создали acl запись для сети NET155. Используем эту "переменную" для ограничения скорости доступа в интернет для всех компьютеров из этой сети.

1. Откройте файл /etc/squid.conf и проверьте есть ли в нем запись

http_access deny media NET155

2. Найдите блок, где описываются delay_pools и добавьте туда следующие записи:

delay_pools 1

delay_class 1 1
delay_parameters 1 10000/5000
delay_access 1 allow NET155
delay_access 1 deny all

3. Перезапустите squid

/etc/init.d/squid restart

и для проверки, попробуйте скачать файл http://solostudio.nnov.ru/sites/default/filesfile/soft/rosegarden_10_02-1_amd64_deb.zip После 1Кб данных вы должны заметить падение скорости до 4Кб/c.

Ограничить время доступа в Internet

Презентация по SQUID

media:Squid-presentation.odp

Контрольные вопросы

  1. Назначение PROXY-сервера.
  2. В каком файле конфигурируется PROXY-сервер?
  3. В каком файле находится информация о работе PROXY-сервера?
  4. Что означает параметр acl?
  5. Что означает параметр src?
  6. Что означает параметр dst?
  7. Что означает параметр dstdomain?
  8. Каким образом можно запретить доступ по контентенту?
  9. На каком уровне стека протоколов TCP/IP работает proxy-сервер SQUID?
  10. Почему нельзя запретить скачивание mp3 файлов на уровне FireWall (iptables)?