Установка на Freebsd 10.1-rc3 squid 3.4.11

Squid будет с delay_pools, clamav сканирует трафик «на лету», squid guard, списки доступа acl …


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

       # portsnap fetch
       # portsnap extract

Либо, если порты уже были установлены, обновим их:

 # portsnap fetch update

Порты обновлены, можно начать установку. Все команды необходимо выполнять из-под root.

Установка squid:

Добавляем необходимые опции:

        | [X] DELAY_POOLS # Возможность "рубить скорость" пользователям
        | [X] ICAP
        | [X] LARGEFILE # Поддержка лог и кэш файлов большого объёма
        | [X] TP_IPFW	# Для создания "прозрачного" прокси

Устанавливаем squid:

       # cd /usr/ports/www && echo squid*
       # cd /usr/ports/www/squid
       # make config-recursive install clean

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

 # echo 'squid_enable="YES"' >> /etc/rc.conf

Приведём конфигурационный файл squid к следующему состоянию:

  # ee /usr/local/etc/squid/squid.conf
        # Рекомендованная минимальная конфигурация(Squid Cache: Version 3.4.11):
        #
 
        # Список внутренних сетей
        #acl localnet src 10.0.0.0/8     						# RFC1918 возможная внутренняя сеть
        #acl localnet src 172.16.0.0/12  						# RFC1918 возможная внутренняя сеть
        #acl localnet src 192.168.0.0/16 						# RFC1918 возможная внутренняя сеть
        #acl localnet src fc00::/7       						# RFC 4193 локальный частный диапазон сети
        #acl localnet src fe80::/10      						# RFC 4291 link-local (directly plugged) machines
        acl localnet src 192.168.0.0/24							# Наша локальная сеть
 
        # Вводим acl
        acl _boss src "/usr/local/etc/squid/acl/boss.acl"		# Пользователи, для которых нет ограничений
        acl _noinet src "/usr/local/etc/squid/acl/noinet.acl"	# Пользователи, которым закрыт доступ в интернет
        acl _slowusers src "/usr/local/etc/squid/acl/slowusers.acl"	# Пользователи, с ограниченим скорости доступа к интернету
        acl _forslowsite src "/usr/local/etc/squid/acl/forslowsite.acl"	# Пользователи, которым у которых будет порезана скорость, дерктивой _slowsite
        acl _slowsite dstdomain "/usr/local/etc/squid/acl/slowsite.acl"		# Домены, скорость доступа к которым ограничена
        acl _denysite dstdomain "/usr/local/etc/squid/acl/denysite.acl"		# Домены, доступ к которым закрыт
        acl _urlip url_regex -i ^http://[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/.* #Сайты с IP-адресами
 
        acl _MimeAudioVideo  rep_mime_type audio video 			# Mime-типы для аудио и видео
 
        #acl mobile urlpath_regex -i (\.thm|\.sis|\.swf|\.jad|\.jar|\.3gp|\.mp4)((\#|\&|\?|\s){1}|$)
        #acl multimedia urlpath_regex -i (\.swf|\.mp3|\.m3u|\.flv|\.wav|\.vqf|\.avi|\.wmv|\.mpeg|\.mp|\.asf|\.mpe|\.dat|\.mpg|\.wma|\.midi|\.aiff|\.au|\.qt|\.ram|\.rm|\.iso|\.raw|\.mov)((\#|\&|\?|\s){1}|$)
        #acl archive urlpath_regex -i (\.tar.gz|\.gz|\.tar|\.zip|\.rar|\.cab|\.arj|\.lzh|\.ace|\.7-zip|\.gzip|\.uue|\.bz2|\.iso)((\#|\&|\?|\s){1}|$)
        #acl soft urlpath_regex -i (\.exe|\.msi|\.rpm)((\#|\&|\?|\s){1}|$)
        #acl mp3 urlpath_regex -i (\.wav|\.mp3|\.mp4)((\#|\&|\?|\s){1}|$)
 
 
        #Не использовать IPv6, если доступен IPv4
        #По умолчанию, приоритет отдается протоколу IPv6, что может привести к ошибкам соединения, если IPv6 недоступен
        dns_v4_first on
 
        # Отображение местного времени на страницах ошибок
        error_directory /usr/local/etc/squid/errors.local/ru
 
        #При завершении работы ожидать закрытия клиентских подключений, так заявлено в документации
        #Фактически, ждет независимо от наличия подключений
        #По умолчанию - 30 секунд, сократим время ожидания до 1
        shutdown_lifetime 1 seconds
 
        log_mime_hdrs on 				# Протоколировать http-заголовки
        #forwarded_for transparent 		# Не отправлять заголовок X-Forwarded-For содержащий внутренний IP-адрес клиента
        #via off 						# Не отправлять заголовок Via с именем и версией прокси-сервера
        cache_mgr root@localhost 		# e-mail администратора, для отправки уведомлений об отказе кэша
 
        visible_hostname mail.domino.zavod-okon.info # Адрес сервера на страницах ошибок
 
        # Количество старых лог-файлов, которые нужно хранить
        logfile_rotate 10
 
        #Продолжить загрузку при отключении клиента, если осталось загрузить менее указанного объема данных
        #Позволяет сохранить объект в кэше при отмене загрузки клиентом
        #Значение 0 для quick_abort_min и quick_abort_max отменяют докачку
        #Значение -1 включает полную закачку объекта, не зависимо от оставшегося объема, повышает нагрузку на канал
        #По умолчанию 16 Кб
        #quick_abort_min 5 MB
 
        # Если пользователь прервал загрузку, когда скачано
        # не менее 70% файла, завершить его загрузку в кэш
        quick_abort_pct 70
 
        # Порты, с которыми будем работать
        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     # Убрать _ у method_ 
 
        # Конфигурация доступа
        # Запретить запросы на порты, которые не указаны в Safe_ports
        http_access deny !Safe_ports
 
        # Запретить запросы на порты, которые не указаны в SSL_ports
        http_access deny CONNECT !SSL_ports
 
        # Даём доступ к кешу, только с localhost
        http_access allow localhost manager
        http_access deny manager
 
        # Запретить доступ к локальным ресурсам сервера через прокси
        http_access deny to_localhost
 
        # Разрешаем доступ пользователям, для которых нет ограничений (не учитывается ограничение по скорости)
        http_access allow _boss
 
        # Блокируем пользователей, которым интернет не разрешён
        http_access deny _noinet
 
        # Блокировать запрещенные сайты
        http_access deny _denysite
 
        # Запретить доступ к сайтам по IP-адресу
        http_access deny _urlip
 
        # Разрешить доступ из локальной сети, всем кто не попадает под acl
        http_access allow localnet
 
        # Блокировать все, что не разрешено
        http_access deny all
 
        # Squid обычно слушает порт 3128
        http_port 192.168.0.1:3128
        # При прозрачном проксировании может использоваться для управления кэшем
        #http_port 127.0.0.1:3128
        # Локальный интерфейс, для трафика, перенаправленного брандмауэром. На этот порт редиректим файерволлом (80-83,8080-8088 --> 3129)
        #http_port 127.0.0.1:3129 intercept
 
        # Здесь указываем программу-редиректор, у нас -- это squidGuard.
        # В предыдущих версиях Squid этот параметр назывался redirect_program
        #url_rewrite_program /usr/local/bin/squidGuard -c   /usr/local/etc/squid/squidGuard.conf
 
 
        # Управление  скоростью доступа в Интернет посредством пулов
        # Количество пулов доступа
        delay_pools 3
        # Первая цифра -- номер пула, вторая -- класс пула, мы используем пулы только первого класса,
        # без деления на подсети
        delay_class 1 1
 
        # Отдельному пользователю 600 Кб/с, это ~5 Мб, думаю достаточно
        delay_class 1 1
        #delay_parameters 1 6000000/6000000
        delay_parameters 1 -1/-1 # вообще всё без ограничений (upd)
        delay_access 1 allow _boss
        delay_access 1 deny all
 
        # Кому-то не повезло, ограничиваем скорость до 32 Кб/с
        delay_class 2 1
        #delay_parameters 2 32000/128000
        delay_access 2 allow _slowusers
        #delay_access 2 allow loopback
        delay_access 2 deny all
 
        # Ограничение скорости доступа к сайтам, для определённого acl
        delay_class 3 1
        delay_parameters 3 15000/15000
        delay_access 3 allow _forslowsite
        delay_access 3 allow _slowsite
        delay_access 3 deny all
 
        # Учетная запись, с правами которой работает Squid
        cache_effective_user squid
        cache_effective_group squid
 
        # Местонахождение pid- и log- файлов
        coredump_dir /var/log/squid/cache 	# Путь должен быть такой же как и у cache_dir
        cache_log /var/log/squid/cache.log
        access_log daemon:/var/log/squid/access.log squid
        cache_store_log daemon:/var/log/squid/store.log # По-умолчанию отключен, вроде как и не нужен
 
        pid_filename /var/run/squid/squid.pid
 
        # Кэширование и параметры памяти
        # Кэш: формат, размещение, размер в мегабайтах на диске, число папок первой и второй вложенности
        # Указанный размер кэша не учитывает издержки файловой системы и должен быть примерно на 20% меньше доступного дискового пространства
        # Директиву cache_dir, можно указать несколько раз, выделив под кэш дополнительные разделы
        cache_dir ufs /var/squid/cache 16384 16 256
 
        #memory_pools off
        memory_pools_limit 100 MB
 
        # Не кэшировать файлы больше заданного размера
        maximum_object_size 2048 MB # По умолчанию 4Мб
        maximum_object_size_in_memory 2 Mb
 
        cache_mem 512 MB # Размер оперативной памяти, отводимой под кэш
 
        # Поддержка функционала icap-клиента:
        #icap_enable          on
        #icap_preview_enable  on
        #icap_preview_size    128
        #icap_send_client_ip  on
        #icap_service         service_avi_req reqmod_precache 0 icap://localhost:1344/avscan
        #icap_service         service_avi respmod_precache 1 icap://localhost:1344/avscan
        #icap_class           class_antivirus_req service_avi_req
 
        # Для каждого имени icap_service указываем отдельную строку icap_class,  а не все сервисы
        # в одной строке, как предлагается в configuration guide на сайте проекта c-icap:
        # "icap_class class_antivirus service_avi service_avi_req", иначе  Squid при запуске выдаст сообщение:
        # "WARNING: Multiple ICAP services per icap_class
        # are not yet supported."
        #icap_class           class_antivirus service_avi
 
        # Соответственно получаем две строки icap_access для двух классов icap_class
        #icap_access          class_antivirus_req allow all
        #icap_access          class_antivirus allow all
 
        # Время устаревания кэшируемого контента в минутах, если явно не задано сервером
        # Поля: шаблон соответствия URL, минимальное время в минутах, процент для расчета времени устаревания объекта, максимальное время в минутах
        # Если повторный запрос приходит до наступления минимального времени, объект считается актуальным, запрос к серверу не выполняется
        # Расчет времени жизни производится по формуле: (ВремяПолучения-ВремяСоздания)*Процент
        # Чем старее объект, тем дольше он содержится в кэше, но не дольше заданного максимального времени
        # http://etutorials.org/Server+Administration/Squid.+The+definitive+guide/Chapter+7.+Disk+Cache+Basics/7.7+refresh_pattern/
        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

