Настройка Squid 3 в качестве прозрачного прокси в FreeBSD

Настраиваем Squid в качестве прозрачного прокси-сервера для небольшой сети.

Содержание

Установка Squid

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

pkg install squid

Бинарный пакет собран с поддержкой прозрачного прокси с перенаправлением пакетов с помощью IPFW. Если требуется поддержка прозрачного прокси с брандмауэром отличным от IPFW, необходима сборка Squid из коллекции портов.

Настройка Squid

В FreeBSD 9.1 и более ранних версиях для работы прозрачного прокси с IPFW необходима настройка ядра. Начиная с FreeBSD 9.2, настройка ядра не требуется.

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

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.conf:

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

Из коробки на страницах ошибок Squid отображает время по Гринвичу, для отображения местного времени необходимо скорректировать шаблоны ошибок. Параметр шаблона %T указывает мировое время, %t - местное.

Копируем шаблоны ошибок в папку erros.local:

mkdir -p /usr/local/etc/squid/errors.local/ru
cp /usr/local/etc/squid/errors/ru/* /usr/local/etc/squid/errors.local/ru

Заменяем общемировое время (%T), на местное (%t):

sed -i .bak "s/%T/%t/g" /usr/local/etc/squid/errors.local/ru/* && rm /usr/local/etc/squid/errors.local/ru/*.bak

Задаем путь к измененным шаблонам ошибок в squid.conf:

printf "\n\n #Местное время на страницах ошибок\nerror_directory /usr/local/etc/squid/errors.local/ru\n" >> /usr/local/etc/squid/squid.conf

Запуск 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

Протокол управления кэшем Squid

Для получения статистики и оперативного управления кэшем, используем squidclient.

Получить общую статистику сервера:

squidclient cache_object://localhost/info

Получить список доступных действий:

squidclient cache_object://localhost/menu

Получить текущие параметры конфигурации:

squidclient -U admin -W пароль cache_object://localhost/config

Для работы этой команды необходимо задать пароль в squid.conf:

# Пароль для различных действий протокола управления кэшем
# По умолчанию пароль не задан, действия требующие ввода пароля отключены
# Используйте all, чтобы задать пароль на все действия
cachemgr_passwd пароль config

Управление кэшем возможно также из браузера. Если на сервере браузер не установлен, можно разрешить доступ с другого компьютера, для этого потребуется скорректировать параметры разрешений в squid.conf:

# IP-адрес, для удаленного управления кэшем
acl CacheManagerIP src 192.168.0.2

# Разрешить удаленное управление кэшем
http_access allow localhost manager
http_access allow CacheManagerIP manager
http_access deny manager

Для управления кэшем используем URL следующего формата: http://адрес:3128/squid-internal-mgr/действие:

  • Статистика сервера - http://192.168.0.1:3128/squid-internal-mgr/info
  • Список доступных действий - http://192.168.0.1:3128/squid-internal-mgr/menu
  • Параметры конфигурации - http://admin:пароль@192.168.0.1:3128/squid-internal-mgr/config

Настройка IPFW

Далее предполагается, что IPFW настроен на примере, предложенном в руководстве FreeBSD.

Открываем rc.conf:

ee /etc/rc.conf

Проверяем, включена ли маршрутизация:

gateway_enable="YES"

Если необходимо, включаем NAT:

natd_enable="yes"               # Включить функцию NATD
natd_interface="em0"            # Название внешнего сетевого интерфейса
natd_flags="-dynamic -m"        # -m = по возможности сохранить номера портов

Находим параметры IPFW:

firewall_enable="YES"
firewall_script="/etc/ipfw.rules"

Запоминаем путь к скрипту с правилами.

Редактируем список правил IPFW:

ee /etc/ipfw.rules

Добавляем правила, выделенные красным, перед правилом, разрешающим доступ в интернет:

#!/bin/sh
cmd="ipfw -q add"
skip="skipto 500"

# Внешний интерфейс
pif=em0

ipfw -q -f flush

# Разрешить SSH-доступ администратору с заданного IP-адреса
# Раскомментируйте, чтобы не перекрыть себе доступ в случае проблем с настройкой брандмауэра
#$cmd 001 allow ip from x.x.x.x to me dst-port 22 in via $pif
#$cmd 001 allow ip from me to x.x.x.x src-port 22 out via $pif

$cmd 002 allow all from any to any via em1  # разрешаем трафик на локальном интерфейсе
$cmd 003 allow all from any to any via lo0  # разрешаем трафик на интерфейсе loopback

$cmd 100 divert natd ip from any to any in via $pif
$cmd 101 check-state

# Разрешаем доступ пользователю Squid
$cmd 124 allow all from me to any out via $pif keep-state uid squid
# Отправляем http-запросы на порт прозрачного прокси
$cmd 125 fwd 127.0.0.1,3128 tcp from 192.168.0.0/16 to any 80 out via $pif keep-state

$cmd 130 $skip all from any to any out via $pif keep-state

# Запрещаем весь входящий трафик с немаршрутизируемых адресных пространств
#$cmd 300 deny all from 192.168.0.0/16  to any in via $pif  #RFC 1918 для локальных IP
$cmd 301 deny all from 172.16.0.0/12   to any in via $pif  #RFC 1918 для локальных IP
$cmd 302 deny all from 10.0.0.0/8      to any in via $pif  #RFC 1918 для локальных IP
$cmd 303 deny all from 127.0.0.0/8     to any in via $pif  #loopback
$cmd 304 deny all from 0.0.0.0/8       to any in via $pif  #loopback
# Закомментировать, если внешний интерфейс использует DHCP
$cmd 305 deny all from 169.254.0.0/16  to any in via $pif  #DHCP авто-конфигурации
$cmd 306 deny all from 192.0.2.0/24    to any in via $pif  #Зарезервировано для документации
$cmd 307 deny all from 204.152.64.0/23 to any in via $pif  #Sun cluster
$cmd 308 deny all from 224.0.0.0/3     to any in via $pif  #Class D & E multicast

# Разрешаем входящие пакеты
#$cmd 400 allow udp from xx.70.207.54 to any 68 in keep-state
#$cmd 420 allow tcp from any to me 80 in via $pif setup limit src-addr 1


$cmd 450 deny log ip from any to any

# Раздел skipto для правил с сохранением состояния для исходящих пакетов
$cmd 500 divert natd ip from any to any out via $pif
$cmd 510 allow ip from any to any

######################## Окончание файла правил ##################

Если менялись параметры rc.conf, включаем маршрутизацию и NAT. Будьте осторожны при настройке брандмауэра с внешнего IP, есть риск перекрыть себе доступ.

service routing restart
service natd start

Загружаем обновленный список правил:

sh /etc/ipfw.rules

Инициируем веб-трафик с клиентского компьютера, проверяем лог доступа:

tail -f /var/log/squid/access.log

В случае проблем проверяем, работает ли правило брандмауэра:

ipfw show

Счетчик для правила перенаправления (fwd 127.0.0.1,3128) не должен быть нулевым.

Если перенаправление работает, но сайты не открываются, проверяем cache.log на предмет ошибок:

cat /var/log/squid/cache.log

Ротация логов Squid

Проверяем, поддерживается ли вашей системой newsyslog.conf.d

ls /etc/newsyslog.conf.d

Если в вашей системе отсутствует папка newsyslog.conf.d, редактируем newsyslog.conf:

ee /etc/newsyslog.conf

Если папка newsyslog.conf.d имеется, создаем папку с тем же именем в /usr/local/etc:

mkdir /usr/local/etc/newsyslog.conf.d

Создаем файл правил ротации логов Squid:

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

Задаем правила ротации логов:

/var/log/squid/access.log squid:squid 600 180 * $D0 JC /var/run/squid/squid.pid 30
/var/log/squid/cache.log  squid:squid 600 180 * $D0 JC /var/run/squid/squid.pid 30
#/var/log/squid/store.log  squid:squid 600  30 * $D0 JC /var/run/squid/squid.pid 30

Выполняем ротацию ежедневно в полночь, сохраняем логи за последние 180 дней, раскомментируйте store.log, если он используется в вашей системе.

Для корректной ротации логов в squid.conf необходимо добавить следующий параметр:

# Отключить встроенную ротацию логов
# При ротации логов средствами newsyslog
logfile_rotate 0

Кэширование контента в Squid

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

По умолчанию дисковый кэш отключен, но в качестве кэша используется 256Мб оперативной памяти.

Полностью запретить кэширование можно добавив следующий параметр в squid.conf:

# Запретить кэширование
cache deny all

Если необходим дисковый кэш, добавляем в squid.conf следующие параметры:

# Кэш: формат, размещение, размер в мегабайтах, число папок первой и второй вложенности
# Указанный размер кэша не учитывает издержки файловой системы и должен быть примерно на 20% меньше доступного дискового пространства
# Директиву cache_dir, можно указать несколько раз, выделив под кэш дополнительные разделы
cache_dir ufs /var/squid/cache 3000 16 256

# Не кэшировать файлы больше заданного размера
# По умолчанию 4Мб
maximum_object_size 320 MB

# Продолжить загрузку при отключении клиента, если осталось загрузить менее указанного объема данных
# Позволяет сохранить объект в кэше при отмене загрузки клиентом
# Значение 0 для quick_abort_min и quick_abort_max отменяют докачку
# Значение -1 включает полную закачку объекта, не зависимо от оставшегося объема, повышает нагрузку на канал
# По умолчанию 16 Кб
quick_abort_min 5 MB

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

mkdir -p /usr/local/squid/cache
chown root:squid /usr/local/squid/cache
chmod 770 /usr/local/squid/cache

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

/usr/local/sbin/squid -z

Ограничения доступа к сайтам и контенту в Squid

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

Фильтрация по типу контента передаваемого по HTTPS-протоколу невозможна ни в прозрачном, ни в не прозрачном режиме.

Для настройки ограничений, корректируем squid.conf следующим образом:

...
acl CONNECT method CONNECT


# Путь к списку IP-адресов пользователей, для которых не действуют запреты
#acl AdminsIP src "/usr/local/etc/squid/AccessLists/AdminsIP.txt"

# Путь к списку запрещенных сайтов
#acl RestrictedDomains dstdomain "/usr/local/etc/squid/AccessLists/RestrictedDomains.txt"

# Mime-типы для аудио и видео
#acl MimeAudioVideo  rep_mime_type audio video

# Сайты с IP-адресами
#acl UrlIP url_regex -i ^http://[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/.*


#
# Рекомендованный минимум настройки прав доступа:
#
# Запретить доступ к портам, отсутствующим в списке выше
http_access deny !Safe_ports

# Запретить метод CONNECT не на SSL-порт
http_access deny CONNECT !SSL_ports

# Разрешить только локальное управление кэшем
http_access allow localhost manager
http_access allow manager CacheManagerIP
http_access deny manager

# Запретить доступ к локальным ресурсам сервера через прокси
# Настоятельно рекомендуется задать это правило, чтобы исключить внешний доступ
# к приложениям, принимающим локальные подключения по адресу 127.0.0.1.
http_access deny to_localhost

#
# Задайте свои правила доступа для клиентов
#

# Не ограничивать локальный доступ с сервера
http_access allow localhost

# Не ограничивать доступ администраторам
#http_access allow AdminsIP

# Блокировать запрещенные сайты
#http_access deny RestrictedDomains

# Запретить доступ к сайтам по IP-адресу
#http_access deny UrlIP


# Образец правила разрешающего доступ в интернет из вашей локальной сети
# Список ваших внутренних IP-сетей, задается в acl localnet
http_access allow localnet

# Последнее правило, блокирует все, что не было разрешено выше
http_access deny all


#
#Фильтрация по HTTP-заголовкам в ответе сервера, с HTTPS не работает
#

# Не ограничивать доступ администраторам
#http_reply_access allow AdminsIP

# Блокировать загрузку аудио/видео контента
# Успех блокировки зависит от используемого протокола
# и корректности MIME-типа, отправляемого сервером
#http_reply_access deny MimeAudioVideo

# Разрешить весь остальной контент
http_reply_access allow all



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

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

mkdir /usr/local/etc/squid/AccessLists 

Создаем необходимые списки, значения в списке разделяются новой строкой.

Список IP-адресов с неограниченным доступом:

ee /usr/local/etc/squid/AccessLists/AdminsIP.txt

Список сайтов, доступ к которым запрещен пользователям. Точка в начале адреса блокирует доступ ко всем адресам в заданном домене. Для массовой блокировки развлекательных ресурсов потребуется установка редиректора SquidGuard.

ee /usr/local/etc/squid/AccessLists/RestrictedDomains.txt

Перезапускаем Squid:

service squid restart

Подмена заголовков в запросе клиента в Squid

Дело было на домашнем Debian-сервере. Один из интернет радио порталов напрочь отказывался воспроизводиться на моем музыкальном центре, настойчиво предлагая закрыть плейер и открыть браузер. К сожалению, не смотря на наличие интернета, браузер в музыкальном центре конструкцией не был предусмотрен. Пришлось замаскировать центр под браузер путем подмены заголовка User-Agent с помощью Squid'а и прозрачного проксирования.

Для подмены HTTP-заголовка, добавляем три опции в squid.conf:

# Подмена HTTP-заголовка User-Agent
# Задаем IP-адрес устройства, для которого требуется подмена
acl MediaDevice src 192.168.0.3
# Запрещаем передачу HTTP-заголовка User-Agent
request_header_access User-Agent deny MediaDevice
# Включаем подмену HTTP-заголовка User-Agent, задаем браузер по вкусу ;)
request_header_replace User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0

Перезапускаем Squid:

service squid restart

Поскольку это безобразие нагло нарушает HTTP-стандарт, требуется сборка Squid с параметром LAX_HTTP, он же --enable-http-violations.

Перенос логов доступа Squid

Логи доступа Squid могут занимать достаточно большой объем. На старых установках, где /var/log размещен на отдельном небольшом разделе, приходится перемещать лог доступа в /usr/local.

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

mkdir -p /usr/local/squid/log
chown root:squid /usr/local/squid/log
chmod 770 /usr/local/squid/log

Останавливаем Squid:

service squid stop

Перемещаем логи в новое расположение:

mv /var/log/squid/* /usr/local/squid/log

Удаляем папку /var/log/squid и создаем ссылку на /usr/local/squid/log:

rmdir /var/log/squid
ln -s /usr/local/squid/log /var/log/squid

Запускаем Squid:

service squid start

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

Предупреждение в 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. Одина для обычных запросов, вторая для перенаправляемого трафика:

http_port 3128
http_port 127.0.0.1:3128 intercept


При запуске 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 из коллекции портов с включением соответствующих параметров.

Установка Squid из коллекции портов

Обновляем коллекцию портов:

portsnap fetch update

Если коллекция портов используется впервые, получаем ее актуальную версию:

portsnap fetch extract

Выполняем настройку порта:

cd /usr/ports/www/squid
make config

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

[x] LARGEFILE      Support large (>2GB) cache and log files
[x] LAX_HTTP       Do not enforce strict HTTP compliance
...
[ ] TP_IPF         Enable transparent proxying with IPFilter
[x] TP_IPFW        Enable transparent proxying with IPFW
[ ] TP_PF          Enable transparent proxying with PF

 

Если необходима модификация HTTP-заголовков (использование опций via, request_header_access), также включаем LAX_HTTP, для сборки Squid с параметром --enable-http-violations.

Устанавливаем порт:

make install clean

Если параметры сборки были изменены, блокируем переустановку Squid пакетным менеджером:

pkg lock squid

Пакетный менеджер и кастомизированный Squid

При обновлении, пакетный менеджер обнаружит порт, собранный с нестандартными параметрами и предложит выполнить переустановку. После установки бинарного пакета прозрачный прокси перестанет работать.

Частично проблему можно решить, заблокировав обновление Squid:

pkg lock squid

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

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

Обновляем коллекцию портов:

portsnap fetch update

Снимаем блокировку обновления пакета:

pkg unlock squid

Обновляем установленные пакеты:

pkg upgrade

Компилируем Squid, будут использованы параметры компиляции, заданные при первичной установке:

cd /usr/ports/www/squid
make

Удаляем Squid:

pkg delete squid

Собираем и устанавливаем Squid:

make install clean

Блокируем переустановку Squid:

pkg lock squid

Перезапускаем Squid:

service squid restart

Настройка ядра (FreeBSD 9.1 и ранее)

Начиная с FreeBSD 9.2 настройка ядра не требуется, форвардинг пакетов отныне включен изначально, параметр IPFIREWALL_FORWARD удален из настроек ядра.

Для работы в режиме прозрачного прокси в версиях системы до 9.2 необходимо обеспечить перенаправление веб-трафика прокси-серверу. Если в качестве брандмауэра используется IPFW, необходимо включить форвардинг пакетов пересобрав ядро с опцией IPFIREWALL_FORWARD.

В ядре GENERIC опция перенаправления по умолчанию отключена. Чтобы проверить, включено ли перенаправление пакетов в вашей системе, выполняем команду:

grep ipfw /var/run/dmesg.boot

Получаем следующий результат:

ipfw2 (+ipv6) initialized, divert loadable, nat loadable, rule-based forwarding disabled, default to deny, logging disabled

Если видим: "rule-based forwarding disabled", форвардинг отключен, необходимо пересобрать ядро. Если сообщение отсутствует, значит IPFW не настроен.  Если отсутствует параметр "rule-based forwarding", пересборка ядра не требуется.

Получаем идентификатор ядра:

uname -i

Если ранее ядро не изменялось, в результате получаем:

GENERIC

Создаем файл конфигурации ядра IPFORWARD:

ee /usr/src/sys/i386/conf/IPFORWARD

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

#Импортировать параметры из конфига GENERIC
include GENERIC

#Идентификатор ядра, должен совпадать с названием файла конфигурации ядра, отображается в процессе загрузки
ident IPFORWARD

#Включить перенаправление пакетов
options IPFIREWALL
options IPFIREWALL_FORWARD

Переходим в папку с исходниками системы:

cd /usr/src

Если файлы в /usr/src отсутствуют, необходимо установить исходники, соответствующие вашей версии системы.

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

make kernel KERNCONF=IPFORWARD

Перезагружаем систему:

shutdown -r now

Проверяем идентификатор ядра:

uname -i

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

IPFORWARD

Проверяем статус IPFW:

grep ipfw /var/run/dmesg.boot

В случае успеха получаем:

ipfw2 (+ipv6) initialized, divert loadable, nat loadable, rule-based forwarding enabled, default to deny, logging disabled

Дополнительная информация

Список всех параметров конфигурации:  /usr/local/etc/squid/squid.conf.documented

Документация на сайте проекта: http://www.squid-cache.org/Doc/

Bog BOS: Squid (кеширующий прокси для http): установка, настройка и использование

 

 

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

RSS
  • Артем Игоревич
    04.01.2019 11:52
    Отличная статья!! Спасибо!! Интересно так же узнать, вы настраивали https в squid??
    • IT Adept
      04.01.2019 23:18
      У меня https-прокси работает только в штатном (непрозрачном) режиме.
  • RamiL`
    03.03.2018 13:46
    Спасибо за статью! реально все работает на Freebsd 11, я реально замучился c файрволом IPFW 2 дня мучился. короче скопипастил я твой конфиг IPFW подправил и на млин запахало )))) я в шоке).

    Ты в своей статьи забыл кое что : давно я собирал ядро еще в 2014г, и у тебя увидел что отсутсвует пункт инстал,,, # make installkernel KERNCONF= Ядро

    А так спс, ну просто выручил меня!
    • IT Adept
      03.03.2018 16:17
      Сборка и установка ядра:

      make kernel KERNCONF=ЯДРО

      Сборка ядра без установки:

      make buildkernel KERNCONF=ЯДРО

      Установка ранее собранного ядра:

      make installkernel KERNCONF=ЯДРО

      Начиная с FreeBSD 9.2 настройка ядра не требуется. Этот раздел можно удалять, ибо уже не актуально.

      С массовым внедрением HTTPS прозрачное проксирование скоро тоже станет историей. На своих серверах прозрачный прокси отключил. Использую только стандартный непрозрачный режим, там где требуется инет ограничивать.
  • Александр
    09.08.2016 19:59
    Не могу понять почему после настройки ipfw ничего не скачивается и не ставится. Есть мысли? Если делаю firewall - open все нормально.
    • IT Adept
      09.08.2016 22:14

      Отключение правила для прозрачного прокси решает проблему?:

      fwd 127.0.0.1,3128 tcp from any to any 80 out via $pif keep-state
      

      Попробуйте заменить на:

      fwd 127.0.0.1,3128 tcp from 192.168.0.0/16 to any 80 out via $pif keep-state
      

      Также проверьте наличие следующего правила:

      # Разрешить исходящий трафик для FreeBSD (make install & CVSUP)
      # По сути назначаем пользователю root полные привилегии.
      $cmd 00240 allow tcp from me to any out via $pif setup keep-state uid root
      
      • Александр
        10.08.2016 20:19
        Да. Все супер. Спасибо большое. Только у меня локалка 10.0.0.0/8
      • Александр
        11.08.2016 08:12
        Кальмар не грузит youtube.com Посоветуйте пожалуйста!
        • Александр
          11.08.2016 10:35
          cache.log пишет
          kid1| SECURITY ALERT: on URL: www.youtube.com:443
          • IT Adept
            11.08.2016 12:28
            HTTPS прозрачно не проксирую, не в курсе.
            • Александр
              13.09.2016 08:09
              Такой вопрос. За сквидом поставили роутер, т.е. гостевой доступ. Ему присвоили локальный айпи на внешний интерфейс, как его загнать в сквид? Может в настройках WAN роутера шлюз указать как 10.0.0.1:3128?
              • IT Adept
                13.09.2016 11:16
                Установить прозрачный сквид на шлюз 10.0.0.1.

                В настройках роутера прописать шлюз со сквидом: 10.0.0.1.
      • Александр
        03.10.2016 17:58
        Еще такой вопрос. В старой версии Вашей статьи был скрипт на проверку наличия процесса squid и если таковой отсутствовал, то посылалась команда на запуск сквида. Можете напомнить? Заранее спасибо.
        • IT Adept
          04.10.2016 21:29

          Скрипт писался для Squid 2.7, который изредка падал. В 3 версии этой проблемы нет, Squid не падал ни разу.

          Костыль более не требуется, я не использую этот скрипт на своих серверах.

          Лучше устранить причину нестабильной работы.


          Создаем сценарий AutoRestart:

          ee /usr/local/etc/squid/AutoRestart

          Со следующим содержимым:

          #!/bin/sh
          
          #Проверяем, загружен ли Squid, выходим в случае успеха
          /usr/local/sbin/squid -k check >/dev/null 2>&1 && return
          
          #Запускаем Squid
          /usr/local/etc/rc.d/squid start

           

          Разрешаем запуск скрипта:

          chmod 700 /usr/local/etc/squid/AutoRestart
          

          Выполняем тестовый запуск:

          /usr/local/etc/rc.d/squid stop
          /usr/local/etc/squid/AutoRestart
          

          Запускаем через cron каждые 15 минут:

          printf '\n*/15\t*\t*\t*\t*\troot\t/usr/local/etc/squid/AutoRestart\n' >>/etc/crontab && cat /etc/crontab
          
          • Александр
            30.10.2016 07:40
            Спасибо большое!!!
            • Александр
              30.10.2016 10:51
              Пока не пойму почему падает sams, но на всякий случай сделал так:
              #!/bin/sh
              pgrep -l sams >/dev/null 2>&1 && return
              service sams start
    • Александр
      22.08.2016 07:40
      А нет у вас в планах написать про SAMS2? Именно со вторым самсом у меня возникла проблема с отображением статистики пользователя за день. Вообще пусто на странице. Все остальные отчеты показывает.
      • IT Adept
        22.08.2016 22:37
        SAMS2 не использую, не в теме.
  • Александр
    09.08.2016 00:06
    Спасибо. Очень хорошая статья! Правильно я понял, что посещение по сайтам https:// не логируется вообще?
    • Александр
      09.08.2016 01:08
      Все. Поправил. По статье отсюда https://habrahabr.ru/post/267851/ сделал сертификат и добавил в конфиг и файрвол несколько изменений. В squid.conf
      https_port 127.0.0.1:3129 intercept ssl-bump options=ALL:NO_SSLv3:NO_SSLv2 connection-auth=off cert=/usr/local/etc/squid/squidCA.pem
      always_direct allow all
      sslproxy_cert_error allow all
      sslproxy_flags DONT_VERIFY_PEER
      acl step1 at_step SslBump1
      ssl_bump peek step1

      А в файрвол

      $cmd 126 fwd 127.0.0.1,3129 tcp from any to any 443 out via $pif keep-state

      Еще раз спасибо за статью.
  • Николай
    26.02.2016 04:24
    Прошу помощи в одном вопросе, как заверяют на многих сайтах, https нормально проксируется только с версией 3.5.8, каким образом можно ее загнать на freeBSD если установка из портов невозможна, то есть я так понимаю надо установить вручную, я устанавливаю, но стартануть не могу... выдает:
    root@squid:/tmp/squid-3.5.8 # service squid start
    squid does not exist in /etc/rc.d or the local startup
    directories (/usr/local/etc/rc.d)
    • IT Adept
      26.02.2016 10:48
      Init-скрипт можно из любой версии порта скопировать. Для теста можно и напрямую Squid запустить, командой из терминала.

      Если коллекция портов обновляется через Subversion, то можно откатить порт до версии 3.5.8.

      Возможно также потребуется сборка определенной версии OpenSSL/LibreSSL.

      В версии 3.5.8 возможность прозрачного проксирования HTTPS только появилась, и, судя по отзывам, работала нестабильно.

      Фишка сырая, в продакшене использовать настоятельно не советую.
      • Николай
        27.02.2016 09:00
        Init-скрипт можно из любой версии порта скопировать. Для теста можно и напрямую Squid запустить, командой из терминала.

        Вот тут подскажите по подробнее, у меня есть версия 3.5.8 каким образом мне залить в порты ее?
        • IT Adept
          27.02.2016 11:00

          Чтобы получить init-скрипт, устанавливаем порт, копируем init-скрипт, удаляем порт, ставим самособранный Squid, копируем init-скрипт обратно.

          Как запустить из терминала, читаем man squid.

          Чтобы откатить коллекцию портов к определенной версии, синхронизируем порты с помощью svnlite, далее откатываем порт к определенной ревизии. Команды тут, номер ревизии можно найти тут. Если ранее коллекция обновлялась через portsnap, ее необходимо удалить и получить заново через svnlite.

          • Николай
            01.03.2016 10:57
            может у вас там опечатка имеется? В строке svnlite checkout svn://svn.FreeBSD.org/ports/head /usr/ports может правильно вот так svnlite checkout http://svn.FreeBSD.org/ports/head /usr/ports
            • Николай
              14.03.2016 10:37
              Создал bug\report на squid-cache.org жду что ответят, создал на версию 3.5.15
        • IT Adept
          27.02.2016 11:31
          Не представляю, как вы его сопровождать потом собираетесь.

          Вот например сегодня пришло: Squid -- remote DoS in HTTP response processing, уязвима вся 3-я ветка, исправлено в версии 3.5.15.

          Пара, тройка подобных проблем с безопасностью в год периодически возникает.
          • Николай
            01.03.2016 08:52
            Я думаю это уместно когда у вас машина является шлюзом, а у меня схема немного иная, Free+wccp+squid
            • Николай
              02.03.2016 07:48
              в общем тоже пока что не получилось, процесс крашится с периодичностью 3-5 минут, в логи вылетает:
              FATAL: Received Segment Violation...dying.
              2016/03/02 11:56:56 kid1| Closing HTTP port 0.0.0.0:3128
              2016/03/02 11:56:56 kid1| Closing HTTP port 127.0.0.1:3128
              2016/03/02 11:56:56 kid1| Closing HTTPS port 127.0.0.1:3129
              2016/03/02 11:56:56 kid1| storeDirWriteCleanLogs: Starting...
              2016/03/02 11:56:56 kid1| Finished. Wrote 0 entries.
              2016/03/02 11:56:56 kid1| Took 0.00 seconds ( 0.00 entries/sec).
              CPU Usage: 0.126 seconds = 0.089 user + 0.037 sys
              Maximum Resident Size: 95952 KB
              Page faults with physical i/o: 0
              Пока думаю что делать дальше.
  • Николай
    12.11.2015 09:41
    Здравствуйте. Отличная статья, и спасибо вам за это. Можете пожалуйста подсказать можно ли блокировать https посредством сквида? на данный момент собрано все на freeBSD+squid+ipfw. Спасибо!.
    • IT Adept
      10.12.2015 13:40
      Поддержка прозрачного проксирования HTTPS без расшифровки трафика добавлена в версии Squid 3.5.8.

      Подробности: habrahabr.ru/post/267851/.
      • Николай
        14.01.2016 06:54
        Да спасибо. Просто у меня вопрос как сие реализовать на FreeBSD? Пробовали ли вы у себя? :)
        • Валерий
          08.02.2016 11:28
          Про FreeBSD не ответили... Пробовал кто нибудь?
          • IT Adept
            08.02.2016 20:02
            Я не пробовал.

            Судя по комментариям по ссылке выше, фишка новая и недостаточно стабильная.

            Лично я бы предпочел классический непрозрачный прокси.
            • Николай
              09.02.2016 02:41
              непрозрачный не вариант :( юзвери нынче очень продвинутые, и убрать прокси из браузера это очень легко...
              • IT Adept
                09.02.2016 09:46
                Естественно с закрытием прямого доступа в интернет, как минимум HTTP, HTTPS и внешние прокси.

                Иначе любые административные ограничения продвинутый пользователь обойдет в два клика.
                • Николай
                  17.02.2016 11:31
                  В принципе настроил, только пока что протестировал только на своей машине (завернув трафик только на свой ай пи). Завтра думаю запустить в серию. По результатам отпишусь вам :)
                  • Николай
                    19.02.2016 02:57
                    Пока в общем отбой, так как я пытаюсь сие сделать на фре, там есть свои подводные камни, но 443 порт редиректится без проблем, осталось разобраться что бы работало как надо.
  • Николай
    25.08.2015 03:08
    Приветствую. Всегда пользуюсь вашим мануалом по настройке, но вот что то пропал блок по ротации логов и по формированию кеша. Не вернете ли? Спасибо. Статья как всегда хороша.
    • IT Adept
      25.08.2015 22:59

      Раздел о ротации логов имеется, он был переписан. В комментариях был предложен более элегантный вариант.

      Формирование кэша вынесено в отдельный раздел, соответствующая ссылка установлена в конце основного конфига.

      На своих серверах кеширование отключил.

      Спасибо, стараюсь поддерживать материал в актуальном состоянии.

  • Владимир
    21.08.2015 14:30
    СПАСИБО!!! Навертели они с 3 сквидом...
  • Василий
    05.02.2015 14:24
    Включаем Squid в rc.conf:
    printf '\nsquid_enable=\"YES\"\n' >>/etc/rc.conf

    В чем смысл таких замудрений?))
    echo 'squid_enable="YES"' >> /etc.rc.conf
    не попроще будет?))
    За статью спасибо ;)
    • IT Adept
      06.02.2015 00:44
      После правки текстовым редактором в конце файла может быть не выставлен перевод строки. В этом случае при использовании команды echo два параметра окажутся в одной строке.

      Смысл замудрения в том, что printf гарантированно выставляет перевод строки в начале параметра.
  • Zwolfen
    23.10.2014 20:10

    все хорошо, кроме ротации логов. newsyslog делает все сам при прописывании в нем следующих строчек:

    /var/log/squid/access.log squid:squid 644 365 1000 $D4 JC /var/run/squid.pid 30
    /var/log/squid/cache.log squid:squid 644 365 1000 $D4 JC /var/run/squid.pid 30
    /var/log/squid/store.log squid:squid 644 365 1000 $D4 JC /var/run/squid.pid 30
    

    да, еще и архивирует их, для экономии места.

  • zeus
    12.05.2014 03:16
    squid33 с поддержкой icap + с-icap squidclamav на freebsd 10 не использовали?
    что-то у меня не срастается, кажется пропускает вирусные файлы как решето.
    помогите пожта настроить
    • IT Adept
      12.05.2014 19:21
      Антивирус использую только на клиентских компьютерах. Если все клиентские компьютеры защищены, необходимости ставить дополнительную защиту на сервер не вижу.

      Но если всё-таки ставить, то лучше использовать коммерческий антивирус, качество обнаружения будет гораздо выше.
      • zeus
        12.05.2014 20:48
        мне не нужна такая крутота, поэтому пользуюсь тем, чего имею
        кстати собирал с поддержкой icap и ecap
        вместо ipfw использую pf (соответственно выбрал в конфиге)
  • gef257
    13.04.2013 08:43
    хорошая статья,респект и спасибо! избавиться от "WARNING: no_suid: setuid(0): (1) Operation not permitted" - конкретно в данном случае поможет изменение параметра daemon на stdio при указании пути к access.log-у...багрепорт какой-то не живой...
  • skylego
    02.04.2013 00:52
    Отличная статья. *****
  • тест
    22.11.2012 19:38
    Спасибо очень помогла статья
     

Добавить комментарий для IT Adept Отменить ответ


Вы не бот: