Установка и настройка прокси-сервера Squid на Ubuntu

August 29, 2016

При настройке локальной сети офиса или предприятия часто реализуется схема, при которой доступ в интернет для всех компьютеров организован через один общий шлюз. создания шлюза удобно использовать прокси-сервер. Программный пакет Squid выполняет функции прокси-сервера для протоколов HTTP, FTP и, в случае грамотной специализированной настройки, HTTPS.

Пакет Squid распространяется по свободной лицензии GNU General Public License и имеет следующие основные возможности:

  • Контроль доступа к сети Интернет. Ограничение доступа для групп или отдельных пользователей, доступ по расписанию, доступ к ограниченному числу ресурсов или создание “запрещённого списка” сайтов - для регуляции доступа сотрудников к “развлекательным” сайтам в рабочее время и защиты от проникновения во внутреннюю сеть посторонних клиентов; 
  • Контроль  трафика. Множество вариантов настройки, позволяющие серверу обеспечивать доступ максимальному количеству клиентов без перегрузки возможностей сетевого оборудования, в том числе отдельные конфигурации для разных видов трафика. Организация открытой точки wi-fi без боязни за возможную нестабильность сети. Возможность выдавать отдельным клиентам или группам ограниченного объема трафика для работы;
  • Мониторинг использования сетевых ресурсов. Различные статистические данные, которые собирает Squid, и созданные для него расширения будут незаменимы для оптимизации локальной сети, анализа нагрузки, исследования причин возможных сбоев сети и обнаружения атак на локальную сеть компании;
  • Обратное кэширование. Возможность работы в режиме “обратного прокси” или “ускорителя” - для существенного снижения нагрузки на сервер путем кэширования запросов, к которым идет больше всего обращений от пользователей.

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

Настройка локальной сети

Прежде чем переходить к установке и настройке прокси-сервера Squid, необходимо настроить локальную сеть. Для этого на проксируещем сервере должно быть как минимум два сетевых интерфейса - первый осуществляет взаимодействие с Интернетом, в то время как ко второму будут подключаться компьютеры локальной сети. Все настройки и команды приводится на примере дистрибутива Ubuntu.

Чтобы изменить конфигурацию локальной сети или внести полученные от провайдера настройки для подключения сервера к сети Интернет, необходимо отредактировать всего один конфигурационный файл:

nano /etc/network/interfaces 

Приведём его к следующему виду:

auto eth0
    iface eth0 inet dhcp  #для автоматичесокго получения настроек от провайдера по dhcp
auto eth1
    iface eth1 inet static
        address 192.168.0.1 #ip-адрес
        netmask 255.255.255.0 #маска подсети 

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

service networking restart

По окончании настройки желательно убедиться, что интерфейсы настроены верно. Вывод информации о сетевых подключениях осуществляется командой: 

ifconfig

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

eth0      Link encap:Ethernet  HWaddr 00:16:3c:fc:93:a6
          inet addr:185.22.174.75  Bcast:185.22.174.255  Mask:255.255.255.0
          inet6 addr: 2a00:1838:36:1c3::7385/64 Scope:Global
          inet6 addr: fe80::216:3cff:fefc:93a6/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:7576291 errors:0 dropped:0 overruns:0 frame:0
          TX packets:65851 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:628650171 (628.6 MB)  TX bytes:10778431 (10.7 MB)
eth1      Link encap:Ethernet  HWaddr 0a:19:bc:0d:00:9d           inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0           inet6 addr: fe80::819:bcff:fe0d:9d/64 Scope:Link           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1           RX packets:12581 errors:0 dropped:0 overruns:0 frame:0           TX packets:8484 errors:0 dropped:0 overruns:0 carrier:0           collisions:0 txqueuelen:100           RX bytes:1884987 (1.8 MB)  TX bytes:1123251 (1.1 MB) 

По этим данным ясно, что у сервера имеется два сетевых интерфейса, eth0 и eth1, с IP-адресами 185.22.174.75 для eth0 и 192.168.0.1 для eth1. К адаптеру eth0 подключен кабель интернет-провайдера, а к адаптеру eth1 будут подключены компьютеры локальной сети.

Настройка DHCP

На данном этапе уже есть возможность указать на локальной машине статический IP-адрес из локальной подсети, например 192.168.0.2, наш сервер (192.168.0.1), в качестве шлюза, и DNS-сервер. Компьютер будет подключен к локальной сети.