Создадим папку с acl

 # mkdir -pv /usr/local/etc/squid/acl

Создадим файлы acl, установим на них права и необходимо заполнить их

       # cd /usr/local/etc/squid/acl
       # touch boss.acl noinet.acl slowusers.acl slowsite.acl forslowsite.acl denysite.acl
       # chown -R squid:wheel /usr/local/etc/squid/acl
       # chmod -R 0770 /usr/local/etc/squid/acl

Проверим конфиг squid на ошибки

 squid -f /usr/local/etc/squid/squid.conf -k parse

Создадим структуру кэша

# /usr/local/sbin/squid -z

Настроим отображение местного времени на страницах ошибок squid

       # mkdir -pv /usr/local/etc/squid/errors.local/ru
       # cp /usr/local/etc/squid/errors/ru/* /usr/local/etc/squid/errors.local/ru
       # sed -i .bak "s/%T/%t/g" /usr/local/etc/squid/errors.local/ru/* && rm /usr/local/etc/squid/errors.local/ru/*.bak # Заменяем общемировое время (%T), на местное (%t)

Теперь запустим squid, что бы убедиться что он работает:

 # service squid start

Проверяем, стартанул ли демон:

 # ps -ax | grep squid

Проверяем, слушается ли сокет:

 # sockstat | grep squid

