Error no forward proxy ports configured squid ubuntu

Контентная фильтрация в школе на основе Ubuntu 18.04 и прозрачного Squid, с интеграцией в сеть на MikroTik и не только 1. Введение Тема контентной фильтрации в школах достаточно заезженная и по ней полно информации, но она уже достаточно устарела, в связи с переходом множества сайтов на защищенный протокол HTTPS, с которым не работает большинство […]

Содержание

  1. Контентная фильтрация в школе на основе Ubuntu 18.04 и прозрачного Squid, с интеграцией в сеть на MikroTik и не только
  2. 1. Введение
  3. 2. Техническое задание
  4. 3. Решение задачи
  5. 3.1. Установка и настройка Ubuntu 18.04
  6. 3.2. Установка и настройка Squid c поддержкой HTTPS и фильтрация по спискам
  7. 3.3. Мониторинг состояния сервера и настройка Firewall
  8. 3.4. Настройка роутера MikroTik для перенаправления трафика на Proxy
  9. 3.5. Альтернативная настройка для MikroTik и других роутеров
  10. 4. Заключение
  11. 5. Список источников
  12. 6. Примечания автора

Контентная фильтрация в школе на основе Ubuntu 18.04 и прозрачного Squid, с интеграцией в сеть на MikroTik и не только

1. Введение

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

2. Техническое задание

Дано: 436-ФЗ и школа, в которой множество компьютеров, объединенных в сеть и подключенных к интернету через роутер MikroTik или любой другой.

Задача: сделать контентную фильтрацию HTTP и HTTPS по белому списку для всех, кроме себя любимого и управления школы.

3. Решение задачи

Был найден неиспользуемый стационарный компьютер с двух-ядерным Intel-ом, 1 Гб ОЗУ и жестким на 80 Gb.
Для решения будет сделано следующее:

  1. Установлена Linux Ubuntu Server 18.04 LTS
  2. На сервер установлен и настроен прозрачный Proxy Squid, собранный из исходных кодов с поддержкой HTTPS.
  3. Интеграция сервера в подсеть, путем перенаправления запросов на Proxy или альтернативным вариантом (в самом конце)

Начнем.

3.1. Установка и настройка Ubuntu 18.04

Процесс установки прост. Качаем дистрибутив Ubuntu Server 18.04 с официального сайта. Рекомендую качать со старым установщиком, так как новый, лично у меня, ушел в бесконечную загрузку во время установки. Записываем образ на флешку/диск любым удобным способом. Для записи на флешку рекомендую использовать Rufus и в начале записи выбрать «Запись DD-образа». Далее, следуя информации на экране, устанавливаем систему. Остановимся только на выборе компонентов, где можно выбрать сразу OpenSSH и всё. Нам много не нужно, а что нужно, установим сами.

Итак, Ubuntu установлена. Сеть, если у вас DHCP, уже настроена. Войдем в режим суперпользователя, чтобы каждый раз не добавлять sudo к командам.

Введем свой пароль и обновим систему.

Установим текстовый редактор и файловый менеджер.

Чтобы сохранить файл в nano, необходимо нажать Ctrl+O и следом Y. Выход из редактора осуществляется нажатием Ctrl+X. Можно сохранить файл сразу перед выходом, нажав Ctrl+X и следом Y.
Чтобы открыть файловый менеджер, введите mc. Откроется типичный DOS-овский NortonCommander или в Windows TotalCommander/FAR с двумя панелями. Хотя я привык работать с консолью, файловый менеджер тоже иногда помогает, например, найти нужный файл быстрее.

Если же у вас не DHCP или вы хотите отдельный IP-адрес для своего сервера, как этого захотел я, то перейдем к настройке.