Но система статических IP-адресов имеет свои недостатки: необходимо настраивать каждую машину для подключения к локальной сети, возможен конфликт одинаковых IP и тому подобное. 

Поэтому следующим этапом будет настройка механизма автоматической трансляции IP-адресов через DHCP. В таком случае при подключении к сети нового компьютера все настройки будут переданы ему автоматически. 

Для установки сервера DHCP используется команда: 

sudo apt-get install isc-dhcp-server

Файл конфигурации по умолчанию находится в /etc/dhcp/dhcpd.conf, откроем файл в редакторе с помощью команды: 

nano /etc/dhcp/dhcpd.conf

В большинстве случаев минимальная настройка производится внесением блока вида: 

subnet 192.168.0.0 netmask 255.255.255.0 {#подсеть 192.168.0.0/24
  range 192.168.0.2 192.168.0.254; #диапазон выдаваемых адресов
  option domain-name-servers 8.8.8.8;#dns-сервер
  option domain-name "test.loc"; #имя домена
  option routers 192.168.0.1; # “рекомендуемый” шлюз
  default-lease-time 604800; # стандартная длительность аренды ip-адреса
  max-lease-time 604800; #максимальная длительность аренды ip-адреса
}

После изменения конфигурационного файла необходимо перезапустить сервер DHCP для применения новых настроек:

/etc/init.d/isc-dhcp-server restart

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

Настройка NAT

После организации локальной сети необходимо подключить её к Интернету - для этого реализуется трансляция сетевых адресов (Network Address Translation или NAT). Благодаря NAT несколько компьютеров могут выходить в интернет, используя один IP-адрес.

В Ubuntu механизм NAT реализуется с помощью сетевого фильтра iptables, который одновременно является брандмауэром. 

Для автоматической загрузки настроек iptables при старте системы создадим новый пустой конфигурационный файл командой: 

sudo touch /etc/nat

И откроем его для изменения: 

nano /etc/nat

Варианты конфигурации брандмауэра зависят от политики сетевой безопасности в компании. Минимальный набор настроек выглядит следующим образом: 

 #!/bin/sh
#Пересылка пакетов
echo 1 > /proc/sys/net/ipv4/ip_forward
#Откроем доступ наружу из внутренней сети 
iptables -A FORWARD -i tap0 -o eth0 -j ACCEPT
#Включаем NAT
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.1/24 -j MASQUERADE
#Разрешаем принимать ответы из внешней сети
iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
#Ограничим доступ во внутреннюю сеть снаружи
iptables -A FORWARD -i eth0 -o tap0 -j REJECT

После сохранения изменений обеспечим для файла права на исполнение:

chmod +x /etc/nat

Далее необходимо поставить созданный файл на автозагрузку при включении сервера. Для этого откроем рассмотренный ранее файл interfaces:

nano /etc/network/interfaces 

и добавим в самый низ строку: 

post-up /etc/nat

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

reboot

Установка и настройка Squid 

Для инсталляции Squid используется команда: 

apt-get install squid3

Когда установка завершится, сервис запустится автоматически. 

Перейдём к настройке. Файл конфигурации расположен по адресу /etc/squid3/squid.conf. Для неподготовленного пользователя он может показаться совершенно необъятным - в нём более 7000 строк. Большая часть из них закомментированы и описывают значительную часть всех возможных вариантов работы Squid.  

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

cp /etc/squid3/squid.conf /etc/squid3/backup-squid.conf

При необходимости перед началом настройки можно обратиться к официальной документации проекта

Теперь можно удалять из файла конфигурации все закомментированные строки и пояснения, оставляя только активные директивы. По умолчанию их немного:

acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
http_access deny all
http_port 3128
coredump_dir /var/spool/squid3
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880
refresh_pattern . 0 20% 4320

Основной инструмент настройки Squid - это списки контроля доступа или ACL (Access Control List). ACL объявляются директивой, имеющей следующий синтаксис: 

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

Параметр даёт серверу понять тип элементов списка. АCL с параметром port содержит номера портов, а с параметром src - ip-адреса, с которых на сервер поступает запрос. Полный список параметров весьма обширен и доступен в официальной документации.

Таким образом, строка

acl Safe_ports port 80

добавляет в список Safe_ports, содержащий элементы типа “порт”, новое значение 80.

Директива http_access, имеющая формат 

http_access   указание   имя_acl

определяет правила работы с элементами указанного acl. Например, строка: 

