Squid настройка

Настройка Squid

Мы не будем вдаваться в процесс установки прокси сервера Squid, а перейдем сразу к его настройке. Самое элементарное, что нам после установки следует сделать, так это разрешить доступ пользователям нашей локальной сети. Для этого служат параметры http_port, http_access. Кроме этого, мы заведем acl (список контроля доступа) для нашей локальной сети. И так, http_port нам нужен постольку, поскольку наш прокси сервер Squid должен обслуживать только компьютеры нашей локальной сети и быть невидимым для внешнего мира, дабы исключить возможность «плохим людям» внешней сети воспользоваться нашим каналом или трафиком, а в случае, если будут обнаружены «дыры» в коде прокси сервера Squid, воспользоваться ими.

Редактируем файл конфигурации:

ee /usr/local/etc/squid/squid.conf

Задаем параметры:

#
# Рекомендованная минимальная конфигурация:
#
# Обслуживаемая прокси-сервером сеть
# Укажите список ваших внутренних IP-сетей,
# которым разрешен доступ в интернет
#acl localnet src 10.0.0.0/8    # RFC1918 possible internal network
#acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
#acl localnet src fc00::/7       # RFC 4193 local private network range
#acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines
# Порт SSL для подключений по HTTPS-протоколу
acl SSL_ports port 443
# Список портов, к которым разрешен доступ через прокси-сервер по протоколу HTTP
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
# Запретить метод CONNECT не на SSL-порт
http_access deny CONNECT !SSL_ports
# Разрешить только локальное управление кэшем
http_access allow localhost manager
http_access deny manager
# Запретить доступ к локальным ресурсам сервера через прокси
# Настоятельно рекомендуется задать это правило, чтобы исключить внешний доступ
# к приложениям, принимающим подключения по внутренним адресам (127.0.0.1 и др.).
http_access deny to_localhost
#
# Задайте свои правила доступа для клиентов
#
# Образец правила разрешающего доступ в интернет из вашей локальной сети
# Список ваших внутренних IP-сетей, задается в acl localnet
http_access allow localnet
http_access allow localhost
# Последнее правило, блокирует все, что не было разрешено выше
http_access deny all
# Адрес и порт для входящих подключений
# Обычно Squid ожидает подключения на порт 3128
# Если требуется только прозрачный прокси, соединения можно ограничить внутренним интерфейсом
http_port 3128
#http_port 127.0.0.1:3128
# Для прозрачного прокси дополнительно необходимо задать порт перехвата трафика
http_port 127.0.0.1:3128 intercept
# Раскомментируйте, чтобы указать путь для дискового кеширования
# Кэш: формат, размещение, размер в мегабайтах, число папок первой и второй вложенности
# Указанный размер кэша не учитывает издержки файловой системы и должен быть примерно на 20% меньше доступного дискового пространства
# Директиву cache_dir, можно указать несколько раз, для добавления под кэш дополнительных дисков
#cache_dir ufs /var/squid/cache 100 16 256
# Путь сохранения дампов аварийного завершения
coredump_dir /var/squid/cache
#
# Время устаревания кэшируемого контента в минутах, если явно не задано сервером
# Поля: шаблон URL, минимальное время в минутах, процент для расчета времени устаревания объекта, максимальное время в минутах
# Если повторный запрос приходит до наступления минимального времени, объект считается актуальным, запрос к серверу не выполняется
# Расчет времени жизни производится по формуле: (ВремяПолучения-ВремяСоздания)*Процент
# Чем старее объект, тем дольше он содержится в кэше, но не дольше заданного максимального времени
# http://etutorials.org/Server+Administration/Squid.+The+definitive+guide/Chapter+7.+Disk+Cache+Basics/7.7+refresh_pattern/
#
# Время жизни объектов для протоколов FTP и GOPHER
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
# Нулевое время жизни для динамического контента
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
# Время жизни по умолчанию
refresh_pattern .               0       20%     4320
#
# Дополнительные параметры конфигурации
#
# Не использовать IPv6, если доступен IPv4-адрес
# По умолчанию, приоритет отдается протоколу IPv6, что может привести к ошибкам соединения, если IPv6 недоступен
dns_v4_first on
# При завершении работы ожидать закрытия клиентских подключений, так заявлено в документации
# Фактически, ждет независимо от наличия подключений
# По умолчанию - 30 секунд, сократим время ожидания до одной секунды
shutdown_lifetime 1 seconds
# Адрес сервера на страницах ошибок
# Задать при проблемах с автоматическим определением имени сервера
#visible_hostname proxy.localnet.local
# Отключить кеширование
#cache deny all
# Размер кэша в оперативной памяти
# По умолчанию 256Мб
#cache_mem 256 MB
# Максимальный размер объекта, сохраняемого в оперативной памяти
# Объекты больше заданного размера в памяти не сохраняются
#maximum_object_size_in_memory 512 KB
# Путь и формат лог-файла
#access_log daemon:/var/log/squid/access.log squid
#access_log stdio:/var/log/squid/access.log squid
# Протоколировать параметры запросов
# По умолчанию в целях обеспечения приватности в логе не сохраняются параметры CGI-скриптов
#strip_query_terms off
# Протоколировать http-заголовки
# По умолчанию протоколирование отключено
#log_mime_hdrs on
# Не отправлять заголовок X-Forwarded-For содержащий внутренний IP-адрес клиента
#forwarded_for transparent
# Не отправлять HTTP-заголовок Via с названием и версией прокси-сервера
# Опция нарушает HTTP-стандарт, требуется сборка Squid с параметром LAX_HTTP, он же --enable-http-violations
#via off
# Отключить встроенную ротацию логов
# При ротации логов средствами newsyslog
#logfile_rotate 0