Проверяем системный лог на наличие сообщений от Squid:

 # grep squid /var/log/messages

Проверяем cache.log:

 # cat /var/log/squid/cache.log

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

# squid -k reconfigure

Решение проблем

Предупреждение в cache.log:

WARNING: no_suid: setuid(0): (1) Operation not permitted

Баг Squid появился в версии 3.2, возникает на BSD-системах, из-за некорректного вызова функции setuid.
Баг-репорт: http://bugs.squid-cache.org/show_bug.cgi?id=3785
В зависимости от параметров конфигурации Squid, в некоторых случаях помогает изменение параметра daemon на stdio при указании пути к access.log-у.
Ошибка при запуске Squid:

FATAL: Bungled /usr/local/etc/squid/squid.conf line 64: acl manager proto cache_object

Начиная с версии 3.2 списки контроля доступа: manager, localhost и to_localhost являются предопределенными и создаются сквидом автоматически. При попытке их переопределения в файле конфигурации возникает ошибка. Данные параметры необходимо удалить из конфига.
Ошибка в cache.log:

ERROR: No forward-proxy ports configured.

Не задан порт для входящих подключений. Проверяем наличие в squid.conf директивы:
http_port 3128
В случае с прозрачным прокси, начиная с версии 3.2, необходимо открывать два порта. Один для стандартных запросов, второй для перенаправляемого трафика. Если прием входящих подключений к прокси не требуется, указываем внутренний адрес:
http_port 127.0.0.1:3128
При запуске Squid получаем следующие предупреждения:

WARNING: (A) '192.168.0.0/16' is a subnetwork of (B) '::/0'
WARNING: because of this '192.168.0.0/16' is ignored to keep splay tree searching predictable
WARNING: You should probably remove '192.168.0.0/16' from the ACL named 'all'

В файле конфигурации обнаружена декларация acl all. В третьей версии список контроля доступа all является предопределенным и создается сквидом автоматически. При попытке его переопределения в файле конфигурации возникает ошибка. Удалите или переименуйте acl all.
В cache.log постоянно пишутся предупреждения:

WARNING: transparent proxying not supported
При сборке не была включена поддержка прозрачного прокси для вашего брандмауэра. Переустановите Squid из коллекции портов с включением соответствующих параметров.
ERROR: db_open permission denied

установить права на каталог

chmod -R 770 /var/lib/squidguard/db/*
chown -R squid:squid /var/lib/squidguard/db/*

и перезапускаем squid

# service squid restart