http_access deny !Safe_ports

блокирует все порты, не входящие в список Safe_ports.

По умолчанию доступ к Squid разрешен только с самого сервера: 

http_access allow localhost
http_access deny all

Чтобы открыть доступ клиентам локальной сети создадим для них новый список доступа c параметром src:

acl localnet src 192.168.0.0/24

И разрешим доступ:

http_access allow localnet

Теперь укажем порт, на котором работает Squid, и установим прозрачный режим работы:

http_port 192.168.0.1:3128 intercept  #параметр intercept включает прозрачный режим

Минимальная настройка конфигурационного файла Squid завершена, теперь можно перейти к описанию политики информационной безопасности.

Параметр src позволяет регулировать доступ для клиентов со статичными ip-адресами:

acl  UserGroup   src    192.168.0.2-192.168.0.9 # группа пользователей
acl  SingleUser  src    192.168.0.10 #отдельный пользователь
        http_access  allow  UserGrour  #разрешаем доступ для группы
        http_access  allow  SingleUser # и для отдельного пользователя
        http_access  deny   all  #запрещаем всем остальным

Параметр dst позволяет указать список ip-адресов назначения, к которым клиент желает получить доступ: 

acl  Net194   dst    194.67.0.0/16  #описываем некую подсеть 194.67.0.0/16
        http_access   deny   SingleUser   Net194 # запрещаем пользователю доступ к ней

Параметр dstdomain даёт возможность указывать домен, к которому выполняется запрос:

acl  SitesBlocked  dstdomain  .example.ru  .sample.ru #указываем несколько доменных имён
        http_access   deny   UserGroup  SitesBlocked #и запрещаем к ним доступ группе пользователей

Если необходимо указать домен источника, используется параметр srcdomain.

Параметры srcdom_regex и dstdom_regex позволяют использовать в ACL регулярные выражения:

acl  SitesRegexFree     dstdom_regex    free #сайты, содержащие в доменном имени слово “free”
acl  SitesRegexComOrg  dstdom_regex  \.com$ \.org $ #сайты доменных зон .com и .org
        http_access   deny   SingleUser   SitesRegexFree
        http_access   deny   SingleUser  SitesRegexComOrg

Ключ -i необходим для игнорирования регистра символов в регулярных выражениях:

acl  имя  [-i]  url_regex  элементы_списка

С помощью параметра url_regex возможно указать шаблон регулярного выражения для URL:

 acl  MusicMP3  url_regex  -i  \.mp3$  #охватывает музыкальные файлы .mp3

Параметр port используется для указания списка портов. Он будет полезен для запрета отдельных портов, которые используются установленными на клиентской машине программами, например интернет-мессенджерами. 

Ограничение пользователей по времени осуществляется с помощью параметра time:

acl   имя   time  дни   чч:мм-ЧЧ:ММ

Где день: M - Понедельник, T - Вторник, W - Среда, H - Четверг, F - Пятница, A - Суббота, S - Воскресенье.

Важно отметить что время начала промежутка должно быть всегда меньше времени конца. Например, возможно указать вариант 00:00-23:59, но промежуток 20:00-09:00 придётся разбить на 20:00-23:59 и 00:00-09:00. 

Ограничения по времени можно комбинировать и с другими правилами. Есть возможность по расписанию разрешать или запрещать доступ к просмотру определённых сайтов, открывать и закрывать порты, управлять доступностью IP-адресов и отдельных доменов. Например: 

acl  WeekendTime  time  AS 10:00-15:00 #обозначим некоторый временной промежуток для выходных дней:
http_access  allow  SingleUser  WeekendTime  MusicMP3 #разрешим пользователю достум к файлам формата mp3 в выбранный промежуток времени
http_access  deny   SingleUser  MusicMP3 #и запретим в любое другое время

Параметр proto позволяет указывать протокол передачи информации:

acl имя_acl proto список

Используя его можно запретить пересылку файлов по протоколу ftp:

acl   proto_ftp   proto   ftp
http_access   deny   SingleUser  proto_ftp

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