Запуск Squid

Включаем Squid в rc.conf:
squid_enable="YES"
Вручную редактором:
ee /etc/rc.conf
Или командой:
printf '\nsquid_enable=\"YES\"\n' >>/etc/rc.conf
Запускаем Squid:
service squid start
Если при старте получаем предупреждение: «WARNING: Could not determine this machines public hostname. Please configure one or set ‘visible_hostname'». Задаем имя сервера параметром «visible_hostname» в конфиге.
Проверяем, запущен ли демон:
ps -ax | grep squid
Проверяем, слушается ли порт:
sockstat | grep squid
Проверяем системный лог на наличие сообщений от Squid:
grep squid /var/log/messages
Проверяем cache.log:
cat /var/log/squid/cache.log
В случае успешного старта вывод будет примерно следующим:
2015/03/25 15:29:32 kid1| Set Current Directory to /var/squid/cache
2015/03/25 15:29:32 kid1| Starting Squid Cache version 3.4.12 for i386-portbld-freebsd10.1...
2015/03/25 15:29:32 kid1| Process ID 32795
2015/03/25 15:29:32 kid1| Process Roles: worker
2015/03/25 15:29:32 kid1| With 14148 file descriptors available
2015/03/25 15:29:32 kid1| Initializing IP Cache...
2015/03/25 15:29:32 kid1| DNS Socket created at [::], FD 7
2015/03/25 15:29:32 kid1| DNS Socket created at 0.0.0.0, FD 8
2015/03/25 15:29:32 kid1| Adding nameserver 8.8.8.8 from /etc/resolv.conf
2015/03/25 15:29:32 kid1| Logfile: opening log daemon:/var/log/squid/access.log
2015/03/25 15:29:32 kid1| Logfile Daemon: opening log /var/log/squid/access.log
2015/03/25 15:29:32 kid1| Store logging disabled
2015/03/25 15:29:32 kid1| Swap maxSize 0 + 262144 KB, estimated 20164 objects
2015/03/25 15:29:32 kid1| Target number of buckets: 1008
2015/03/25 15:29:32 kid1| Using 8192 Store buckets
2015/03/25 15:29:32 kid1| Max Mem size: 262144 KB
2015/03/25 15:29:32 kid1| Max Swap size: 0 KB
2015/03/25 15:29:32 kid1| Using Least Load store dir selection
2015/03/25 15:29:32 kid1| Set Current Directory to /var/squid/cache
2015/03/25 15:29:32 kid1| Finished loading MIME types and icons.
2015/03/25 15:29:32 kid1| HTCP Disabled.
2015/03/25 15:29:32 kid1| Squid plugin modules loaded: 0
2015/03/25 15:29:32 kid1| Accepting HTTP Socket connections at local=[::]:3128 remote=[::] FD 11 flags=9
2015/03/25 15:29:32 kid1| Accepting NAT intercepted HTTP Socket connections at local=127.0.0.1:3128 remote=[::] FD 12 flags=41
2015/03/25 15:29:33 kid1| storeLateRelease: released 0 objects

Остается еще одна маленькая вещь, мимо которой мы не можем пройти безнаказанно. И эта вещь — реклама. Не знаю, как вас, но меня достали эти разражающе мигающие и переливающиеся баннеры. И если порнуху можно запретить простым прописыванием сайтов в deny-листы, то с баннерами такая ситуация не проходит. То есть проходит, но страницы при этом портятся до безобразия. Но народ умный, он придумал такую вещь, как редиректор. Суть проста — каждый URL, который передается squid’у, первоначально передается редиректору. И тот либо возвращает прежний URL в случае, если все в порядке, либо возвращает тот, который по его мнению, более правильный. А кто мешает нам перехватывать обращения к баннерам и счетчикам и вместо них подсовывать свою картинку? Никто!. В итоге страницы не портятся безобразными значками о невозможности выкачать картинку, а заполняются прозрачными окошками.

Читайте также:  Отключаем swscale в ffmpeg

Squid — настраиваем URL-фильтрацию

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

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

Читайте также:  Не удалось создать COM-объект VirtualBox. NS_ERROR_FAILURE (0x80004005)

В дальнейшем мы будем подразумевать, что читатель обладает начальными навыками администрирования Linux. Также напомним, что все приведеные ниже команды следует выполнять от супрепользователя.

