Для того, чтобы настроить прокси-сервер 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 и собственный опыт.
Адилет
Январь 28, 2013 at 11:38
Спасибо!!!
Мне понравилось ваш наст.
и скажите пожалуйста как запретить скачка больше 2 Mb…
Дмитрий
Июль 7, 2013 at 18:16
А еще есть бесплатный и хорошо русифицированный Zentyal. Установил и забыл.
Александр Бойченко
Июль 14, 2013 at 15:05
Модуль прокси там тоже на сквиде. На кнопочки, конечно, легче нажимать, но логику тоже непролохо было бы понимать. А так, система хорошая, не спорю.
foxiys
Октябрь 30, 2014 at 11:37
Только про бэкапы не забываем
Максим
Июль 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
Veozir
Июль 31, 2015 at 04:29
Необходимо разршить некоторым юзерам доступ к skype по порту 443. Как это можно организовать. Помогите кто чем может))