На сегодняшний день, когда ушли в прошлое каналы с пропускной способностью в 256 кбит/с и менее, можно ошибочно предположить что устанавливать ограничения по скорости соединения  в случае небольшого количества клиентов локальной сети бессмысленно. Тем не менее, очень желательно устанавливать хотя бы самые простые правила регулирования скорости соединения для отдельных пользователей, чтобы избежать перегрузки сети и нехватки ресурсов для отдельных пользователей, для которых важна хорошая скорость работы сети. Подводные камни могут скрываться в следующих процессах: 

  • автоматическое резервное копирование данных с сервера компании и прочие процессы передачи больших объемов данных, выполняющиеся сервером по расписанию;
  • операции передачи файлов для личных и рабочих нужд, особенно своей способностью использовать все доступные сетевые ресурсы известен протокол BitTorrent;
  • технические неисправности в отдельных компьютерах и программах, а так же действия вредоносных программ;
  • злонамеренные сетевые атаки на отдельные компьютеры локальной сети.

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

Работу пулов регулируют три директивы: delay_classdelay_parametersdelay_access

Количество пулов устанавливает директива delay_pools:

delay_pools  количество_объявленных_пулов

Создадим несколько пулов:

delay_pools 2 #всего 2 пула с номерами 1 и 2 соответственно

Пулы могут быть трёх классов:

  • Один кран на всю сеть ограничивает поток воды;
  • Весь поток ограничен одним краном, после которого идут отдельные персональные краны(для каждого IP-адреса сети);
  • Весь поток ограничен одним краном, от которого идут отдельные краны для каждой группы пользователей(подсети), каждый из которых, в свою очередь, делится на персональные краны для каждого клиента(для отдельного IP-адреса).

Класс пула должен быть указан в директиве delay_class:

delay_class  номер_пула  класс_пула

Укажем класс пула:

delay_class  1  1 #пул №1 ограничит скорость для всех клиентов, для которых он будет применен

Директива delay_parameters устанавливает параметры пула:

delay_parameters  номер_пула  параметры

Формат записи параметров зависит от выбранного класса пула:

delay_parameters 1  байт_на_всю_сеть # для класса 1
delay_parameters 1  на_всю_сеть на_клиента  #для класса 2
delay_parameters 1  на_всю_сеть на_подсеть на_клиента #для класса 3

Для пула №1 выбран класс 1, установим для него скорость передачи данных в 512 кбит/с:

delay_parameters 1 64000/64000  # 512 Кбит = 64 Кбайта = 64000 байт

Запись параметра производится по следующим правилам: сперва указывается ограничение скорости, затем указывается лимит, после которого это ограничение начинает действовать. Таким образом значение параметра 64000/64000  говорит о том, что после того, как пользователь скачал на максимальной скорости первые 64Кб запроса, на клиента  накладывается ограничение скорости в 512 Кбит/с. Удобно устанавливать второе значение параметра несколько больше чем первое, например конфигурация:  

delay_parameters 1 64000/256000  

позволяет пользователю получить первые 256Кбайт запроса на максимальной скорости и только потом ограничить клиента шириной канала в 512 Кбит/с.

Для снятия ограничений по скорости используйте значение -1, например: 

delay_parameters 1 -1 #неограниченная скорость доступа для пула №1 

Теперь можно распространять действие  пула на отдельных клиентов сети при помощи директивы delay_access, имеющей формат:

delay_access  номер_пула  действие   имя_acl

Параметр “ действие” имеет значения allow (разрешить) и deny (запретить). Пул будет действовать на тех клиентов, которым он разрешен и не будет действовать на тех, кому запрещён.

Например, конфигурация:

delay_access      1  deny    UserGroup
delay_access      1  allow   SingleUser

распространяет действия пула №1 на отдельного пользователя SingleUser, но не затрагивает группу пользователей UserGroup.

Для группы пользователей используем пул №2:

delay_class  2  2 # пул №2 позволит отрегулировать общую ширину канала для всей группы клиентов и установить отдельные органичения для каждого пользователя группы. 

Опишем ограничения:

delay_parameters 2 512000/512000 64000/128000  # 8 Мбит/с - ограничение ширина канала для всей группы, на этой скорости клиент может скачать первые 128Кбайт запроса, а затем скорость его соединения упадёт до 512 Кбит/с.

Применим ограничения пула №2:

delay_access      1  allow  UserGroup #действует на группу пользователей UserGroup
delay_access      1  deny   SingleUser  #но не действует на отдельного пользователя SingleUser

Настройка кэширования

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

В стандартной конфигурации Squid включен только RAM кэш, объем используемой памяти установлен на 256Мб. Увеличим объем кэша и установим максимальный размер кэшированного объекта с помощью соответствующих директив:

cache_mem 1024 MB # объем доступной для кэширования памяти
maximum_object_size_in_memory 512 KB # максимальный размер объекта в кэше 

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

За использование HDD кэша отвечает директива cache_dir, имеющая формат: 

cache_dir тип_хранилища путь_к_хранилищу размер L1 L2

cache_dir ufs /var/squid_cache 1024 16 256 

Размер кэша на диске указывается в мегабайтах, в примере выше кэш с максимальным размером 1 Гб будет хранится в папке /var/squid_cache. Тип хранилища ufs стандартный.  Параметры 16 и 256 указывают количество директорий первого и второго уровня,  эти значения так же прописаны в документации как стандартные. 

Максимальный размер объекта в дисковом кэше также можно указать:

maximum_object_size 2 MB

Настройка логирования

Squid имеет мощную систему подробного логирования для контроля проходящего через прокси-сервер траффика. Логи делятся на три различных журнала:

  • access.log - содержит записи о запросах клиентов;
  • store.log - содержит записи, относящиеся к действиям с кэшем;
  • cache.log - содержит сообщения об ошибках, возникающих при работе Squid.

Чаще всего используется журнал access.log. Укажем в конфигурации собственный путь для его хранения:

access_log daemon:/etc/squid3/logs/access.log squid

Параметр, имеющий в примере значение “squid” определяет формат лог-файла. Можно задать формат лога “common” для того, чтобы можно было обрабатывать полученный журнал сторонними программами, но в таком случае стоит помнить, что этот формат лога не содержит всей информации, которая есть в логе по умолчанию. Помимо стандартных вариантов имеется возможность создать собственный формат лог-файла, используя директиву logformat. Подробную информацию о работе этой директивы можно найти в документации к продукту.

Директивы cache_log и cache_store_log позволяют указать путь к файлам cache.log и store.log соответственно. Они не требуют указания формата:

cache_log daemon:/etc/squid3/logs/cache.log 
cache_store_log daemon:/etc/squid3/logs/store.log 

Помимо различных видов журналов Squid имеет настройку уровней логирования. За глубину отладки отвечает директива debug_options. У неё два обязательных параметра - секция и глубина отладки: 

debug_options ALL,1 # секция “ALL”, глубина отладки 1

Значение секции рекомендуется оставлять ALL (либо осторожно выбирать конкретную секцию из списка). Уровень логирования же может менятся в диапазоне от 1 до 9, где с ростом уровня увеличивается подробность логов, и, соответственно, количество записей в журнале. Как правило, уровень выше 5 редко используется в реальной жизни, потому что выводит уже слишком много “избыточной” информации для каждого произошедшего события.

Для того чтобы всегда иметь возможность начать новый файл  логов и упорядочить их существует параметр количества ротаций:

logfile_rotate 31

Значение 31 означает, что при создании нового файла логов старый получит расширение от 0 до 30 и дальнейшая запись в него вестись не будет. Создание нового файла логов производится с помощью команды:

squid -k rotate

Таким образом, добавив в cron задачу каждый день создавать новый файл логов, можно иметь упорядоченный отчет обо всём прошедшем через прокси-сервер трафике за прошедший месяц.

Если даже с самым низким уровнем логирования объем логов возрастает до нежелательных масштабов - стоит применить дополнительные средства, вроде автоматического сжатия журналов или переноса их в отдельное хранилище. Так же можно изменить количество или частоту ротаций в зависимости от задачи. Можно хранить меньшее количество логов, либо чаще создавать свежий журнал, а старый архивировать и перемещать. Для прокси-сервера Squid есть множество надстроек и сторонних программ, упрощающих все этапы работы с лог-файлами.  

Оставим без изменений остальные параметры и проверим файл настроек с помощью команды:

squid3 -k check

Эта команда предназначена для поиска ошибок в конфигурационном файле, если она ничего не выводит - значит ошибок нет.  

Теперь осталось применить новые параметры:

service squid3 reload

После завершения настройки прокси-сервера перенаправим на него весь трафик локальной сети, внеся изменения в файл /etc/nat командой:

nano /etc/nat

Добавим в самый низ файла следующую строку:

#Перенаправление всего http-трафика на прокси-сервер
iptables -t nat -A PREROUTING -i eth1 ! -d 192.168.0.0/24 -p tcp -m multiport --dport 80,8080 -j DNAT --to 192.168.0.1:3128

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

reboot

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

Подпишитесь на нашу рассылку,
чтобы получать последние обновления нашего блога!