В отличии от предыдущих версий Ubuntu, в новой 18.04 сеть настраивается уже не в привычном всем нам /etc/network/interfaces, а через netplan в файле /etc/netplan/*.yaml. Файл может называться по разному, но он там один. Сам же /etc/network/interfaces пишет нам следующее:

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

Приступим, все-таки, к настройке сети.

Для начала посмотрим название сетевого интерфейса, присвоенное ОС, и запомним его.

Теперь откроем файл с настройками.

В нем уже должна быть настройка DHCP. Приведем файл к следующему виду.

Вписываем свои интерфейс, адрес и шлюз. DNS рекомендую оставить эти — Яндекс.DNS Детский будет как дополнительная защита. Такой же DNS настроен у меня в роутере. В любом случае, необходимо указывать тот DNS, который раздает роутер.

Здесь необходимо обратить внимание на пробелы (именно пробелы, а не табуляция). Каждый, своего рода, пункт отделяется от предыдущего пробелом. К примеру, если после nameservers строку addresses не отделить пробелом, а выровнять со строкой выше, то, при попытке применения настроек, netplan выдаст ошибку.

Перезагрузим сервер, на всякий случай.

В Ubuntu 18.04 можно вернуться к привычному варианту настройки сети через /etc/network/interfaces. Для этого в самом файле указано, что нужно установить утилиту ifupdown. Установим ее:

Теперь откроем файл изначальных настроек в netplan

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

И добавим в него:
для статического IP-адреса

для динамического (DHCP)

Если используете этот вариант настройки сети, то далее, в настройках Firewall, можете отказаться вообще от Webmin и использовать вариант настройки под спойлером (хотя вариант с Webmin тоже будет работать)

Теперь необходимо включить прохождение пакетов сквозь наш сервер. Открываем файл /etc/sysctl.conf

Ищем в нем строку net.ipv4.ip_forward=1 и раскомментируем ее. Если стоит значение , то меняем на 1.
Введем команду для применения настройки

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

По умолчанию SSH уже настроен на вход по пользователю/паролю на 22 порте, но вы можете настроить его для себя через, например, ключ авторизации и с другим портом в целях защиты сервера от атак извне. Как это сделать полно информации в интернете.

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

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

Основа заложена. Теперь перейдем к установке и настройке Squid.

3.2. Установка и настройка Squid c поддержкой HTTPS и фильтрация по спискам

3.2.1. Сборка и установка Squid

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

В нем раскомментируем (удалим # в начале) строки, начинающиеся с deb-src.

После этого обновим пакеты.

Далее установим инструменты для сборки.

И добавим все необходимые пакеты для сборки.

Установим библиотеку для поддержки SSL.

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

Перейдем в созданную папку и скачаем исходники Squid.

В папке build появится папка с именем squid3 и номером релиза. В Ubuntu 18.04.3 это 3.5.27. Перейдем в нее.

Перед сборкой необходимо указать опции. Откроем файл с ними.

Ищем перечисление опций, как на картинке


Добавляем следующие опции.

Обратите внимание, что на картинке опции уже добавлены, а символ «» должен стоять после каждой строки в опциях, кроме последней.

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

И введем команду для сборки.

Сборка будет идти очень долго, у меня занимало в среднем от 2 до 4 часов. Зависит от быстродействия компьютера. По окончании сборки вы увидите ошибку подписи пакетов. Это нормально — ошибку игнорируем.

Теперь перейдем в папку Build.

И установим Squid.

Сразу нарываемся на ошибку о неудовлетворенных зависимостях и вводим команду

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

3.2.2. Настройка Squid и фильтрации

Итак, Squid установлен, осталось его настроить под наши нужды.

Все настройки находятся в файле /etc/squid/squid.conf. Он содержит множество комментариев и на первый взгляд кажется очень сложным, но на самом деле ничего сверхсложного в нем нет. Для начала, почистим его от комментариев, предварительно скопировав оригинал, если вы, вдруг, захотите изучить его подробнее. Для удобства, перейдем сразу в папку со Squid-ом.

Теперь откроем squid.conf

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

Первый блок выглядит следующим образом.

Он отвечает за стандартные acl параметры. В нем в localnet изменяем локальную сеть на свою, а также добавляем acl рабочего времени (по желанию). Рабочее время я добавил ввиду того, что ко мне часто приходят учителя с жалобой, что не могут ничего найти, все недоступно. Я, конечно, рад, что все работает, как надо, но, честно говоря, надоело это выслушивать. Теперь на их претензию я сообщаю, что после 15.00 фильтрация отключается, и они могут свободно (почти) найти информацию, которая им нужна. Вы можете добавить свое время, или оставить фильтрацию круглосуточной, не добавляя этот acl.

Второй блок определяет списки разрешенных и запрещенных сайтов для HTTP и выглядит следующим образом.

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

Третий блок определяет параметры доступа по протоколу HTTP и выглядит вот так

Здесь пункт http_access allow CONNECT обязателен, так как без него у меня Squid не пускал в интернет никого. Далее идут правила на «черный» и «белый» списки. Параметры deny и allow запрещают и разрешают доступ соответственно. После них идет правило на полный запрет всего HTTP-трафика в рабочее время. Если вы не устанавливали рабочее время, то удалите worktime, и запрет будет постоянным. Важным моментом является порядок правил, так как Squid считывает их сверху вниз
Четвертый блок определяет параметры портов для Squid.

Первый параметр необходим, чтобы в логах бесконечно не появлялась ошибка «ERROR: No forward-proxy ports configured». Она заполняет лог и, следовательно, память. Распространенная ошибка, но, почему-то, в нашем ru-сегменте я не нашел, как ее исправить, помогли забугорские форумы. Второй параметр определяет порт HTTP протокола. Intercept означает прозрачность Proxy, то есть не будет необходимости прописывать настройки на каждом компьютере.
Третий параметр определяет порт HTTPS и его опции. Это одна длинная строка. Файл squid.pem — это наш сертификат, который мы создадим позднее.

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

Шестой блок задает параметры acl «черного» и «белого» списков, которые будут созданы позднее, а также глубину перехвата HTTPS-трафика.

Седьмой блок определяет параметры доступа по протоколу HTTPS. Здесь за запрет и разрешение отвечают уже terminate и splice соответственно. Опять же, не забывайте убрать worktime, если у вас не указано рабочее время.

Восьмой блок задает кеш и лог нашего Squid. Здесь стоит отметить только параметр logfile_rotate, обозначающий количество дней, в течении которых хранится лог.

На этом настройка squid.conf закончена. Сохраняем файл и переходим к созданию сертификата и списков.

Перейдем в папку со Squid

И введем следующую команду для создания сертификата

Далее необходимо будет ввести данные сертификата. Срок действия сертификата указан 100 лет, чтобы забыть о нем надолго. Нужен он только для Proxy.

Теперь создадим наши файлы списков.

Сайты в списки заносим в виде регулярных выражений. Например, чтобы разблокировать mail.ru, откроем whitelist

и добавим в него следующее выражение.

Теперь заблокируем Игры.Mail.ru. Откроем наш blacklist

и запишем в него следующее выражение

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

У некоторых сайтов множество поддоменов, субдоменов и т.д. Как, например, mail.ru хранит свои картинки на imgsmail.ru. Касаемо других подобных сайтов, вам необходимо в любом браузере (я использую Chrome) открыть нужный сайт и, следом, инструменты разработчика (в Chrome вызываются по клавише F12).

Перейти на вкладку Sources и посмотреть, с каких еще ресурсов сайт подгружает информацию.

Добавив сайты, скопируем их в списки для HTTPS.

Теперь проверим конфигурацию.

Если все хорошо, остановим Squid.

И снова запустим Squid

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

Также можете изменить страницу запрета доступа (работает только на HTTP) по пути /usr/share/squid/errors/

Russian-1251. Ищите в папке файл ERR_ACCESS_DENIED и редактируете его. Синтаксис файла — HTML.

3.3. Мониторинг состояния сервера и настройка Firewall

Для мониторинга состояния нашего сервера установим утилиту Webmin, с помощью которой и настроим наш Firewall. Помимо этого, через нее можно следить за состоянием ЦП, ОЗУ и тд, обновлять пакеты, добавлять и настраивать компоненты и еще очень много всего. В ней есть свой терминал, правда корявый. Работает утилита через любой браузер, следовательно, можно подключиться к нашему серверу с любого компьютера внутри сети, что достаточно удобно, хоть и не безопасно. При желании, подключение можно ограничить только отдельными IP-адресами в «Управлении доступом по IP» в самом Webmin.

Перед началом установки, добавим репозиторий Webmin. Открываем sources.list.

И добавляем внизу строку.

Теперь установим GPG ключ, которым подписаны пакеты в репозитории Webmin

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

Подключиться к серверу можно в любом браузере введя в строку адреса

По умолчанию Webmin подключается по SSL, и большинство браузеров выдают ошибку не доверенного сертификата. Чтобы каждый раз не выбирать доверие, отключим SSL. Для этого откроем файл /etc/webmin/miniserv.conf

Найдем в нем строку ssl=1 и заменим ее на ssl=0. В этом же файле можно изменить порт подключения. По умолчанию он 10000. Вы можете поставить любой свободный.

Подключившись к Webmin, перейдем в Webmin -> Webmin Configuration и переключим язык на русский. Потом переходим Сеть -> Межсетевой экран (Firewall). По умолчанию Firewall у нас чистый. Опускаемся в самый низ и напротив «Включать при загрузке» выбираем «Да». Жмем «Применить конфигурацию». Теперь настройки нашего Firewall указаны в файле /etc/webmin/firewall/iptables.save и запускаются вместе с системой. Если такого файла нет, то смотрим что написано в строке «Файл с правилами» на вкладке Firewall в Webmin. Откроем его в терминале.

Идем к блоку *nat и в конце перед COMMIT добавляем следующие правила.

Эти правила направляют трафик, идущий на порты 80 (HTTP) и 443 (HTTPS) сервера на порты нашего Squid. Здесь я представил два варианта правил с DNAT и REDIRECT. Вы можете использовать оба, или взять один вариант, поставив соответствующие порты.

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

И добавим следующее содержимое

Как и в случае с Webmin, я представил два варианта правил с DNAT и REDIRECT. Вы можете использовать оба, или взять один вариант, поставив соответствующие порты.
Теперь добавим наш файл в загрузку сразу после запуска сети. Откроем файл настроек сети

И добавим внизу файла строку

PS: плюс такого варианта в том, что вы можете в будущем добавлять свои правила, просто редактируя файл /etc/nat. В Webmin несколько сложнее.

На этом настройка сервера закончена. Перезагрузим его.

И перейдем к настройке роутера MikroTik.

3.4. Настройка роутера MikroTik для перенаправления трафика на Proxy

Будем считать, что вы уже скачали утилиту WinBox для удаленного управления, интернет и локальная сеть настроены, firewall на роутере чистый. вы знаете название интерфейса локальной сети (посмотреть можно в IP — DHCP Server — DHCP).

а) Заходим в WinBox, идем в IP — DHCP Server — Leases. В списке ищем IP компьютеров, для которых фильтрация не будет работать (директор, управление), жмем на них правой кнопкой и в меню выбираем Make Static. Рядом с ними должна пропасть буква «D», что означает Dynamic. Теперь эти адреса будут сразу статически присваиваться данным компьютерам, вне зависимости от времени аренды, по MAC-адресу. Если ноутбук, который используется по Wi-Fi и по кабелю, то необходимо выбрать Make Static на оба MAC-адреса.

б) Далее идем в IP — Firewall — Address Lists и жмем на синий плюсик «+». В поле Name указываем название для нашей группы светлых нефильтрованных адресов, например, «Admins». В поле Address указываем один IP-адрес из тех, кому присвоили статический. Повторяем это для каждого адреса, выбирая в поле Name стрелочкой нашу группу.

в) Переходим на вкладку Mangle в том же IP — Firewall и жмем на «+». Откроется окно с вкладками. На вкладке General заполняем следующие поля:

На вкладке Action проверяем наличие значения Accept и жмем ОК.

Повторяем процесс, но в поле Dst. Port ставим значение 443.

г) Снова нажимаем на «+» и на вкладке General снова заполняем следующие поля:

Переходим на вкладку Advanced и в поле Src. Address List выбираем наш список адресов управления «Admins«. Обязательно нажимаем на появившийся квадратик рядом со списком. Появится восклицательный знак «!», означающий логическое НЕ или ОТРИЦАНИЕ.

Переходим на вкладку Action и заполняем поля:

Жмем ОК и проделываем те же действия, но в поле Dst. Port указываем значение 443.

д) Наконец добавим последнее правило. Жмем плюсик и заполняем следующие поля на вкладке General:

В итоге, должно получиться следующее с вашими параметрами. Порядок важен!

е) Идем в IP — Routes и жмем на «+». Заполняем следующие поля:

Жмем ОК и на этом все. При включенном сервере, весь HTTP и HTTPS трафик будет идти через наш Squid.

3.5. Альтернативная настройка для MikroTik и других роутеров

Данный вариант подойдет как для роутера MikroTik, так и для любого другого, даже самого простого (за исключением провайдерских арендованных кусков сами знаете чего). В этом случае мы реализуем разделение доступа в интернет не на роутере, а на самом Squid. Итак, начнем.
а) Будем считать, что вы дошли до этого пункта, выполнив все вышестоящие, включая настройку перенаправления на Proxy в MikroTik. Для беспроблемной работы описываемого варианта, нам необходимо отменить подпункт е) пункта 3.4 настоящей статьи. Можно отменить весь пункт 3.4 (оставив, пожалуй, подпункт а) для того, чтобы наши IP не изменялись), но это по желанию — нам важно отменить саму маршрутизацию. Для этого идем в IP — Routes, ищем наш маршрут, выделяем его и жмем на красный крестик (не плюсик, а крестик, который рядом с галочкой). Маршрут станет серым => он отключен. Фильтрация также отключилась, теперь все клиенты идут в интернет напрямую через роутер.

б) Теперь заходим на наш сервер и переходим в папку со Squid

Открываем файл конфигурации

И добавляем в него по блокам:
В первый блок сразу после строки с acl localnet…

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

В третий блок после http_access deny blacklist

Далее блок остается без изменений, так как следом идут учителя (все остальные IP) с фильтрацией по их белому списку и в рабочее время (если указывали). Вы можете также пустить группу admins в обход черного списка, поставив разрешающее правило выше запрещающего, или добавить отдельные IP (например свой) в отдельный acl и поставить его в правилах выше blacklist.
Четвертый и пятый блоки без изменений.
В шестой блок добавляем

В седьмой блок добавляем после ssl_bump terminate blacklist_ssl

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

в) Теперь создадим наши списки IP-адресов.

И белые списки для учеников.

Добавьте в соответствующие списки необходимые IP-адреса и сайты. В ученический список сайтов можно скопировать список для учителей, убрав оттуда не нужные ученикам сайты. Копирование файлов в Linux осуществляется командой

г) Мы подошли к самому главному, а именно, как же заставить клиентов ходить в интернет через наш Proxy. Нам необходимо сменить шлюз нашего DHCP-сервера с адреса роутера на адрес нашего сервера. Разумеется, что для этого адрес сервера должен быть статическим, или привязан к MAC.
В MikroTik:
Идем в IP — DHCP Server — Network и два раза кликаем на нашей сети. В поле Gateway меняем адрес роутера на адрес Proxy-сервера. Жмем ОК и все. Можете перезагрузить роутер, чтобы настройки грамотно обновились у всех активных клиентов. После этого на клиентах, скорее всего, изменится тип сети на общественную (если стояла частная).
В обычном роутере:
Поищите в руководстве к вашему роутеру, где изменить шлюз DHCP-сервера, но вангую, что в его настройках 🙂

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

4. Заключение

Итак, подытожим все вышеописанное. У нас получилось с нуля установить и настроить Linux Ubuntu 18.04 LTS, собрать и установить Squid с поддержкой HTTPS, настроить фильтрацию по белым спискам, интегрировать Proxy-сервер в нашу сеть без необходимости устанавливать дополнительный DHCP-сервер.

5. Список источников

При создании статьи были использованы различные материалы с сайтов Технический блог специалистов ООО«Интерфейс» и Web Safety — Web Filter for Your Network, а также личные знания и опыт.
При редактировании и дополнении статьи очень помогли следующие пользователи: Kanlas, PetRiot, Barsook. Огромная благодарность им за содействие и помощь.

6. Примечания автора

  1. Любые работы с сервером нужно производить в режиме суперпользователя, добавляя sudo перед командой, или один раз введя команду sudo -s.
  2. Squid открываетзакрывает доступ ко всему ресурсу целиком, так что одну статью, например, на Википедии заблокировать не получится. Но никто не мешает вам изучить регулярные выражения и тестировать.
  3. Списки сайтов могу скинуть, обращайтесь. Сюда вписывать не стал, так как в одном белом списке более 1000 сайтов.
  4. К сожалению, данный вариант настройки не дает сделать раздельные списки для отдельных IP-адресов в Squid. В логах Squid только один IP-адрес — сам Mikrotik. Если хотите раздельные списки, то надо поднимать на сервере DHCP и делать его шлюзом, но это тема для другой статьи. Надеюсь, в комментариях гуру подскажут, что поправить в статье, чтобы в логах были IP компьютеров. — решено благодаря подсказке пользователя Barsook
  5. Для работы Squid с большим количеством клиентов (более 50) необходимо минимум 1 Гб ОЗУ. Желательно больше, так как Squid ест память. Вы можете проверить состояние памяти, введя команду top.
  6. Я рекомендую использовать оба варианта настройки роутера, так как, если в сетевых настройках явно указать другой шлюз (сам роутер), то обойти блокировку можно.

UPD1: добавил альтернативную настройку сети и Firewall
UPD2: добавил альтернативный вариант настройки роутера, где исправлены проблемы с отображением адресов в логах Squid.
UPD3: добавил исправление в 3.1 — включение прохождения пакетов сквозь сервер, которое забыл добавить изначально. Иначе не работает интернет. Спасибо Dmitry1986 за тестирование статьи.

Источник

  • Печать

Страницы: [1]   Вниз

Тема: SQUID работает, но в логах десятки ошибок  (Прочитано 3869 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн
OptionBase

всем привет!
Помогите пожалуйста разобраться, Кальмар работает но в логах десятки ошибок, уже незнаю куда копать (((
ubuntu 16.04 server
squid Version 3.5.12

Вот конфиг кальмара:

вот настройки iptables

а вот логи:

строк с ошибкой ERROR: No forward-proxy ports configured намного больше, я их вырезал, потому что не вмещались в пост

если не обращать внимание на эту ошибку, то в принципе, нареканий на работу Кальмара у меня нет, но хочу понять откуда эта ошибка берется

заранее благодарен


Оффлайн
fisher74

Начиная с версии 3.2, в случае организации прозрачного прокси необходимо задать две опции http_port. Одна для обычных запросов, вторая для перенаправляемого трафика

http_port 3128
http_port 127.0.0.1:3128 intercept
Источник

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

« Последнее редактирование: 21 Июня 2016, 21:09:08 от fisher74 »


Оффлайн
OptionBase

fisher74 спасибо за ответ, добавил http_port 3128 ошибка ERROR: No forward-proxy ports configured исчезла
а могли бы вы еще подсказать, что означают другие ошибки из лога:

например эти:
commBind: Cannot bind socket FD 19 to [::1]: (99) Cannot assign requested address
ERROR: Failed to create helper child read FD: UDP[::1]
ERROR: listen( FD 18, [::] [ job2], 16383): (98) Address already in use

заранее благодарен!


Оффлайн
fisher74

commBind: Cannot bind socket FD 19 to [::1]: (99) Cannot assign requested address

Эта ошибка относится к другому сервису (bind), потому оффтоп. Но если перевести…

ERROR: listen( FD 18, [::] [ job2], 16383): (98) Address already in use

sudo netstat -nap inet | grep LISTEN | grep 16383


Оффлайн
OptionBase

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

а по команде вывод нулевой, т.е. ничего не происходит…


Оффлайн
fisher74

Останавливаем кальмара

sudo service squid3 stopи смотрим, кто ещё в теремочке живёт

sudo netstat -nap inet | grep LISTEN | grep 3128


Оффлайн
OptionBase

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

а может не заморачиваться с портом 3128, а указать второй 3129,он вроде как свободен?
во всяком случае пока невыявил какие службы используют порт 3129
вывод Вашей команды показывает по этому порту пустой ответ
заменил в строке http_port 3128 порт и указал http_port 3129
результат рабочий
данной ошибки нет
выскажите пожалуйста свое мнение

п.с. Ваш совет по поводу замены http_port 192.168.0.1:3128 intercept на строку http_port 127.0.0.1:3128 intercept не сработал, Кальмар вроде как работал, в логах ничего критического не увидел, но страницы в браузере не открывались, поэтому оставил как есть.


Оффлайн
AnrDaemon

Ваш совет по поводу замены http_port 192.168.0.1:3128 intercept на строку http_port 127.0.0.1:3128 intercept не сработал, Кальмар вроде как работал, в логах ничего критического не увидел, но страницы в браузере не открывались, поэтому оставил как есть.

А редирект вы исправили?

Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…


Оффлайн
OptionBase

Здравствуйте AnrDaemon
у меня в редиректе вообще отсутствует адрес 127.0.0.1, имеется только порт:

сейчас в конфиге кальмара вообще убрал все адреса:
http_port 3128 intercept
http_port 3129
работа стала стабильнее
если же использовать адреса, то иногда, после рестарта машины, приходилось отдельно рестартовать кальмар, иначе не поднимался аксепт nat, в логах отсутствовала строка:


Оффлайн
AnrDaemon

Отсутствует строка, хорошо, а что вместо неё? Если он что-то не может сделать, он обычно ругается.

Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…


Оффлайн
OptionBase

ничего не было
например если сейчас в логах имеем 2 строки с акцептом:

то во-втором случае отсутствовала строка с акцептом NAT:

остальные ошибки присутствуют постоянно, собственно ради выяснения причин этих ошибок я и завел эту ветку
ошибки такие:


Оффлайн
AnrDaemon

[::] это ipv6 эквивалент 0.0.0.0.
Можно игнорировать, если вы не используете ipv6.

Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…


Оффлайн
OptionBase

AnrDaemon, можно уточнить?

2016/06/23 07:38:55 kid1| commBind: Cannot bind socket FD 13 to [::1]: (99) Cannot assign requested address
2016/06/23 07:38:55 kid1| commBind: Cannot bind socket FD 14 to [::1]: (99) Cannot assign requested address
2016/06/23 07:38:55 kid1| ERROR: Failed to create helper child read FD: UDP[::1]

Вы имели ввиду, что эти ошибки можно игнорить, потому что тут речь идет о  ipv6?


Оффлайн
AnrDaemon

Да. Если сильно смущает, поищите, как вообще отключить ipv6 поддержку, чтобы он даже и не пытался.

Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…


Оффлайн
OptionBase

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

парни, спасибо за помощь!


  • Печать

Страницы: [1]   Вверх

Server Details

Squid Transparent Proxy Version: 3.3.8
OS: Ubuntu Server 14.04
Server IP: 192.168.1.3

Squid config file

(excluding comments using grep)

root@ubuntu:~# grep -v '^$|^s*#' /etc/squid3/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
acl mylocalnetwork src 192.168.1.0/24
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access allow mylocalnetwork
http_access deny manager
http_access allow localhost
http_access deny all
http_port 3128 transparent
cache_mem 8 MB
maximum_object_size_in_memory 32 KB
memory_replacement_policy heap GDSF
cache_replacement_policy heap LFUDA
cache_dir aufs /opt/squid/cache 10000 14 256
maximum_object_size 128000 KB
cache_swap_low 95
cache_swap_high 99
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 -i .(gif|png|jp?g|ico|bmp|tiff?)$ 10080 95% 43200
refresh_pattern -i .(rpm|cab|deb|exe|msi|msu|zip|tar|xz|bz|bz2|lzma|gz|tgz|rar|bin|7z|doc?|xls?|ppt?|pdf|nth|psd|sis)$ 10080 90% 43200
refresh_pattern -i .(avi|iso|wav|mid|mp?|mpeg|mov|3gp|wm?|swf|flv|x-flv|axd)$ 43200 95% 432000
refresh_pattern -i .(html|htm|css|js)$ 1440 75% 40320
refresh_pattern -i .index.(html|htm)$ 0 75% 10080
refresh_pattern -i (/cgi-bin/|?) 0 0% 0
refresh_pattern . 1440 90% 10080
quick_abort_min 0 KB
quick_abort_max 0 KB
quick_abort_pct 100
store_avg_object_size 13 KB
visible_hostname localhost

Squid logs

-------------------------------------------------------------
-----------------------------------------------------------
----------------------------------------------------------
2014/07/03 22:11:57| ERROR: No forward-proxy ports configured.
2014/07/03 22:11:57| ERROR: No forward-proxy ports configured.
2014/07/03 22:11:57| ERROR: No forward-proxy ports configured.
2014/07/03 22:11:57| ERROR: No forward-proxy ports configured.
2014/07/03 22:11:57| ERROR: No forward-proxy ports configured.
2014/07/03 22:11:57| ERROR: No forward-proxy ports configured.
2014/07/03 22:11:57| ERROR: No forward-proxy ports configured.
2014/07/03 22:11:57| ERROR: No forward-proxy ports configured.
2014/07/03 22:11:57| ERROR: No forward-proxy ports configured.
2014/07/03 22:11:57| ERROR: No forward-proxy ports configured.
2014/07/03 22:11:57| ERROR: No forward-proxy ports configured.
2014/07/03 22:11:57| ERROR: No forward-proxy ports configured.
2014/07/03 22:11:57| Loaded Icons.
2014/07/03 22:11:57| HTCP Disabled.
2014/07/03 22:11:57| Pinger socket opened on FD 13
2014/07/03 22:11:57| Squid plugin modules loaded: 0
2014/07/03 22:11:57| Adaptation support is off.
2014/07/03 22:11:57| Accepting NAT intercepted HTTP Socket connections at local=0.0.0.0:3128 remote=[::] FD 11 flags=41
2014/07/03 22:11:57| Done reading /opt/squid/cache swaplog (2 entries)
2014/07/03 22:11:57| Finished rebuilding storage from disk.
2014/07/03 22:11:57|         2 Entries scanned
2014/07/03 22:11:57|         0 Invalid entries.
2014/07/03 22:11:57|         0 With invalid flags.
2014/07/03 22:11:57|         2 Objects loaded.
2014/07/03 22:11:57|         0 Objects expired.
2014/07/03 22:11:57|         0 Objects cancelled.
2014/07/03 22:11:57|         0 Duplicate URLs purged.
2014/07/03 22:11:57|         0 Swapfile clashes avoided.
2014/07/03 22:11:57|   Took 0.08 seconds ( 24.94 objects/sec).
2014/07/03 22:11:57| Beginning Validation Procedure
2014/07/03 22:11:57|   Completed Validation Procedure
2014/07/03 22:11:57|   Validated 2 Entries
2014/07/03 22:11:57|   store_swap_size = 12.00 KB
2014/07/03 22:11:57| ERROR: No forward-proxy ports configured.
2014/07/03 22:11:57| pinger: Initialising ICMP pinger ...
2014/07/03 22:11:57| pinger: ICMP socket opened.
2014/07/03 22:11:57| pinger: ICMPv6 socket opened
2014/07/03 22:11:57| Pinger exiting.
2014/07/03 22:11:58| storeLateRelease: released 0 objects

Iptables rules

(using single interface «eth0» for time being)

iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.3:3128
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

Client Configuration

The problem is I could not access internet on my client machines with Squid’s IP as Gateway & Primary DNS, as shown below.

On a Ubuntu client

auto eth0
iface eth0 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.3

dns-nameservers 192.168.1.3

On a Windows client

enter image description here

When I change DNS on Ubuntu client to dns-nameservers 192.168.1.1 & Windows client to the same ip of router 192.168.1.1 instead of squid ip(192.168.1.3), then I could access internet on both. This may not be the way to do as the page may be rendered directly from router and may not be from squid server using cache(of-course I could see the logs being generated in /var/log/squid3/cache.log). I also noticed my router blinking for the pages which are already accessed, this may mean it sends the request over internet instead of fetching from squid cache.

I’m still not compromised. If I could still access the visited pages on my client machines from cache having the internet shut down, I will be satisfied.

What is the procedure to configure clients for Squid Transparent Proxy?, anybody guide me please?

Update 1

root@ubuntu:~# iptables -t nat -L -n -v
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:192.168.1.3:3128
    0     0 REDIRECT   tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 3128

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all  --  *      eth0    192.168.1.0/24       0.0.0.0/0

Update 2

It’s working on previous edition Ubuntu 10.04(lucid) with squid version Squid Cache: Version 2.7.STABLE7, and below is the squid config file worked and I could access internet on client machines when client’s gateway & DNS are set to lucid’s ip:

root@lucid:~# grep -v '^$|^s*#' /etc/squid/squid.conf
acl all src all
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
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 mynet src 192.168.1.0/24    # RFC1918 possible internal network
acl SSL_ports port 443      # https
acl SSL_ports port 563      # snews
acl SSL_ports port 873      # rsync
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 Safe_ports port 631     # cups
acl Safe_ports port 873     # rsync
acl Safe_ports port 901     # SWAT
acl purge method PURGE
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access allow mynet
http_access deny all
icp_access allow localnet
icp_access deny all
http_port 3128 transparent
hierarchy_stoplist cgi-bin ?
cache_mem 8 MB
maximum_object_size_in_memory 32 KB
cache_dir ufs /var/spool/squid 2000 16 256
access_log /var/log/squid/access.log squid
refresh_pattern ^ftp:       1440    20% 10080
refresh_pattern ^gopher:    1440    0%  1440
refresh_pattern -i (/cgi-bin/|?) 0 0%  0
refresh_pattern (Release|Package(.gz)*)$    0   20% 2880
refresh_pattern .       0   20% 4320
acl shoutcast rep_header X-HTTP09-First-Line ^ICY.[0-9]
upgrade_http0.9 deny shoutcast
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
extension_methods REPORT MERGE MKACTIVITY CHECKOUT
hosts_file /etc/hosts
offline_mode on
coredump_dir /var/spool/squid

I’m not sure why it’s not working on Ubuntu 14.04 with Squid version Squid Cache: Version 3.3.8. I’m definitely missing some settings in new version of squid or in new destro!.

1. Введение

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

2. Техническое задание

Дано: 436-ФЗ и школа, в которой множество компьютеров, объединенных в сеть и подключенных к интернету через роутер MikroTik или любой другой.

Задача: сделать контентную фильтрацию HTTP и HTTPS по белому списку для всех, кроме себя любимого и управления школы.

3. Решение задачи

Был найден неиспользуемый стационарный компьютер с двух-ядерным Intel-ом, 1 Гб ОЗУ и жестким на 80 Gb.
Для решения будет сделано следующее:

  1. Установлена Linux Ubuntu Server 18.04 LTS
  2. На сервер установлен и настроен прозрачный Proxy Squid, собранный из исходных кодов с поддержкой HTTPS.
  3. Интеграция сервера в подсеть, путем перенаправления запросов на Proxy или альтернативным вариантом (в самом конце)

Начнем.

3.1. Установка и настройка Ubuntu 18.04

Процесс установки прост. Качаем дистрибутив Ubuntu Server 18.04 с официального сайта. Рекомендую качать со старым установщиком, так как новый, лично у меня, ушел в бесконечную загрузку во время установки. Записываем образ на флешку/диск любым удобным способом. Для записи на флешку рекомендую использовать Rufus и в начале записи выбрать «Запись DD-образа». Далее, следуя информации на экране, устанавливаем систему. Остановимся только на выборе компонентов, где можно выбрать сразу OpenSSH и всё. Нам много не нужно, а что нужно, установим сами.

Итак, Ubuntu установлена. Сеть, если у вас DHCP, уже настроена. Войдем в режим суперпользователя, чтобы каждый раз не добавлять sudo к командам.

sudo -s

Введем свой пароль и обновим систему.

apt-get update
apt-get upgrade

Установим текстовый редактор и файловый менеджер.

apt-get install nano mc

Чтобы сохранить файл в nano, необходимо нажать Ctrl+O и следом Y. Выход из редактора осуществляется нажатием Ctrl+X. Можно сохранить файл сразу перед выходом, нажав Ctrl+X и следом Y.
Чтобы открыть файловый менеджер, введите mc. Откроется типичный DOS-овский NortonCommander или в Windows TotalCommander/FAR с двумя панелями. Хотя я привык работать с консолью, файловый менеджер тоже иногда помогает, например, найти нужный файл быстрее.

Если же у вас не DHCP или вы хотите отдельный IP-адрес для своего сервера, как этого захотел я, то перейдем к настройке.

Настройка статического IP-адреса

В отличии от предыдущих версий Ubuntu, в новой 18.04 сеть настраивается уже не в привычном всем нам /etc/network/interfaces, а через netplan в файле /etc/netplan/*.yaml. Файл может называться по разному, но он там один. Сам же /etc/network/interfaces пишет нам следующее:

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

Приступим, все-таки, к настройке сети.

Для начала посмотрим название сетевого интерфейса, присвоенное ОС, и запомним его.

ifconfig

Теперь откроем файл с настройками.

nano /etc/netplan/*.yaml

В нем уже должна быть настройка DHCP. Приведем файл к следующему виду.

# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    название сетевого интерфейса:
      dhcp4: no
      dhcp6: no
      addresses: [адрес/24]
      gateway4: шлюз
      nameservers:
        addresses: [77.88.8.7, 77.88.8.3]

Вписываем свои интерфейс, адрес и шлюз. DNS рекомендую оставить эти — Яндекс.DNS Детский будет как дополнительная защита. Такой же DNS настроен у меня в роутере. В любом случае, необходимо указывать тот DNS, который раздает роутер.

Здесь необходимо обратить внимание на пробелы (именно пробелы, а не табуляция). Каждый, своего рода, пункт отделяется от предыдущего пробелом. К примеру, если после nameservers строку addresses не отделить пробелом, а выровнять со строкой выше, то, при попытке применения настроек, netplan выдаст ошибку.

Применим настройки.

netplan apply

Перезагрузим сервер, на всякий случай.

reboot

Также, добавил альтернативный вариант настройки сети, как для DHCP, так и для статического IP, если не устраивает netplan.

Альтернативный вариант настройки сети

В Ubuntu 18.04 можно вернуться к привычному варианту настройки сети через /etc/network/interfaces. Для этого в самом файле указано, что нужно установить утилиту ifupdown. Установим ее:

apt-get install ifupdown

Теперь откроем файл изначальных настроек в netplan

nano /etc/netplan/*.yaml

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

nano /etc/network/interfaces

И добавим в него:
для статического IP-адреса

auto название_вашего_сетевого_интерфейса
        iface название_вашего_сетевого_интерфейса inet static
        address IP-адрес
        netmask Маска
        gateway Шлюз
        dns-nameservers 77.88.8.7 77.88.8.3

для динамического (DHCP)

auto название_вашего_сетевого_интерфейса
    iface название_вашего_сетевого_интерфейса inet dhcp

Перезагрузим сервер

reboot

Если используете этот вариант настройки сети, то далее, в настройках Firewall, можете отказаться вообще от Webmin и использовать вариант настройки под спойлером (хотя вариант с Webmin тоже будет работать)

Теперь необходимо включить прохождение пакетов сквозь наш сервер. Открываем файл /etc/sysctl.conf

nano /etc/sysctl.conf

Ищем в нем строку net.ipv4.ip_forward=1 и раскомментируем ее. Если стоит значение 0, то меняем на 1.
Введем команду для применения настройки

sysctl -p /etc/sysctl.conf

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

apt-get install ssh

По умолчанию SSH уже настроен на вход по пользователю/паролю на 22 порте, но вы можете настроить его для себя через, например, ключ авторизации и с другим портом в целях защиты сервера от атак извне. Как это сделать полно информации в интернете.

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

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

Основа заложена. Теперь перейдем к установке и настройке Squid.

3.2. Установка и настройка Squid c поддержкой HTTPS и фильтрация по спискам

3.2.1. Сборка и установка Squid

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

nano /etc/apt/sources.list

В нем раскомментируем (удалим # в начале) строки, начинающиеся с deb-src.

После этого обновим пакеты.

apt-get update

Далее установим инструменты для сборки.

apt-get install fakeroot build-essential devscripts

И добавим все необходимые пакеты для сборки.

apt-get build-dep squid3

Установим библиотеку для поддержки SSL.

apt-get install libssl1.0-dev

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

cd ~
mkdir build
chown _apt:root build

Перейдем в созданную папку и скачаем исходники Squid.

cd build
apt-get source squid3

В папке build появится папка с именем squid3 и номером релиза. В Ubuntu 18.04.3 это 3.5.27. Перейдем в нее.

cd squid3-3.5.27

Перед сборкой необходимо указать опции. Откроем файл с ними.

nano debian/rules

Ищем перечисление опций, как на картинке


Добавляем следующие опции.

--enable-ssl 
--enable-ssl-crtd 
--with-openssl

Обратите внимание, что на картинке опции уже добавлены, а символ «» должен стоять после каждой строки в опциях, кроме последней.

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

cd ~/build/squid3-3.5.27

И введем команду для сборки.

debuild -d

Сборка будет идти очень долго, у меня занимало в среднем от 2 до 4 часов. Зависит от быстродействия компьютера. По окончании сборки вы увидите ошибку подписи пакетов. Это нормально — ошибку игнорируем.

Теперь перейдем в папку Build.

cd ~/build

И установим Squid.

dpkg -i squid*.deb

Сразу нарываемся на ошибку о неудовлетворенных зависимостях и вводим команду

apt-get install -f

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

apt-mark hold squid
apt-mark hold squid-common
apt-mark hold squidclient

3.2.2. Настройка Squid и фильтрации

Итак, Squid установлен, осталось его настроить под наши нужды.

Все настройки находятся в файле /etc/squid/squid.conf. Он содержит множество комментариев и на первый взгляд кажется очень сложным, но на самом деле ничего сверхсложного в нем нет. Для начала, почистим его от комментариев, предварительно скопировав оригинал, если вы, вдруг, захотите изучить его подробнее. Для удобства, перейдем сразу в папку со Squid-ом.

cd /etc/squid
cp squid.conf squid.conf.backup
cat squid.conf.backup | egrep "^[^#]" > squid.conf

Теперь откроем squid.conf

nano squid.conf

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

Конфигурация squid.conf

acl localnet src 192.168.0.0/24
acl worktime time 08:00-15:00
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

acl blacklist url_regex -i "/etc/squid/blacklist"
acl whitelist url_regex -i "/etc/squid/whitelist"

http_access allow localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow CONNECT
http_access deny blacklist
http_access allow whitelist
http_access deny all worktime
http_access allow all

http_port 3128
http_port 3129 intercept
https_port 3130 intercept ssl-bump options=ALL:NO_SSLv3:NO_SSLv2 connection-auth=off cert=/etc/squid/squid.pem
always_direct allow all
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER

acl blacklist_ssl ssl::server_name_regex -i "/etc/squid/blacklist_ssl"
acl whitelist_ssl ssl::server_name_regex -i "/etc/squid/whitelist_ssl"
acl step1 at_step SslBump1

ssl_bump peek step1
ssl_bump terminate blacklist_ssl
ssl_bump splice whitelist_ssl
ssl_bump terminate all worktime
ssl_bump splice all

sslcrtd_program /usr/lib/squid/ssl_crtd -s /var/lib/ssl_db -M 4MB

#Кэш
cache_mem 512 MB
 maximum_object_size_in_memory 512 KB
 memory_replacement_policy lru
cache_dir aufs /var/spool/squid 2048 16 256

#Лог
access_log daemon:/var/log/squid/access.log squid
logfile_rotate 1

coredump_dir /var/spool/squid
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

Первый блок выглядит следующим образом.

acl localnet src 192.168.0.0/24
acl worktime time 08:00-15:00
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

Он отвечает за стандартные acl параметры. В нем в localnet изменяем локальную сеть на свою, а также добавляем acl рабочего времени (по желанию). Рабочее время я добавил ввиду того, что ко мне часто приходят учителя с жалобой, что не могут ничего найти, все недоступно. Я, конечно, рад, что все работает, как надо, но, честно говоря, надоело это выслушивать. Теперь на их претензию я сообщаю, что после 15.00 фильтрация отключается, и они могут свободно (почти) найти информацию, которая им нужна. Вы можете добавить свое время, или оставить фильтрацию круглосуточной, не добавляя этот acl.

Второй блок определяет списки разрешенных и запрещенных сайтов для HTTP и выглядит следующим образом.

acl blacklist url_regex -i "/etc/squid/blacklist"
acl whitelist url_regex -i "/etc/squid/whitelist"

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

Третий блок определяет параметры доступа по протоколу HTTP и выглядит вот так

http_access allow localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow CONNECT
http_access deny blacklist
http_access allow whitelist
http_access deny all worktime
http_access allow all

Здесь пункт http_access allow CONNECT обязателен, так как без него у меня Squid не пускал в интернет никого. Далее идут правила на «черный» и «белый» списки. Параметры deny и allow запрещают и разрешают доступ соответственно. После них идет правило на полный запрет всего HTTP-трафика в рабочее время. Если вы не устанавливали рабочее время, то удалите worktime, и запрет будет постоянным. Важным моментом является порядок правил, так как Squid считывает их сверху вниз
Четвертый блок определяет параметры портов для Squid.


http_port 3128
http_port 3129 intercept
https_port 3130 intercept ssl-bump options=ALL:NO_SSLv3:NO_SSLv2 connection-auth=off cert=/etc/squid/squid.pem

Первый параметр необходим, чтобы в логах бесконечно не появлялась ошибка «ERROR: No forward-proxy ports configured». Она заполняет лог и, следовательно, память. Распространенная ошибка, но, почему-то, в нашем ru-сегменте я не нашел, как ее исправить, помогли забугорские форумы. Второй параметр определяет порт HTTP протокола. Intercept означает прозрачность Proxy, то есть не будет необходимости прописывать настройки на каждом компьютере.
Третий параметр определяет порт HTTPS и его опции. Это одна длинная строка. Файл squid.pem — это наш сертификат, который мы создадим позднее.

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

always_direct allow all
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER

Шестой блок задает параметры acl «черного» и «белого» списков, которые будут созданы позднее, а также глубину перехвата HTTPS-трафика.

acl blacklist_ssl ssl::server_name_regex -i "/etc/squid/blacklist_ssl"
acl whitelist_ssl ssl::server_name_regex -i "/etc/squid/whitelist_ssl"
acl step1 at_step SslBump1

Седьмой блок определяет параметры доступа по протоколу HTTPS. Здесь за запрет и разрешение отвечают уже terminate и splice соответственно. Опять же, не забывайте убрать worktime, если у вас не указано рабочее время.

ssl_bump peek step1
ssl_bump terminate blacklist_ssl
ssl_bump splice whitelist_ssl
ssl_bump terminate all worktime
ssl_bump splice all

sslcrtd_program /usr/lib/squid/ssl_crtd -s /var/lib/ssl_db -M 4MB

Восьмой блок задает кеш и лог нашего Squid. Здесь стоит отметить только параметр logfile_rotate, обозначающий количество дней, в течении которых хранится лог.

#Кеш
cache_mem 512 MB
 maximum_object_size_in_memory 512 KB
 memory_replacement_policy lru
cache_dir aufs /var/spool/squid 2048 16 256

#Лог
access_log daemon:/var/log/squid/access.log squid
logfile_rotate 1

coredump_dir /var/spool/squid
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.conf закончена. Сохраняем файл и переходим к созданию сертификата и списков.

Перейдем в папку со Squid

cd /etc/squid/

И введем следующую команду для создания сертификата

openssl req -new -newkey rsa:1024 -days 36500 -nodes -x509 -keyout squid.pem -out squid.pem

Далее необходимо будет ввести данные сертификата. Срок действия сертификата указан 100 лет, чтобы забыть о нем надолго. Нужен он только для Proxy.

Теперь создадим наши файлы списков.

touch blacklist
touch whitelist
cp whitelist whitelist_ssl
cp blacklist blacklist_ssl

Сайты в списки заносим в виде регулярных выражений. Например, чтобы разблокировать mail.ru, откроем whitelist

nano whitelist

и добавим в него следующее выражение.

mail.ru 

Теперь заблокируем Игры.Mail.ru. Откроем наш blacklist

nano blacklist

и запишем в него следующее выражение

games.mail.ru

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

У некоторых сайтов множество поддоменов, субдоменов и т.д. Как, например, mail.ru хранит свои картинки на imgsmail.ru. Касаемо других подобных сайтов, вам необходимо в любом браузере (я использую Chrome) открыть нужный сайт и, следом, инструменты разработчика (в Chrome вызываются по клавише F12).

Перейти на вкладку Sources и посмотреть, с каких еще ресурсов сайт подгружает информацию.

Добавив сайты, скопируем их в списки для HTTPS.

cp whitelist whitelist_ssl
cp blacklist blacklist_ssl

Совет по заполнению списков

Создайте обычный текстовый файл на своем компьютере, найдите и скопируйте в него список разрешенных сайтов, дополните его своим. Затем, в обычном блокноте сделайте авто-замену точки на слэш-точку (.) и той же авто-заменой удалите лишнее (www, http, символ «/» и тд). Потом такой файл можно, используя терминал, сразу скопировать в листы на сервере.

Теперь проверим конфигурацию.

squid -k check

Если все хорошо, остановим Squid.

/etc/init.d/squid stop

Перестроим кеш

squid -z

И снова запустим Squid

/etc/init.d/squid start

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

/etc/init.d/squid restart

Также можете изменить страницу запрета доступа (работает только на HTTP) по пути /usr/share/squid/errors/~Russian-1251. Ищите в папке файл ERR_ACCESS_DENIED и редактируете его. Синтаксис файла — HTML.

3.3. Мониторинг состояния сервера и настройка Firewall

Для мониторинга состояния нашего сервера установим утилиту Webmin, с помощью которой и настроим наш Firewall. Помимо этого, через нее можно следить за состоянием ЦП, ОЗУ и тд, обновлять пакеты, добавлять и настраивать компоненты и еще очень много всего. В ней есть свой терминал, правда корявый. Работает утилита через любой браузер, следовательно, можно подключиться к нашему серверу с любого компьютера внутри сети, что достаточно удобно, хоть и не безопасно. При желании, подключение можно ограничить только отдельными IP-адресами в «Управлении доступом по IP» в самом Webmin.

Перед началом установки, добавим репозиторий Webmin. Открываем sources.list.

nano /etc/apt/sources.list

И добавляем внизу строку.

deb http://download.webmin.com/download/repository sarge contrib

Теперь установим GPG ключ, которым подписаны пакеты в репозитории Webmin

cd /root
wget http://www.webmin.com/jcameron-key.asc
apt-key add jcameron-key.asc

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

apt-get update
apt-get install webmin

Подключиться к серверу можно в любом браузере введя в строку адреса

IP_адрес_сервера:10000

По умолчанию Webmin подключается по SSL, и большинство браузеров выдают ошибку не доверенного сертификата. Чтобы каждый раз не выбирать доверие, отключим SSL. Для этого откроем файл /etc/webmin/miniserv.conf

nano /etc/webmin/miniserv.conf

Найдем в нем строку ssl=1 и заменим ее на ssl=0. В этом же файле можно изменить порт подключения. По умолчанию он 10000. Вы можете поставить любой свободный.

Подключившись к Webmin, перейдем в Webmin -> Webmin Configuration и переключим язык на русский. Потом переходим Сеть -> Межсетевой экран (Firewall). По умолчанию Firewall у нас чистый. Опускаемся в самый низ и напротив «Включать при загрузке» выбираем «Да». Жмем «Применить конфигурацию». Теперь настройки нашего Firewall указаны в файле /etc/webmin/firewall/iptables.save и запускаются вместе с системой. Если такого файла нет, то смотрим что написано в строке «Файл с правилами» на вкладке Firewall в Webmin. Откроем его в терминале.

nano /etc/webmin/firewall/iptables.save

Идем к блоку *nat и в конце перед COMMIT добавляем следующие правила.

-A PREROUTING -p tcp -m tcp -i сетевой_интерфейс --dport 80 -j DNAT --to-destination ip_сервера:3129
-A PREROUTING -p tcp -m tcp -i сетевой_интерфейс --dport 443 -j REDIRECT --to-ports 3130

Эти правила направляют трафик, идущий на порты 80 (HTTP) и 443 (HTTPS) сервера на порты нашего Squid. Здесь я представил два варианта правил с DNAT и REDIRECT. Вы можете использовать оба, или взять один вариант, поставив соответствующие порты.

Настройка FIrewall для альтернативной настройки сети

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

touch /etc/nat
chmod +x /etc/nat

Откроем его

nano /etc/nat

И добавим следующее содержимое

#!/bin/sh
#Firewall
iptables -t nat -A PREROUTING -p tcp -m tcp -i сетевой_интерфейс --dport 80 -j DNAT --to-destination ip_сервера:3129
iptables -t nat -A PREROUTING -p tcp -m tcp -i сетевой_интерфейс --dport 443 -j REDIRECT --to-ports 3130

Как и в случае с Webmin, я представил два варианта правил с DNAT и REDIRECT. Вы можете использовать оба, или взять один вариант, поставив соответствующие порты.
Теперь добавим наш файл в загрузку сразу после запуска сети. Откроем файл настроек сети

nano /etc/network/interfaces

И добавим внизу файла строку

post-up /etc/nat

PS: плюс такого варианта в том, что вы можете в будущем добавлять свои правила, просто редактируя файл /etc/nat. В Webmin несколько сложнее.

На этом настройка сервера закончена. Перезагрузим его.

reboot

И перейдем к настройке роутера MikroTik.

3.4. Настройка роутера MikroTik для перенаправления трафика на Proxy

Будем считать, что вы уже скачали утилиту WinBox для удаленного управления, интернет и локальная сеть настроены, firewall на роутере чистый. вы знаете название интерфейса локальной сети (посмотреть можно в IP — DHCP Server — DHCP).

а) Заходим в WinBox, идем в IP — DHCP Server — Leases. В списке ищем IP компьютеров, для которых фильтрация не будет работать (директор, управление), жмем на них правой кнопкой и в меню выбираем Make Static. Рядом с ними должна пропасть буква «D», что означает Dynamic. Теперь эти адреса будут сразу статически присваиваться данным компьютерам, вне зависимости от времени аренды, по MAC-адресу. Если ноутбук, который используется по Wi-Fi и по кабелю, то необходимо выбрать Make Static на оба MAC-адреса.

б) Далее идем в IP — Firewall — Address Lists и жмем на синий плюсик «+». В поле Name указываем название для нашей группы

светлых

нефильтрованных адресов, например, «Admins». В поле Address указываем один IP-адрес из тех, кому присвоили статический. Повторяем это для каждого адреса, выбирая в поле Name стрелочкой нашу группу.

в) Переходим на вкладку Mangle в том же IP — Firewall и жмем на «+». Откроется окно с вкладками. На вкладке General заполняем следующие поля:

Chain - Prerouting
Src. Address - адрес_сервера_proxy
Protocol - 6 (tcp)
Dst. Port - 80
In. Interface - интерфейс_локальной_сети

На вкладке Action проверяем наличие значения Accept и жмем ОК.

Повторяем процесс, но в поле Dst. Port ставим значение 443.

г) Снова нажимаем на «+» и на вкладке General снова заполняем следующие поля:

Chain - Prerouting
Protocol - 6 (tcp)
Dst. Port - 80
In. Interface - интерфейс_локальной_сети

Переходим на вкладку Advanced и в поле Src. Address List выбираем наш список адресов управления «Admins«. Обязательно нажимаем на появившийся квадратик рядом со списком. Появится восклицательный знак «!», означающий логическое НЕ или ОТРИЦАНИЕ.

Переходим на вкладку Action и заполняем поля:

Action - mark routing
New Routing Mark - to_proxy
Passthrough - ставим галочку

Жмем ОК и проделываем те же действия, но в поле Dst. Port указываем значение 443.

д) Наконец добавим последнее правило. Жмем плюсик и заполняем следующие поля на вкладке General:

Chain - Prerouting
In. Interface - интерфейс_локальной_сети
Routing Mark - to_proxy

В итоге, должно получиться следующее с вашими параметрами. Порядок важен!

е) Идем в IP — Routes и жмем на «+». Заполняем следующие поля:

Dst. Address - 0.0.0.0/0
Gateway - адрес_сервера_proxy
Routing Mark - to_proxy

Жмем ОК и на этом все. При включенном сервере, весь HTTP и HTTPS трафик будет идти через наш Squid.

3.5. Альтернативная настройка для MikroTik и других роутеров

Данный вариант подойдет как для роутера MikroTik, так и для любого другого, даже самого простого (за исключением провайдерских арендованных кусков сами знаете чего). В этом случае мы реализуем разделение доступа в интернет не на роутере, а на самом Squid. Итак, начнем.
а) Будем считать, что вы дошли до этого пункта, выполнив все вышестоящие, включая настройку перенаправления на Proxy в MikroTik. Для беспроблемной работы описываемого варианта, нам необходимо отменить подпункт е) пункта 3.4 настоящей статьи. Можно отменить весь пункт 3.4 (оставив, пожалуй, подпункт а) для того, чтобы наши IP не изменялись), но это по желанию — нам важно отменить саму маршрутизацию. Для этого идем в IP — Routes, ищем наш маршрут, выделяем его и жмем на красный крестик (не плюсик, а крестик, который рядом с галочкой). Маршрут станет серым => он отключен. Фильтрация также отключилась, теперь все клиенты идут в интернет напрямую через роутер.

б) Теперь заходим на наш сервер и переходим в папку со Squid

cd /etc/squid/

Открываем файл конфигурации

nano squid.conf

И добавляем в него по блокам:
В первый блок сразу после строки с acl localnet…

acl admins src "/etc/squid/admins-ip"  #Список IP администрации школы
acl students src "/etc/squid/students-ip"  #Список IP ученических компьютеров

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

acl whitelist-stud url_regex -i "/etc/squid/whitelist-stud"   #Более ужесточенный белый список для учеников

В третий блок после http_access deny blacklist

http_access allow admins   #Разрешаем группе администрации ходить в интернет
http_access allow students whitelist-stud  #Разрешаем ученикам доступ по их белому списку
http_access deny students  #Запрещаем ученикам доступ на остальные сайты все время

Далее блок остается без изменений, так как следом идут учителя (все остальные IP) с фильтрацией по их белому списку и в рабочее время (если указывали). Вы можете также пустить группу admins в обход черного списка, поставив разрешающее правило выше запрещающего, или добавить отдельные IP (например свой) в отдельный acl и поставить его в правилах выше blacklist.
Четвертый и пятый блоки без изменений.
В шестой блок добавляем

acl whitelist-stud_ssl ssl::server_name_regex -i "/etc/squid/whitelist-stud_ssl"

В седьмой блок добавляем после ssl_bump terminate blacklist_ssl

ssl_bump splice admins
ssl_bump splice students whitelist-stud_ssl
ssl_bump terminate students

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

в) Теперь создадим наши списки IP-адресов.

touch admins-ip
touch students-ip

И белые списки для учеников.

touch whitelist-stud
cp whitelist-stud whitelist-stud_ssl

Добавьте в соответствующие списки необходимые IP-адреса и сайты. В ученический список сайтов можно скопировать список для учителей, убрав оттуда не нужные ученикам сайты. Копирование файлов в Linux осуществляется командой

cp <путь и имя копируемого файла> <путь и имя конечного файла>

Перезапустим Squid

/etc/init.d/squid restart

г) Мы подошли к самому главному, а именно, как же заставить клиентов ходить в интернет через наш Proxy. Нам необходимо сменить шлюз нашего DHCP-сервера с адреса роутера на адрес нашего сервера. Разумеется, что для этого адрес сервера должен быть статическим, или привязан к MAC.
В MikroTik:
Идем в IP — DHCP Server — Network и два раза кликаем на нашей сети. В поле Gateway меняем адрес роутера на адрес Proxy-сервера. Жмем ОК и все. Можете перезагрузить роутер, чтобы настройки грамотно обновились у всех активных клиентов. После этого на клиентах, скорее всего, изменится тип сети на общественную (если стояла частная).
В обычном роутере:
Поищите в руководстве к вашему роутеру, где изменить шлюз DHCP-сервера, но вангую, что в его настройках :)

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

Интернет минуя Proxy

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

4. Заключение

Итак, подытожим все вышеописанное. У нас получилось с нуля установить и настроить Linux Ubuntu 18.04 LTS, собрать и установить Squid с поддержкой HTTPS, настроить фильтрацию по белым спискам, интегрировать Proxy-сервер в нашу сеть без необходимости устанавливать дополнительный DHCP-сервер.

5. Список источников

При создании статьи были использованы различные материалы с сайтов Технический блог специалистов ООО«Интерфейс» и Web Safety — Web Filter for Your Network, а также личные знания и опыт.
При редактировании и дополнении статьи очень помогли следующие пользователи: Kanlas, PetRiot, Barsook. Огромная благодарность им за содействие и помощь.

6. Примечания автора

  1. Любые работы с сервером нужно производить в режиме суперпользователя, добавляя sudo перед командой, или один раз введя команду sudo -s.
  2. Squid открываетзакрывает доступ ко всему ресурсу целиком, так что одну статью, например, на Википедии заблокировать не получится. Но никто не мешает вам изучить регулярные выражения и тестировать.
  3. Списки сайтов могу скинуть, обращайтесь. Сюда вписывать не стал, так как в одном белом списке более 1000 сайтов.
  4. К сожалению, данный вариант настройки не дает сделать раздельные списки для отдельных IP-адресов в Squid. В логах Squid только один IP-адрес — сам Mikrotik. Если хотите раздельные списки, то надо поднимать на сервере DHCP и делать его шлюзом, но это тема для другой статьи. Надеюсь, в комментариях гуру подскажут, что поправить в статье, чтобы в логах были IP компьютеров. — решено благодаря подсказке пользователя Barsook
  5. Для работы Squid с большим количеством клиентов (более 50) необходимо минимум 1 Гб ОЗУ. Желательно больше, так как Squid ест память. Вы можете проверить состояние памяти, введя команду top.
  6. Я рекомендую использовать оба варианта настройки роутера, так как, если в сетевых настройках явно указать другой шлюз (сам роутер), то обойти блокировку можно.

UPD1: добавил альтернативную настройку сети и Firewall
UPD2: добавил альтернативный вариант настройки роутера, где исправлены проблемы с отображением адресов в логах Squid.
UPD3: добавил исправление в 3.1 — включение прохождения пакетов сквозь сервер, которое забыл добавить изначально. Иначе не работает интернет. Спасибо Dmitry1986 за тестирование статьи.


0

1

Вроде бы со squid все уже давно понятно, все зубы об него уже сьел,ан нет фокусы продолжаются.

У меня 3 одинаковых шлюза. Стоит fedora 16 на всех стоял squid-3.2.0.16-1.fc16.i686 до недавнего времени, на непокорном шлюзе обновил до squid-3.2.5-1.fc16.i686 но проблема не решилась.
А проблема в том что на этом одном шлюзе не работает прозрачный режим. В обычном режиме все пучком, в прозрачном режиме…. даже логи squid-а пустые, запрещенный явно сайт не открывается, но и не выскакивает мое сообщение о запрете.
Анализ tcpdump показывает что запросы идут напрямую, все в iptables вроде бы как всегда редиректится 80 порт на 3128.
Где то на просторах Инета натыкался что надо еще открыть для прозрачного порт 3129 иначе в логах ошибка «no forward-proxy ports configured» открываю порт, да сообшение об ошибке пропадает но сквид все равно не работает как надо. Причем до фонаря какой порт указать 3129 или любой другой. Вообще зачем это? можетя что то пропустил в изменении идеологии сквида?

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

http_port 127.0.0.1:3128 intercept
http_port 172.16.1.100:3128 intercept
# пробовал 
#http_port 172.16.1.100:3128 transparent
error_directory /etc/squid/errors

acl sekvestr src «/etc/squid/limit»
acl office src «/etc/squid/good_user»

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 Safe_ports port 5190 # icq
acl CONNECT method CONNECT

dns_nameservers 127.0.0.1 8.8.8.8

acl belii url_regex -i «/etc/squid/bad_url/white»
acl banners url_regex «/etc/squid/bad_url/banners»
acl bad_urlpath urlpath_regex «/etc/squid/bad_url/bad_urlpath

acl bad url_regex »/etc/squid/bad_url/bad"
acl game url_regex «/etc/squid/bad_url/game»

acl mp3 url_regex -i «/etc/squid/bad_url/mp3»

http_access allow belii
http_access deny banners
deny_info ERR_ACCESS_TRAFIK sekvestr

http_access deny bad
deny_info ERR_PORNO bad

http_access deny game
http_access deny bad_urlpath

http_access deny sekvestr
http_access allow office
http_access allow localhost
http_access deny manager

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

http_access allow localhost
http_access allow office

http_access deny all

cache_dir ufs /var/spool/squid 100 16 256

coredump_dir /var/spool/squid

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
cache_effective_user squid
cache_effective_group squid

Правила iptables:

/sbin/iptables -A INPUT -s $SETKA1 -d $GW -m tcp -p tcp --dport 3128 -j ACCEPT
/sbin/iptables -A OUTPUT -s $GW -d $SETKA1 -m tcp -p tcp --sport 3128 -j ACCEPT
/sbin/iptables -t nat -A PREROUTING -p tcp -i p1p1 -s $ip_admin --dport 80 -j REDIRECT --to-port 3128
# пробовал и так
#/sbin/iptables -t nat -A PREROUTING -p tcp -i p1p1 -s $ip_admin --dport 80 -j DNAT --to-destination 172.16.1.100:3128

Конфиги и правила фаера с работающими проксями сравнивал по буквам вроде бы…. Я уже не знаю куда еще нужно смотреть, посоветуйте, коллеги.

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

Содержание

  • Установка Squid
  • Настройка Squid
  • Отображение местного времени на страницах ошибок Squid
  • Запуск Squid
  • Протокол управления кэшем Squid
  • Настройка IPFW
  • Ротация логов Squid
  • Кэширование контента в Squid
  • Ограничения доступа к сайтам и контенту в Squid
  • Подмена заголовков в запросе клиента в Squid
  • Перенос логов доступа Squid
  • Решение проблем
  • Установка Squid из коллекции портов
  • Пакетный менеджер и кастомизированный Squid
  • Настройка ядра (FreeBSD 9.1 и ранее)
  • Дополнительная информация

Устанавливаем 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 "nn #Местное время на страницах ошибокnerror_directory /usr/local/etc/squid/errors.local/run" >> /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): установка, настройка и использование

Понравилась статья? Поделить с друзьями:
  • Error object reference not set to an instance of an object veeam
  • Error object file git
  • Error object apache is not a member of package org
  • Error obj debug main o нет такого файла или каталога
  • Error nvidia installer must be run as root что делать