RSS
 

Настройка Squid

06 Мар

squidВведение

Для того, чтобы настроить прокси-сервер Squid под систему Linux или другую (существуют сборки под Windows), необходимо знание всего нескольких параметров. На самом деле Squid очень гибкий и мощный, в нем используется очень много параметров для настройки. Эти настройки находятся в файле конфигурации squid.conf. Все их можно изучить из официального руководства по настройке Squid. В этой статье я расскажу как быстро и, главное, просто настроить елементарные функции прокси-серера.

Первые шаги

Самое простое что можно сделать после установки Squid — это разрешить (или запретить) доступ в Интернет пользователям нашей локальной сети. Для этого существует два параметра: http_port и http_access. Первый используется для указания порта по которому пользователи с запросами будут обращаться к прокси-серверу. Стандартно используется порт 3128, но при желании можно указать любой другой свободный порт. Формат обозначения такой:

http_port ip_address:port

Пусть у нас есть прокси-сервер с адресом 10.0.10.10 и портом для прослушивания клиентов 3128. Тогда мы должны в конфигурационный файл записать следующую строку:

http_port 10.0.10.10:3128

Второй параметр нужен для указания кому, как и когда можно или нельзя ходить в интернет. Перед тем как использовать этот параметр необходимо создать соответствующие списки контроля доступа — acl (access control list). Итак, начнем создавать наши списки доступа.

Списки контроля доступа имеют следующий вид:

acl имя_списка элемент_списка список

Например, нам нужно разрешить доступ в интернет для сети 10.100.10.0/24, а всем остальным запретить. Для этого создадим такой acl:

acl our_net src 10.100.10.0/24, где our_net — название нашего списка, src — элемент обозначения списка, 10.100.10.0/24 — сам список.

Теперь нам необходимо применить данный список. Шаблон для применения списка выглядит так:

http_access [deny/allow] кому куда

Для нашего примера имеем:

http_access allow our_net

http_access deny all

Слова allow и deny означают соответственно разрешить и запретить. Первая строчка разрешает доступ нашей сети, вторая запрещает доступ всем. Обратите внимание, что порядок записей имеет значение. Предыдущая запись имеет более высокий приоритет, чем следующая. То есть, если мы разрешили доступ сети 10.100.10.0/24, а потом запретили всем, то вторая запись не перекрывает первую, а значит, мы запрещаем доступ всем, кроме сети 10.100.10.0/24.

Если ми напишем вторую запись первой, то мы сначала запретим доступ всем, а потом разрешим нашей сети. Но Squid этого не сделает по причине приоритетности первой записи над второй. Таким образом, мы просто запретим доступ всем и неважно какие записи будут следовать дальше.

Рассмотрим пример когда нам необходимо запретить доступ на сеть 194.44.34.192/28. Создаем acl:

acl some_net dst 194.44.34.192/28, где some_net — название нашего спискаdst элемент списка,  194.44.34.192/28 — собственно список.

Теперь запретим доступ нашей сети 10.100.10.0/24 на сеть 194.44.34.192/28.

http_access deny our_net some_net

http_access allow all

Как видите, в нашем списке dst — элемент, отвечающий за адрес назначения, в отличии от элемента src, который отвечает за адрес источника.

Если нам необходимо указать адрес назначения не в виде ip-адреса, а в виде доменного имени (что обычно и делается), то для этого существует элемент dstdomain. Допустим необходимо запретить доступ нашей сети выход на сайты с доменами warez.ru и warez.ua. Тогда наш список будет иметь вид:

acl some_domain dstdomain warez.ru warez.ua

Если надо запретить поддомены данных доменов, то надо указать такой список:

acl some_domain dstdomain .warez.ru .warez.ua

Применяем список:

http_access deny our_net some_domain

http_access allows all

Также мы можем указать домен источника используя элемент списка srcdomain.

Регулярные выражения

Коротко говоря, регулярные выражения — это строка-образец, которая задает шаблон для поиска в тексте. Существует несколько элементов списков контроля доступа которые используют регулярные выражения. Рассмотрим пример, когда нам необходимо запретить доступ на домены, которые содержат слово xxx. Для этого существует элемент dstdom_regex. Список:

acl some_word dstdom_regex xxx

Слово xxx служит шаблоном для домена назначения. Для домена источника есть элемент srcdom_regex.

Запрещаем нашей сети доступ на домены содержащие ххх:

http_access deny our_net some_word

http_access allow all