Прежде всего создадим файл списка. Располагаться он может в любом месте, но будет логично разместить его в конфигурационной директории squid — /etc/squid (или /etc/squid3 если вы используете squid3)

touch /etc/squid/blacklist

и приступим к его заполнению. При указании URL следует использовать RegExp синтаксис, мы не будем подробно останавливаться на этом вопросе, так как это выходит за рамки статьи, подробнее с правилами RegExp можно ознакомиться здесь. Для примера заблокируем популярные соцсети:
vk\.com
odnoklassniki\.ru
Обратите внимание, точка в RegExp является служебным симоволом и поэтому должна быть экранирована символом \ (обратный слеш).
В конфигурационном файле squid (/etc/squid/squid.conf) создадим acl список, в который включим хосты или пользователей, для которых будет производиться фильтрация.
acl url_filtred src 10.0.0.100-10.0.0.199
В нашем случае фильтрация включена для всех хостов в диапазоне адресов 10.0.0.100-199, т.е. мы будем фильтровать интернет только для определенной группы пользователей.
Затем подключим наш список:
acl blacklist url_regex -i "/etc/squid/blacklist"
Ключ -i указывает на то, что список нечувствителен к регистру.
Теперь перейдем в секцию правил и перед правилом
http_access allow localnet
укажем:
http_access deny blacklist url_filtred
Еще раз обратим ваше внимание, что все правила в squid обрабатываются последовательно, до первого вхождения, поэтому если мы разместим более общее правило перед более частным, то оно работать не будет. То же самое справедливо и для перекрывающихся правил — сработает самое первое.
Сохраним изменения и перезапустим squid:
service squid restart
Попробуем посетить сайт из списка, если все сделано правильно, то вы увидите сообщение squid о запрете доступа к данному ресурсу.
В дальнейшем вы можете дополнять списки, не забывая каждый раз после этого перезапускать squid.
Рассмотрим немного иную ситуацию, требуется фильтровать интернет для всех, кроме определенной группы. В этом случае создадим acl для исключенных пользователей:
acl url_no_filtred src 10.0.0.127 10.0.0.100
и изменим запрещающее правило следующим образом:
http_access deny blacklist !url_no_filtred
Также вы можете использовать несколько URL-списков и списков доступа, гибко регулируя доступ для разных групп пользователей.
Вернемся к регулярным выражениям. Допустим, что нам нужно заблокировать не ресурс целиком, а его часть, тогда составим строку таким образом, чтобы она обязательно содержала нужную часть адреса, например строка:
my\.mail\.ru
Заблокирует доступ к социальной сети Мой мир, но не будет препятствовать доступу к Майл.ру.
В качестве строки можно использовать не только доменное имя, но и его часть. Так если мы внесем в список простую строку
mail
то это приведет к блокировке всех ресурсов, у которых данное сочетание входит в доменное имя, т.е. и mail.ru и hotmail.com. Поэтому к составлению списков, особенно содержащих короткие простые сочетания, нужно подходить осторожно.
Рассмотрим простой, но показательный пример. Допустим нужно заблокировать известный сайт auto.ru и его поддомены. Если мы, не долго думая, напишем
auto\.ru
То вместе с требуемым порталом будут заблокированы все сайты имеющие данное сочетание в имени, например abc-auto.ru. Есть о чем задуматься. Если с поддоменами все просто, достаточно написать
\.auto\.ru
и все что содержит точку перед искомым адресом будет заблокировано, то с основным доменом сложнее, самое время вспомнить про полный формат адреса:
http\:\/\/(www\.)?auto\.ru
Теперь будут заблокированы только адреса начинающиеся с http://auto.ru, конструкция (www\.)? обозначает, что префикс www c точкой могут быть, а могут не быть. Зато другие сайты, содержащие auto.ru будут нормально открываться.
Напоследок рассмотрим еще одну ситуацию, как сделать, чтобы на заблокированом сайте были доступны некоторые страницы. Например, страничка компании в Вконтакте или вы хотите обезопасить определенные адреса от случайного попадания под фильтр в будущем. Для этого следует добавить к системе «белый» список. Создадим файл списка:
touch /etc/squid/whitelist
внесем в него нужные адреса, для примера разблокируем страничку Вконтакте новостного портала Утро.ру:
vk\.com\/na_utro_ru
Подключим лист:
acl whitelist url_regex -i "/etc/squid/whitelist"
и добавим правило перед запрещающим, в итоге должно получиться:
http_access allow whitelist
http_access deny blacklist url_filtred
Так как разрешающее правило расположено раньше, то указанные в «белом» листе ресурсы будут доступны, несмотря на то, что будут попадать под правила «черного».
Как видим, технология URL-фильтрации по спискам при помощи squid очень проста и позволяет в кратчайшие сроки ограничить доступ к нежелательным ресурсам, ниже приведен набор используемых нами списков, которыми вы можете воспользоваться.

Читайте также:  Защита от DDoS с помощью tcpdump