Теперь попробуем запретить компьютерам c доменами .ukrtel.ua доступ на домены, которые заканчиваются на .ru

acl some_src_domain srcdom_regex \.ukrtel.ua$

acl some_dst_domain dstdom_regex \.ru$

Применяем список:

http_access deny some_src_domain some_dst_domain

http_access allow all

Заметим, что вышеуказанные задачи можно было решить и с помощью элементов srcdomain и dstdomain. То есть, эти элементы отличаются от вышеуказанных только тем, что в них используются регулярные выражения, которые имеют своеобразную нотацию. Необходимо немного потренироваться чтобы запомнить как правильно строить списки контроля доступа с регулярными выражениями.

Для того, чтобы разрешать или запрещать доступ к url (строка-путь к файлам), можно использовать следующие элементы списков: url_regex и urlpath_regex. Первый дает возможность строить списки с помощью регулярных выражений, которые задают шаблон для полного пути в строке, второй — то же, за исключением домена и протокола доступа (например, без http://www.google.com).

Запретим доступ нашей сети к url-ам, которые начинаются на music., а также заканчивающиеся на .mp3

acl some_xxx url_regex music.*\.mp3$

Без имени домена данный список будет иметь вид:

acl some_xxx urlpath_regex \.mp3$

Доступ по портах и протоколах

Для разрешения или запрета доступа по портах и/или протоколах существуют соответственно элементы port и proto.

К примеру, нам необходимо запретить доступ к ICQ для нашей сети. Используем следующий список:

acl icq_port port 5190

http_access deny our_net icq_port

Теперь, запретим нашей сети доступ по ftp:

acl ftp_protocol proto ftp

http_access deny our_net ftp_protocol

Методы

Существует элемент method (метод), который определяет методы Squid’а, например, GET, POST, CONNECT. Метод GET делает запрос на http-сервер. Этот метод обычно чаще всего используется при серфинге страниц интернета. Метод POST используется електронной почтой. Метод CONNECT запрашивает соединение с сервером. Чаще всего соединение идет на защищенные порты (443). Давайте создадим список, который запретит нашей сети использовать метод CONNECT на незащищенные порты.

acl not_safe_port port 443

acl method_connect method CONNECT

http_access deny our_net method_connect

Иерархия прокси

Для построения иерархии есть несколько параметров: icp_port — порт общения между прокси и cache_peer — настройка параметров взаимодействия прокси. Допустим у нас есть еще один прокси, который будет дочерним для нашего уже созданного прокси. Пусть его ip address будет 10.100.10.10. Тогда на обоих прокси мы должны указать:

icp_port 3130, где 3130 — порт общения прокси.

На младшем прокси указываем:

cache_peer 10.0.10.10 parent 3128 3130 proxy-only, где 10.0.10.10 — адрес родительского прокси, parent — параметр, который указывает, что это родитель, 3128 — порт обращения клиентов, 3130 — порт общения прокси между собой, proxy-only — параметр, котовый указывает, что данный прокси буде просто прокси без кэширования (он оставляет эту процедуру родительскому прокси).

На родительском прокси указываем, что мы пропускаем наш прокси в сеть, то есть наш дочерний прокси работает как клиент. Для этого нужно определить его в списке доступа:

acl son_proxy src 10.100.10.10

и разрешить:

http_access allow son_proxy

Есть еще одна важная опция, которую нужно установить на дочернем прокси — nonhierarchical_direct. По умолчанию она установлена в on. То есть запросы не отправляются на родительский прокси. Поэтому ее надо установить в off:

nonhierarchical_direct off

Кроме параметра parent существует параметр sibling — указывает на то, что данный прокси есть соседом для нашего. В таком случае на втором прокси нужно указать тоже этот параметр, например:

cache_peer 10.100.10.10 sibling 3128 3130 proxy-only

Ограничения пользователей по времени

Есть два вида ограничений: органичение по времени и ограничение по трафику. Для ограничения по времени существует элемент списка time. Фомат списка следующий:

acl название_списка time дни hh:mm-HH:MM, где some_time — название списка, time — элемент списка, дни — М (понедельник), T (вторник), W (среда), H (четверг), F (пятница), A (субота), S (воскресенье), hh:mm-HH:MM — промежуток времени, где hh:mm всегда меньше HH:MM.

Рассмотрим пример. Пусть нам необходимо запретить доступ нашей сети с 12:00 до 15:00 по суботам и понедельникам. Создадим список:

acl some_time time MA 12:00-15:00

Применим для нашей сети:

http_access deny our_net some_time

http_access allow our_net

Ограничения по трафику

Чтобы ограничить пользователей по трафику (что выглядит более привлекательно) необходимо знание таких понятий: delay_class, delay_pools, delay_access, delay_parameters.

delay_pools — количество созданных пулов. Пул — своего рода емкость с трафиком некоторого размера. Формат: delay_pools количество_пулов

delay_class — класс пула. Их существует 3. Первый — пул определен на всю сеть. Второй — пул определен на всю сеть, но делится на пулы для каждого адреса отдельно. Третий — пул определен на всю сеть, но делится на пулы для подсетей, которые делятся на пулы для каждого адреса отдельно. Формат: delay_class номер_пула класс_пула

delay_access — привязка пула к списку. Формат: delay_access номер_пула действие имя_список

delay_parameters — применение параметров к пулу. Формат: delay_parameters номер_пула параметры_пула

Параметры пула делятся на 3 вида в зависимости от класса пула:

Для класса 1: delay_parameters номер_пула байт_на_сеть

Для класса 2: delay_parameters номер пула байт_на_сеть байт_на_адрес

Для класса 3: delay_parameters номер_пула байт_на_сеть байт_на_подсеть байт_на_адрес

Теперь пример для усвоения данных возможностей. Ограничим нашу сеть 10.100.10.0/24 трафиком 8 Мбит/с и каждый адрес трафиком 1 Мбит/с. Еще ограничим сеть 10.200.10.0/24 трафиком 16 Мбит/с и каждый адрес трафиком 2 Мбит/с.

Создаем списки:

acl one_net src 10.100.10.0/24

acl two_net src 10.200.10.0/24

Определяем количество пулов:

delay_pools 2

Определяем класс первого пула:

delay_class 1 2

Применяем параметры для первого пула:

delay_parameters 1 1000000/1000000 125000/125000

Назначаем первый пул на первый список:

delay_access 1 allow one_net

delay_access 1 deny all

Определяем класс второго пула:

delay_class 2 2

Применяем параметры для второго пула:

delay_parameters 2 2000000/2000000 250000/250000

Назначаем второй пул на второй список:

delay_access 2 allow two_net

delay_access 2 deny all

Эпилог

Ну вот и все. После настройки всех параметров не забудьте указать visible_hostname, иначе при запуске Squid сообщит об ошибке. Пример:

visible_hostname proxy-server

Итак, здесь были рассмотрены самые необходимые и простые настройки такого мощного инструмента как Squid. Для написания статьи использовалось официальное руководство по настройке squid, портал открытых систем  www.opennet.ru и собственный опыт.


 

Комментарии facebook

Комментарии vkontakte

7 комментариев

Опубликовано в Linux

 

Теги: ,

Оставить комментарий

 

 
  1. Адилет

    Январь 28, 2013 at 11:38

    Спасибо!!!
    Мне понравилось ваш наст.
    и скажите пожалуйста как запретить скачка больше 2 Mb…

     
  2. Дмитрий

    Июль 7, 2013 at 18:16

    А еще есть бесплатный и хорошо русифицированный Zentyal. Установил и забыл.

     
    • Александр Бойченко

      Июль 14, 2013 at 15:05

      Модуль прокси там тоже на сквиде. На кнопочки, конечно, легче нажимать, но логику тоже непролохо было бы понимать. А так, система хорошая, не спорю.

       
    • foxiys

      Октябрь 30, 2014 at 11:37

      Только про бэкапы не забываем

       
  3. Максим

    Июль 9, 2014 at 03:43

    Добрый день! Отличная статья, спасибо Вам. У меня вопрос. Не как не получается блокировать переход на facebook если на страничках есть «клык», а так же блокировать 443 порт в целом. Подскажите как решить данную проблему. Заранее благодарю.

     
    • Александр

      Июль 28, 2014 at 11:45

      Создаем acl:
      acl some_domain dstdomain facebook.com .facebook.com
      Применяем acl:
      http_access deny our_net some_domain
      Не забываем разрешить в конце все остальное (а то забаните всех и вся)
      http_access allows all
      Аналогично с портами:
      acl https_port port 443
      http_access deny our_net https_port
      http_access allows all

       
  4. Veozir

    Июль 31, 2015 at 04:29

    Необходимо разршить некоторым юзерам доступ к skype по порту 443. Как это можно организовать. Помогите кто чем может))