Squid https настройка: «Прозрачный» Squid с фильтрацией HTTPS ресурсов без подмены сертификатов (x86) / Хабр

Содержание

«Прозрачный» Squid с фильтрацией HTTPS ресурсов без подмены сертификатов (x86) / Хабр

Не секрет, что в больших конторах тема фильтрации Интернета довольно актуальная. С этой задачей справляется немало программных и аппаратных решений. Но в настоящее время все те сайты, которые мы резали ранее, работают по протоколу HTTPS, т.е. порт 443. Как известно, данный протокол проследить, прослушать и т. п., невозможно. А любой кеширующий фильтрующий прокси-сервер, редиректор и т. п. фильтрует только HTTP, т.е. порт 80. Как же резать Вконтакте, Одноклассники, iphide.info и многие другие подобные сайты? Как блокировать доступ к личной почте в организации, если использование оной запрещено порядками в организации? Да, можно фильтровать по IP адресам, но они частенько меняются, да и на многих ресурсах несколько IP адресов. Блокировать их на уровне файрвола как-то совсем не православное решение, и не совсем удобное.

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

А поднимал он Squid 3.5.8. Как выяснилось, в нем переработана организация перехвата шифрованных HTTPS-сеансов (ssl_bump), вместо режимов перехвата («modes») введены в обиход действия («actions»), которые в том числе можно использовать в ACL. Режим «server-first», при котором вначале осуществляется соединение с целевым сервером, а потом создаётся защищённое соединение между клиентом и прокси, теперь доступен как действие «bump». Режим «none», при котором создаётся TCP-туннель без дешифровки трафика, теперь доступен как действие «splice».

Для обеспечения обратной совместимости добавлено действие «peek-and-splice», при котором решение о типе создаваемого вначале соединения (клиент-прокси или прокси-сервер) принимается на основе SSL hello-сообщений. Добавлены действия «peek» и «stare» для получения клиентского или серверного сертификата с сохранением возможности дальнейшего применения режимов «splice» и «bump» для соединений. Добавлено действие «terminate» для закрытия соединений к клиенту или серверу. Вот как раз SSL BUMP, PEEK-and-SPLICE и Terminate нам и нужны. Вообще, схема работы на самом деле довольно простая. Squid подключается к HTTPS ресурсу, получает его сертификат, и может «посмотреть» некоторые данные о ресурсе, в частности имя сервера, которое нам как раз и нужно для блокировки! Все мануалы, которые есть в Интернете, то и дело описывают Man in the middle (MITM) атаку с подменой сертификатов, при которой в принципе не работают некоторые сайты и банк-клиенты, да и юзеры явно видят, что за ними следят. Мы же с товарищем совместными усилиями добились сбособа фильтрации и отслеживания HTTPS без подмены сертификатов, без MITM и прочего, и все это в прозрачном режиме без настройки браузеров!

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

Libressl, потом уже после внесения патча в файл bio.cc в исходниках Squid приступать к компиляции последнего. Поехали! Оговорюсь, что у меня используется дистрибутив Debian Jessie x86, и Squid я в итоге собрал версии 3.5.9 (последняя на данный момент версия), и статья рассчитана на более-менее опытного пользователя Linux, так как некоторые моменты опускаются, а говорится лишь самое главное, так как мне лень все разжевывать.
Для начала, подготовимся к сборке пакетов:

apt-get install git fakeroot build-essential devscripts
apt-cache policy squid3
apt-get build-dep squid3
apt-get build-dep libecap2
apt-get install libssl-dev libgnutls28-dev

Не забудьте перейти в ту папку, где вы будете собирать исходники, чтобы не засрать себе Хоум. Далее скачаем, скомпилируем и установим Libressl:
wget http://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.1.6.tar.gz tar -xzvf libressl-2.1.6.tar.gz cd libressl-2.1.6

Собираем и устанавливаем, после чего перечитаем хеши библиотек:
./configure
make
checkinstall --pkgname libressl --pkgversion 2.1.6
dpkg -i libressl_2.1.6-1_i386.deb
ldconfig

Ну и надо настроить использование LibreSSL по-умолчанию:
mv /usr/bin/openssl /usr/bin/openssl-1
update-alternatives --install /usr/bin/openssl openssl /usr/bin/openssl-1 10
update-alternatives --install /usr/bin/openssl openssl /usr/local/bin/openssl 50
update-alternatives --config openssl

Проверим, получилось ли поставить Libressl:
openssl version
    LibreSSL 2.1.6

Получилось!

После выполнения этих действий, необходимо отредактировать sources.list, включив туда исходники из ветки testing (это необходимо, так как нам нужно компилировать новый libecap, который в свою очередь необходим для сборки Squid):

deb-src http://ftp.de.debian.org/debian/ testing main contrib non-free

Обновим кеш пакетов:
apt-get update

А теперь скачаем из Testing нужные исходники:

apt-get source squid3/testing
apt-get source libecap3/testing

Далее соберем libecap:
cd libecap-1.0.1/
dpkg-buildpackage -us -uc -nc -d

Удалим старье, и установим новье:
apt-get purge libecap2
dpkg -i libecap3_1.0.1-2_i386.deb
dpkg -i libecap3-dev_1.0.1-2_i386.deb

Качаем последний самый свежий и работающий снэпшот Squid’a:
wget http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.8.tar.gz

Обновим полученные ранее исходники Squid’a до новых, и далее будем работать уже в директории с новоиспеченными исходниками:
cd squid3-3.5.7/ uupdate -v 3.5.8 ../squid-3.5.8.tar.gz cd ../squid3-3.5.8/

Чтобы все нужные нам плюшки заработали, надо компилировать Squid с нужными опциями, поэтому внесем в debian/rules следующие опции компиляции:
--enable-ssl
--enable-ssl-crtd
--with-openssl

Скачаем патч для bio.cc, который нужен для корректной работы с Libressl, отсюда bugs.squid-cache.org/attachment.cgi?id=3216 и применим его
patch -p0 -i bug-4330-put_cipher_by_char-t1.patch

Теперь можно приступать к компиляции и сборке Squid’а. Но не так быстро! Все скомпилируется без проблем, по крайней мере на х86 архитектуре, но в самом конце, на этапе сборки пакетов deb, вам любезно скажут в консоли: «ай ай ай, не могу понять, какие зависимости нужны для libssl.so.32» (это версия библиотеки из Libressl). Оно и понятно, откуда Debian’у знать о ней. Мы обманем систему, указав опцию «не проверять зависимости», вот так:
export DEB_DH_SHLIBDEPS_ARGS_ALL=--dpkg-shlibdeps-params=--ignore-missing-info

А вот теперь приступим к компиляции и сборке:
dpkg-buildpackage -us -uc -nc

После сборки установим пакет с языками для Squid’a:
apt-get install squid-langpack

Далее установим новоиспеченные пакеты:
dpkg -i squid-common_3.5.8-1_all.deb
dpkg -i squid_3.5.8-1_i386.deb
dpkg -i squid3_3.5.8-1_all.deb
dpkg -i squidclient_3.5.8-1_i386.deb

Если система заматерилась на неудовлетворенные зависимости, сделаем:
apt-get -f install

Почти готово. Перейдем в каталог /etc/squid, кое-что там изменим. Создадим pem файлик, необходимый для SSL-Bump’инга:
openssl req -new -newkey rsa:1024 -days 365 -nodes -x509 -keyout squidCA.pem -out squidCA.pem

И приведем squid.conf к следующему виду:
acl localnet src 192.168.1.0/24	# RFC1918 possible internal network

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

dns_nameservers 8.8.8.8
http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow localhost manager
http_access deny manager

http_access allow localnet
http_access allow localhost
http_access deny all

#прозрачный порт указывается опцией intercept
http_port 192.168.1.254:3128 intercept options=NO_SSLv3:NO_SSLv2

#также нужно указать непрозрачный порт, ибо если захотите вручную указать адрес
#прокси в браузере, указав прозрачный порт, вы получите ошибку доступа, поэтому нужно
#указывать непрозрачный порт в браузере, если конечно такое желание будет, к тому же в логах #сыпятся ошибки о том, что непрохрачный порт не указан=) 
http_port 192.168.1.254:3130 options=NO_SSLv3:NO_SSLv2 

#и наконец, указываем HTTPS порт с нужными опциями
https_port 192.168.1.254:3129 intercept ssl-bump options=ALL:NO_SSLv3:NO_SSLv2 connection-auth=off cert=/etc/squid/squidCA.pem

always_direct allow all
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER

#укажем правило со списком блокируемых ресурсов (в файле домены вида .domain.com)
acl blocked ssl::server_name  "/etc/squid/blocked_https.txt"
acl step1 at_step SslBump1
ssl_bump peek step1

#терминируем соединение, если клиент заходит на запрещенный ресурс
ssl_bump terminate blocked 
ssl_bump splice all

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

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_dir aufs /var/spool/squid 20000 49 256
maximum_object_size 61440 KB
minimum_object_size 3 KB

cache_swap_low 90
cache_swap_high 95
maximum_object_size_in_memory 512 KB
memory_replacement_policy lru
logfile_rotate 4

Немного расскажу про конфиг. Документация по ssl_bump, peek-n-splice довольно обширная, но для нашей задачи необходимо знать следующее. Есть несколько этапов «handshaking» (т.е. рукопожатие, взаимодействие с сервером). Описаны они в оф.документации. Нас интересует пример Peek at SNI and Bump. То есть, как следует из названия, мы смотрим SNI-информацию и бампим соединение. Перед этим, мы указываем опцией DONT_VERIFY_PEER, что необходимо принимать сертификаты даже, если они не прошли проверку и опцией sslproxy_cert_error указываем, что нужно отключить проверку сертификатов на сервере. Указанное правило «acl step1 at_step SslBump1» — это есть первый из трех возможных шагов ssl_bump’а. При выполнении этого шага мы получаем только SNI, и ничего более. Нам этого достаточно. Дальше мы используем этот ACL строкой ssl_bump peek step1, то есть непосредственно смотрим SNI, а уже после этого блокируем соединение, если в SNI найден server_name из списка blocked.

Далее завернем файрволом нужные порты на Squid:

iptables -t nat -A PREROUTING -p tcp -m tcp -s 192.168.1.0/24 --dport 443 -j REDIRECT --to-ports 3129
iptables -t nat -A PREROUTING -p tcp -m tcp -s 192.168.1.0/24 --dport 80 -j REDIRECT --to-ports 3128

Все готово! Можно торжественно запускать Squid:
systemctl start squid

Посмотрим, все ли со Squid’ом нормально:
systemctl status squid
● squid.service - LSB: Squid HTTP Proxy version 3.x
   Loaded: loaded (/etc/init.d/squid)
   Active: active (running) since Сб 2015-09-26 21:09:44 YEKT; 2h 6min ago
  Process: 1798 ExecStop=/etc/init.d/squid stop (code=exited, status=0/SUCCESS)
  Process: 1818 ExecStart=/etc/init.d/squid start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/squid.service
           ├─1850 /usr/sbin/squid -YC -f /etc/squid/squid.conf
           ├─1852 (squid-1) -YC -f /etc/squid/squid.conf
           ├─1853 (logfile-daemon) /var/log/squid/access.log
           └─1854 (pinger)

сен 26 21:09:44 squid squid[1850]: Squid Parent: will start 1 kids
сен 26 21:09:44 squid squid[1850]: Squid Parent: (squid-1) process 1852 started
сен 26 21:09:44 squid squid[1818]: Starting Squid HTTP Proxy: squid.

Если ошибок нет, можно работать. К сожалению, при блокировке HTTPS ресурсов, не появляется сообщение Squid’a «Доступ запрещен», а вместо этого браузер выдает ошибку о невозможности создания соединения. Если кто-то подскажет, как это сделать, буду очень рад.

UPD: в версии Кальмара, которую компилировал я изначально, т.е. 3.5.9, найден досадный баг (или фича), из-за которого спустя время перестают открываться некоторые HTTPS сайты. Решение: компилировать версию 3.5.8.

UPD2: создал очередной багрепорт по проблеме в 3.5.9, тему буду обновлять, если что-то прояснится.
UPD3: вышла версия 3.5.10 с исправленными багами, по крайней мере, патч на файл bio.cc там уже применен. Не тестировал пока-что
UPD4: подредактировал статью немного.
UPD5: прямая ссылка для скачивания архива со всеми нужными пакетами (SQUID 3.5.8), пока-что это единственная рабочая версия! Остальные, которые версиями выше, имеют баг, из-за которого Squid перестает работать при прозрачном проксировании HTTPS. ВЕРСИЯ ДЛЯ Х86!!!

ВНИМАНИЕ!!! Во избежание недоразумений, ставьте версию 3.5.8! На ней нет никаких проблем, и если сделано все точно по статье, то все будет работать! Если ставите версию выше, то я не гарантирую правильной работы прозрачной фильтрации!

Очередное Update!!! в src-репозитарии Debian Testing теперь 3.5.10!!! добавляйте в sources.list src-репозитарий squeeze. Там версия 3.1, но ничего страшного, все обновится до версии 3.5.8 как надо, только пути к каталогам измените в соответствии с версией скачанных исходников!

UPD 02.12.15: Я прошу прощения, если заставил кого-то костылить. Перезалил архив squid 3.5.8, там не хватало одного deb пакета! squid 3.5.8_all.

UPD 02.12.15: Внимание! Если у вас проблема с установкой libressl, то нужно сделать так: сначала поставить openssl, а затем уже ставить libressl (если ставите версию из архива с пакетами, то не забывайте сделать замену openssl на libressl, как в статье!). Это решит проблему «невидения» библиотеки libssl.so.32

UPD 10.12.15: Появилась следующая версия статьи, с немного другим подходом к компиляции Кальмара и сборке пакетов. Вот тут

UPD 14.12.15: спешу поделиться с коллегами отличной новостью! Я нашел способ заставить работать новые версии Squid’а без особых танцев с бубном! Необходимо, чтобы у клиентов и в настройках Squid’а были одинаковые DNS! В моем случае, на шлюзе с Кальмаром крутится Bind. Назначил клиентам именно его, и Кальмару директивой:


dns_nameservers 127.0.0.1
. После чего все успешно заработало. Проверено на Squid 4.0.3, собрана БЕЗ Libressl!

UPD 14.12.15: не знаю почему, но в данный момент на Debian 8.2 при сборке Squid’a описанным выше способом выдается сообщение о том, что файл mime.conf не найден. И действительно, ведь в исходниках Кальмара есть mime.conf.default. Я нашел решение. Необходимо отредактировать два файлика:
1) debian/squid-common.install, и привести строку


etc/squid/mime.conf

в такой вид:

etc/squid/mime.conf.default

2) Также необходимо сделать так, чтобы после установки пакета файл переименовался автоматом в «сквидочитаемый вид», т.е. в mime.conf. Для этого отредактируем файл debian/squid-common.postinst, приведя его в такой вид:

#! /bin/sh

set -e

case "$1" in
        configure)
mv /etc/squid/mime.conf.default /etc/squid/mime.conf
...........

То есть добавим строку переименования файла, а остальное оставляем, как есть, не трогаем.
Все, после этого формируем пакеты, они сформируются и поставятся.

UPD 19.06.17: так как у меня спёрли домен linux-admin.tk, пришлось создать новый, уже «нормальный» домен, соответственно ссылку на скачивание архива изменил.

UPD 04.05.18: написал новую статью, где решается проблема глюков новых версий Squid + в логах красивые доменные имена вместо ip адресов + обход блокировок РКН.

Хочу сказать спасибо товарищу Дмитрию Рахматуллину, без него бы не получилось сделать то, что написано выше. Также, отдельное спасибо разработчикам Squid’а, которые оперативно ответили на мой баг-репорт об ошибке в libssl. И спасибо ребятам Nadz Goldman и gmax007 с Тостера, которые направили в нужное русло мои идеи по переносу Squid’а на физически отдельный от основного шлюза сервер.

Прозрачный прокси для https в Squid

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

В наше время все больше и больше сайтов используют HTTPS для обеспечения конфиденциальности своих пользователей. Нет никаких сомнений в том что шифрование это хорошая вещь для безопасности, но оно также создает ряд проблем для контролируемых сетей, часто используемых в офисах. Основной проблемой есть то что кроме пользователя и сервера никто не может видеть и тем более фильтровать зашифрованные данные. Для решения этой проблемы можно использовать прозрачную фильтрацию HTTPS в Squid с помощью расширения ssl_bump.

Содержание статьи:

Как это работает?

Когда пользователь пытается открыть сайт iptables перенаправляет запрос на наш прокси Squid. Обязательно чтобы трафик от пользователей проходил через машину с настроенным iptables и squid. Если используется протокол HTTPS, прокси сервер устанавливает шифрованное соединение с запрашиваемым сервером выдавая себя за браузер, а затем на основе собственного корневого сертификата подписывает новый SSL сертификат для запрашиваемого доменного имени и отправляет его браузеру пользователя выдавая себя за сервер. Таким образом устанавливается два шифрованных соединения и прокси получает полный доступ к проходимому трафику. Получается такая себе подмена сертификата HTTPS Squid.

Установка Squid и OpenSSL в Gentoo

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

sudo emerge -av openssl

Если вы работаете в Gentoo, то теперь squid нужно собрать с поддержкой SSL и динамической генерации сертификатов, а это соответственно опции: —enable-ssl и —enable-ssl-crtd, поэтому:

nano /etc/portage/package.use

net-proxy/squid ssl-crtd ssl

Затем осталось установить Squid:

sudo emerge -pv squid

Установка Squid и OpenSSL в Ubuntu

Прежде чем будет выполнятся настройка HTTPS Squid, надо установить правильный прокси сервер и OpenSSL. Для Ubuntu и других дистрибутивов, основанных на Debian команда установки OpenSSL будет выглядеть вот так:

sudo apt install openssl

С Squid дела обстоят сложнее. Версия, которая есть в репозиториях не поддерживает работу с SSL. Поэтому придется собрать её вручную. Для этого сначала установите зависимости, необходимые для сборки:

sudo apt build-dep squid

Затем установите библиотеку для SSL:

sudo apt install libssl-dev

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

mkdir ~/squid_build && cd ~/squid_build

Скачайте в эту папку исходники Squid:

sudo apt source squid

В текущей папке появится ещё одна папка с исходниками, перейдите в неё.

Затем надо отредактировать файл debian/rules и добавить в него следующие флаги компиляции:

sudo vi debian/rules

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

Эти опции надо вставить в переменную BUILD_CXX, она там одна такая. Затем останется только собрать и установить полученный пакет:

sudo debuild -d -uc -us

sudo dpkg -i ../squid*.deb

После установки вы можете убедится, что ваша версия Squid теперь поддерживает SSL выполнив:

squid -v | grep ssl

Настройка Squid

Сначала создадим папку для хранения сертификатов, например в /etc/squid/ssl:

mkdir /etc/squid/ssl

Теперь генерируем корневой сертификат собственного CA (Центра сертификации) на основе которого будут подписываться сертификаты для сайтов:

cd /etc/squid/ssl

sudo openssl genrsa -out /etc/squid/ssl/squid.key
sudo openssl req -new -key /etc/squid/ssl/squid.key -out /etc/squid/ssl/squid.csr


sudo openssl x509 -req -days 3650 -in /etc/squid/ssl/squid.csr -signkey /etc/squid/ssl/squid.key -out /etc/squid/ssl/squid.pem

Генерируем корневой сертификат который затем нужно будет добавить в браузер:

sudo openssl x509 -in /etc/squid/ssl/squid.pem -outform DER -out squid.der

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

chown -R proxy:proxy /etc/squid/ssl

В файл конфигурации надо добавить такие настройки:

sudo vi /etc/squid/squid.conf

http_access allow all
http_port 3128
http_port 3129 intercept
https_port 3130 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/ssl/squid.pem key=/etc/squid/ssl/squid.key
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER
always_direct allow all
ssl_bump server-first all

ssl_bump none all
sslcrtd_program /usr/lib/squid/security_file_certgen -s /var/lib/ssl_db -M 4MB

Путь /usr/lib/squid/security_file_certgen (ранее /usr/libexec/squid/ssl_crtd) указывать обязательно иначе будет ошибка. Директива http_access allow all разрешает все подключения к Squid, не используйте её в production версии она добавлена здесь для того, чтобы не засорять конфигурационный файл настройкой доступа и сосредоточится на SSL и прозрачном прокси. Первый порт для http_port — это обычный прокси, к нему можно подключится из браузера, следующие два, с ключевым словом intercept прозрачные, работают только с помощью редиректа в iptables.

Дальше нужно пересоздать базу данных сертификатов:

rm -rf /var/lib/ssl_db

/usr/lib/squid/security_file_certgen -c -s /var/lib/ssl_db -M 4MB

chown -R proxy:proxy /var/lib/ssl_db

Сервис Squid должен обязательно иметь права на директорию /var/lib/ssl_db. Следующим шагом включаем ip_forwarding для разрешения проходящего трафика через узел:

echo 1 >> /proc/sys/net/ipv4/ip_forward

Затем можно перезапускать Squid:

sudo systemctl restart squid

Прозрачный прокси Squid HTTPS настроен, осталось настроить редирект и браузер.

Настройка iptables

Перенаправляем весь проходящий через узел трафик с целевыми портами http и https на squid:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3129

iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 3130

Если вы хотите тестировать прокси с локальным трафиком, то надо перенаправлять на Squid весь трафик, кроме трафика от Squid, это можно сделать такими правилами:

sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner proxy --dport 80 -j REDIRECT --to-port 3129

sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner proxy --dport 443 -j REDIRECT --to-port 3130

Настройка браузера

Сейчас большинство сайтов используют технологию HSTS для предотвращения MiTM атак, поэтому если вы хотите настроить Squid для фильтрации трафика в своей организации, вам следует добавить сертификат .der сгенерированный на предыдущем шаге в браузер. Рассмотрим на примере Firefox. Откройте Настройки -> Защита и приватность -> Просмотр сертификатов -> Центры сертификации:

Затем нажмите кнопку Импортировать и выберите файл squid.der, находящейся в директории /etc/squid/ssl. Отметьте галочки, что следует доверять этому сертификату.

Фильтрация трафика

Теперь откройте какой-либо сайт. Если всё сделано верно, то сайт откроется, но сертификат будет не его, а ваш:

Прозрачный прокси для https заработает и в логе /var/log/squid/access.log вы увидите куда и зачем ходит пользователь:

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

Завершение

В этой статье мы разобрали как выполняется настройка HTTPS Squid 4. Как видите мы можем узнать какие страницы и изображения запрашивает пользователь, а этого более чем достаточно для нормального контроля трафика. Далее можно настраивать правила блокировки и фильтрации как это обычно делается для Squid.

Иногда важно отдохнуть, расслабиться, посмотреть на природу. На десерт сегодня, красивое видео — путь на вершину:

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

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

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

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

Пакет Squid доступен в стандартном репозитории
В Ubuntu/Debian

$ sudo apt-get -y install squid

В Redhat/Centos

# yum install –y squid

Запустите его и задайте запуск при загрузке:

$ sudo systemctl start squid
$ sudo systemctl enable squid

После этого можно проверить статус службы:

$ sudo systemctl status squid

Важные файлы Squid располагаются в следующих директориях:

Файл конфигурации: /etc/squid/squid.conf
Журнал доступа: /var/log/squid/access.log
Журнал кэша: /var/log/squid/cache.log

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

$ sudo vim /etc/squid/squid.conf

В нем довольно много параметров, мы рассмотрим самые важные из них.

http_port  порт HTTP-прокси сервера, по умолчанию 3128. Для безопасности рекомендуется сменить его на другой.
visible_hostname Параметр используется для определения имени узла сервера Squid. Можно задать любое имя.

Также можно указать параметр intercept (или transparent для старых версий), например, http_port 3128 intercept. В этом случае ваш сервер будет работать как прозрачный прокси (без необходимости настраивать его использование на стороне клиента).

Для последующего понимания работы прокси, нужно понять следующие параметры

http_access-Данный параметр регулирует доступ к HTTP-прокси серверу. С помощью него можно разрешить или запретить доступ через сервер как к определенным ресурсам в интернете, так и определенным группам пользователей.
В данный момент любой доступ запрещен (deny all). Чтобы начать использование сервера, нужно изменить ее, например, на http_access allow all (разрешить любой доступ). Параметр all можно заменить на имя списка доступа, которые мы рассмотрим чуть ниже.
acl(access control list) — В этом параметре указываются ресурсы в интернете, порты, ip адреса пользователей, локальные сети. В общем это список к которому будут применяться различные правила. Таких списков может быть неограниченное количество.

После внесения изменений нужно перезапустить Squid следующей командой:

$ sudo systemctl restart squid

Настройка Squid как HTTP-прокси

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

http_access [allow/deny] [название acl]

При описании контроля доступа можно использовать оператор отрицания «!». Например следующая строка запрещает доступ ко всем портам, кроме описанных в листе Safe_ports

http_access deny !Safe_ports

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

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

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

Вы можете его отредактировать или удалить. Создадим новый acl

$ sudo vim /etc/squid/squid.conf

Добавьте правило следующего вида:

acl boss src XX.XX.XX.XX

Где boss — имя списка контроля доступа, src — параметр, задающий адрес источника (source), а XX.XX.XX.XX — IP-адрес машины клиента (можно также указывать подсети или диапазоны). Новые списки контроля доступа нужно добавлять в начало раздела ACL. Аналогичным образом можно создавать списки доступа с ограничением по адресу места назначения (параметр dst вместо src), а также использовать вместо адресов доменные имена (srcdomain для источника, dstdomain для места назначения).

Очень желательно рядом с ACL указывать комментарий с кратким описанием пользователя этого IP-адреса, например:

acl boss src 192.168.0.102 # IP-адрес руководителя

После этого нужно разрешить доступ для boss:

http_access allow boss

Чтобы изменения вступили в силу, нужно перезагрузить Squid.

$ sudo systemctl restart squid

Открытие портов

По умолчанию в конфигурации Squid разрешено использование только определенных портов.

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 XXX

Где XXX — номер порта, использование которого нужно разрешить. Снова желательно пояснять ACL комментарием.

Не забываем перезапустить Squid для применения настроек

Работа прокси в прозрачном режиме

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

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

В случае использования iptables нужно добавить следующие правила (в рассматриваемом примере eth2 — внутренний интерфейс, eth0 — внешний, SQUID_IP — IP-адрес прокси-сервера):

iptables -t nat -A PREROUTING -i eth2 -p tcp --dport 80 -j DNAT --to SQUID_IP:3128
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

Аутентификация клиента

Cоздадим файл passwd для хранения имени пользователя для аутентификации. Сквид работает как пользователь squid, поэтому он должен быть владельцем файла.

$ sudo touch /etc/squid/passwd
$ sudo chown squid:squid /etc/squid/passwd

Создадим нового пользователя ivan и установим ему пароль.

$ sudo htpasswd /etc/squid/passwd ivan

Для задания базовой HTTP-аутентифркации откройте файл конфигурации Сквид в текстовом редакторе:

$ sudo vim /etc/squid/squid.conf

И пропишите следующие директивы после ACL портов:

auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm Squid Basic Authentication
auth_param basic credentialsttl 2 hours
acl auth_users proxy_auth REQUIRED
http_access allow auth_users

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

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

Одна из важных функций прокси-сервера — кэширование веб-страниц для разгрузки веб-сервера и ускорения доступа. Сквид поддерживает два типа кэша, в оперативной памяти и на жёстком диске.

Кэш в оперативной памяти настраивается следующими параметрами:

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

Параметры кэша на жёстком диске задаются следующей директивой:

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

Размер указывается в мегабайтах, ур_1 и ур_2 — количество директорий первого и второго уровня, соответственно, например:

cache_dir ufs /var/squid_cache 2048 32 512

Аналогично кэшу в памяти при помощи следующего параметра указывается максимальный размер объекта в кэше на диске:

maximum_object_size 8 MB

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

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

Для реализации ограничения скорости Сквид использует механизм пулов задержки (delay pools). Пулы задержки можно условно представить в виде ёмкости, которая “заполняется” данными, и после этого “выпускает” их только с определенной скоростью. Количество пулов задаётся в файле конфигурации следующим образом:

delay_pools количество_пулов

Каждый пул имеет номер (от 1 до заданного количества), а также класс. Классы реализуют многоступенчатую структуру ограничения:

1 класс — общее ограничение
2 класс — общее ограничение и ограничения для подсетей
3 класс — общее ограничение, ограничения для подсетей и ограничения для отдельных ip-адресов

Классы пулов задаются директивой delay_class, в качестве аргументов которой передаются номер пула и класс.

delay_pools 2
delay_class 1 1
delay_class 2 2

Параметры пулов задаются директивой delay_parameters и описывают максимальный объем пула и ограничение на каждый уровень (в байтах) в зависимости от класса. Например, параметры для пула 1 класса с номером 1:

delay_parameters 1 64000/256000

Будут означать, что после получения первых 256 Кб запроса на максимальной скорости скорость будет ограничена 64 Кб/с, то есть 512 Кбит/с.

Для 2 класса и выше аналогичным образом задаются ограничения для подсети, отдельного адреса и т.д., например следующая директива ограничивает общую скорость до 8 Мбит/с, а скорость для подсети после первых 256 Кб запроса — до 512 Кбит/с.

delay_parameters 2 512000/512000 64000/256000

Чтобы задать пулы задержки для определенных списков контроля доступа, используется директива delay_access, содержащая номер пула, параметр allow или deny и имя списка, например:

delay_access 2 allow localnet

для примера создадим два пула, 1 и 2 класса:

delay_pools 2 # Инициируем 2 пула
delay_class 1 1 # 1-й пул 1-го класса
delay_access 1 allow office1 # В первый пул попадает только пользователи acl office1
delay_access 1 deny all # Запрещаем доступ к пулу всем остальным
delay_parameters 1 64000/256000 # Ограничиваем скорость

Теперь пользователи из листа office1 будут иметь скорость доступа в интернет в соответствии с delay_parameters 1.
Создаем 2-й класс

delay_class 2 2
delay_access 2 allow office2
delay_access 2 deny all
delay_parameters 2 512000/512000 64000/256000

Это означает, что пользователи acl office2 ограничены общей скоростью на всю сеть в 512 кбит, но при этом отдельные пользователи в этой сети ограничены после первых 256 Кб, скоростью в 64 кбит
Проверим на сайте speedtest.net, работу ограничений

Как видите скорость загрузки действительно ограничена приблизительно до 256 кбит. Обратите внимание, что сквид ограничивает только скорость отдачи от него, т.е скорость загрузки пользователя. На скорость отдачи от пользователя ограничение не действует.

Блокировка веб-сайтов

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

$ sudo touch /etc/squid/blacklisted_sites.acl

Теперь в этот файл нужно добавить сайты, к которым требуется заблокировать доступ. Например заблокируем доступа к одноклассникам и вконтакте:

.vk.com
.ok.ru

Точки перед именами указывают Сквид блокировать все ссылки на эти сайты, в том числе www. vk.com, subsite.vk.com и т.д.

Далее нужно открыть файл конфигурации

$ sudo vim /etc/squid/squid.conf

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

acl bad_urls dstdomain "/etc/squid/blacklisted_sites.acl"
http_access deny bad_urls

Обратите внимание на порядок расположения правил, правила доступа выполняются сверху вниз. Поэтому запрещающее правило расположено выше разрешающего
Сохраните файл и перезапустите Squid:

$ sudo systemctl restart squid

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

Блокировка по маске

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

$ sudo touch /etc/squid/blockkeywords.lst

Далее в него добавляются ключевые слова, например:

facebook
instagram
gmail

Откройте файл конфигурации и внесите в него следующие список контроля доступа и правило:

acl blockkeywordlist url_regex "/etc/squid/blockkeywords.lst"
http_access deny blockkeywordlist

А затем сохраните файл и перезапустите Сквид:

$ sudo systemctl restart squid

Теперь, все сайты в названии доменов которых встречаются facebook, instagram, gmail будут заблокированы.

Заключение

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

«Прозрачный» Squid с фильтрацией HTTPS ресурсов без подмены сертификатов (х86, х64 — универсальная инструкция)

Всем привет! Прошлая статья про прозрачное проксирование HTTPS с помощью Squid’a была вполне успешной. Приходило по почте множество отзывов об успешной установке данной системы. Но также и поступали письма с просьбами о помощи. Проблемы были вполне решаемыми. Но не так давно обратилась ко мне одна коллега с просьбой о помощи в установке этой системы на х64 архитектуре (Debian). Тут мы озадачились. Во-первых, оказалось, что прошлая статья непригодна для этого по причине отсутствия нужных исходников в репозитории Debian (там теперь 3.5.10). Найти нужные в первой статье Debian’овские исходники не удалось, а checkinstall выдавал странные ошибки. Во-вторых, хотелось более универсального решения, которое бы без проблем работало и на х64, и на х86, и (по-возможности) на других дистрибутивах. Решение было найдено. Получилось небольшое дополнение к предыдущей статье + некоторые уточнения. Данная инструкция позволяет скомпилировать как х86, так и х64 версии Squid’a и создать соответствующие пакеты. Инструкция будет разбита на несколько пунктов и подпунктов. Если интересно, идем под кат:
Идем по-порядку.
1)
а) Для начала, подготовимся к сборке пакетов:
apt-get install git fakeroot checkinstall build-essential devscripts patch
apt-cache policy squid3
apt-get build-dep squid3
apt-get build-dep libecap2
apt-get install libssl-dev libgnutls28-dev

Не забудьте перейти в ту папку, где вы будете собирать исходники, чтобы не загадить себе Хоум.
б) Далее скачаем Libressl:
wget http://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.1.6.tar.gz
tar -xzvf libressl-2.1.6.tar.gz
cd libressl-2.1.6

в) А теперь собираем:
./configure
make
checkinstall --pkgname libressl --pkgversion 2.1.6

2) Теперь можно установить Libressl:

dpkg -i libressl_2.1.6-1_amd64.deb	
ldconfig

После установки необходимо настроить использование LibreSSL по-умолчанию:
mv /usr/bin/openssl /usr/bin/openssl-1
update-alternatives --install /usr/bin/openssl openssl /usr/bin/openssl-1 10
update-alternatives --install /usr/bin/openssl openssl /usr/local/bin/openssl 50
update-alternatives --config openssl

Проверим, получилось ли поставить Libressl:
openssl version
    LibreSSL 2.1.6

Если выхлоп консоли похожий, то все получилось. Идем дальше.

3) На очереди Libecap.
а) Необходимо отредактировать sources.list, включив туда исходники из ветки testing (это необходимо, так как нам нужно компилировать новый libecap, который в свою очередь необходим для сборки Squid):

deb-src http://ftp.de.debian.org/debian/ testing main contrib non-free

Обновим кеш пакетов:
apt-get update

А теперь скачаем из Testing нужные исходники:
apt-get source libecap3/testing

Далее соберем libecap:
cd libecap-1.0.1/
dpkg-buildpackage -us -uc -nc -d

б) Удалим старье, и установим новье:
apt-get purge libecap2
libecap3_1.0.1-2_amd64.deb
libecap3-dev_1.0.1-2_amd64.deb

4) Подобрались к компиляции самого Squid’a.
а) Качаем последний самый работающий снэпшот Squid’a:

wget http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.8.tar.gz

Распакуем:
tar -xf squid-3.5.8.tar.gz
cd squid-3.5.8

б) Качаем патч для bio.cc, и патчим:
wget -O bug-4330-put_cipher_by_char-t1.patch http://bugs.squid-cache.org/attachment.cgi?id=3216
patch -p0 -i bug-4330-put_cipher_by_char-t1.patch
»  patching file src/ssl/bio.cc

5) А этот этап один из самых ответственных. Необходимо сконфигурировать Squid с нужными опциями. В предыдущей статье использовался файл debian/rules, но компилировать Squid в этой инструкции мы будем с помощью make, и создавать пакеты будем с помощью checkinstall. Поэтому опций будет побольше. И вот какие:

./configure --build=x86_64-linux-gnu \
--prefix=/usr \
--includedir=${prefix}/include \
--mandir=${prefix}/share/man \
--infodir=${prefix}/share/info \
--sysconfdir=/etc \
--localstatedir=/var \
--libexecdir=${prefix}/lib/squid \
--srcdir=. \
--disable-maintainer-mode \
--disable-dependency-tracking \
--disable-silent-rules \
--datadir=/usr/share/squid \
--sysconfdir=/etc/squid \
--mandir=/usr/share/man \
--enable-inline \
--disable-arch-native \
--enable-async-io=8 \
--enable-storeio=ufs,aufs,diskd,rock \
--enable-removal-policies=lru,heap \
--enable-delay-pools \
--enable-cache-digests \
--enable-icap-client \
--enable-follow-x-forwarded-for \
--enable-auth-basic=DB,fake,getpwnam,LDAP,NCSA,NIS,PAM,POP3,RADIUS,SASL,SMB \
--enable-auth-digest=file,LDAP \
--enable-auth-negotiate=kerberos,wrapper \
--enable-auth-ntlm=fake,smb_lm \
--enable-external-acl-helpers=file_userip,kerberos_ldap_group,LDAP_group,session,SQL_session,unix_group,wbinfo_group \
--enable-url-rewrite-helpers=fake \
--enable-eui \
--enable-esi \
--enable-icmp \
--enable-zph-qos \
--enable-ecap \
--disable-translation \
--with-swapdir=/var/spool/squid \
--with-logdir=/var/log/squid \
--with-pidfile=/var/run/squid.pid \
--with-filedescriptors=65536 \
--with-large-files \
--with-default-user=proxy \
--enable-ssl \
--enable-ssl-crtd \
--with-openssl \
--enable-linux-netfilter \
'CFLAGS=-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wall' \
'LDFLAGS=-fPIE -pie -Wl,-z,relro -Wl,-z,now' \
'CPPFLAGS=-D_FORTIFY_SOURCE=2' \
'CXXFLAGS=-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security'

Будьте предельно внимательны. Нас больше интересуют, как и в предыдущей статье, три опции: —enable-ssl, —enable-ssl-crtd, —with-openssl. Остальные опции можете изменять в соответствие с вашими предпочтениями (если хотите их менять, обязательно прочитайте документацию по конфигурированию).

6) Теперь мы добрались до компилирования.
а) Компилируем.

make

б) Неоднозначный этап. Необходимо создать директории /usr/share/squid/ и /usr/share/squid/icons, иначе следующий этап не выполнится из-за отсутствия этих папок (почему checkinstall их сам не создает, я не разбирался, к сожалению):
mkdir -p  /usr/share/squid/icons 

в) А теперь создаем установочные пакеты:
checkinstall --pkgname squid --pkgversion 3.5.8

7) Мы подходим к финалу. Устанавливаем Squid:

dpkg -i squid_3.5.8-1_amd64.deb
Заголовок спойлера

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

8) Пробуем запустить squid:

systemctl start squid

И видим большую ФИГУ! Надо же… Пробуем по-старинке:
service squid start

И тоже видим большую ФИГУ. Почему? Потому что checkinstall не включил в пакет файлы сервиса Squid. Не беда. Создадим сами нужный сервис systemd:
touch /etc/systemd/system/squid.service
nano /etc/systemd/system/squid.service

Со следующим содержимым:
## Copyright (C) 1996-2015 The Squid Software Foundation and contributors
##
## Squid software is distributed under GPLv2+ license and includes
## contributions from numerous individuals and organizations.
## Please see the COPYING and CONTRIBUTORS files for details.
##

[Unit]
Description=Squid Web Proxy Server
After=network.target

[Service]
Type=simple
ExecStart=/usr/sbin/squid -sYC -N
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process

[Install]
WantedBy=multi-user.target
Заголовок спойлера

На самом деле, этот самый сервис есть в архиве с исходниками Squid’a. По каким причинам Checkinstall его не включил в пакет, не известно.

Включим созданный сервис

systemctl enable squid

9) Да, вы правы, это еще не все. Так как мы компилировали полностью оригинальные исходники (за исключением патча на bio.cc), конфигурационные файлы у нас установились вида squid.conf.default, mime.conf.default и т.п. Конечно же, Squid о них и не слышал. Переименуем их в Squid’очитаемый вид:

cp /etc/squid/squid.conf.default /etc/squid/squid.conf
cp /etc/squid/mime.conf.default /etc/squid/mime.conf
cp /etc/squid/cachemgr.conf.default /etc/squid/cachemgr.conf
cp /etc/squid/errorpage.css.default /etc/squid/errorpage.css

10) И это еще не все=) Необходимо вручную создать папку для логов Squid’a и назначить ей соответствующие права:

mkdir /var/log/squid
chown proxy /var/log/squid

11) И вот он — финальный этап. Запуск Squid’a и проверка статуса сервиса!

systemctl start squid

systemctl status -l squid
● squid.service - Squid Web Proxy Server
   Loaded: loaded (/etc/systemd/system/squid.service; enabled)
   Active: active (running) since Пт 2015-12-04 23:32:04 YEKT; 2min 41s ago
 Main PID: 590 (squid)
   CGroup: /system.slice/squid.service
           ├─590 /usr/sbin/squid -sYC -N
           └─591 (logfile-daemon) /var/log/squid/access.log

дек 04 23:32:04 squidX64 squid[590]: Max Swap size: 0 KB
дек 04 23:32:04 squidX64 squid[590]: Using Least Load store dir selection
дек 04 23:32:04 squidX64 squid[590]: Current Directory is /
дек 04 23:32:04 squidX64 squid[590]: Finished loading MIME types and icons.
дек 04 23:32:04 squidX64 squid[590]: HTCP Disabled.
дек 04 23:32:04 squidX64 squid[590]: Pinger socket opened on FD 16
дек 04 23:32:04 squidX64 squid[590]: Squid plugin modules loaded: 0
дек 04 23:32:04 squidX64 squid[590]: Adaptation support is off.
дек 04 23:32:04 squidX64 squid[590]: Accepting HTTP Socket connections at local=[::]:3128 remote=[::] FD 14 flags=9
дек 04 23:32:05 squidX64 squid[590]: storeLateRelease: released 0 objects

Если выхлоп консоли выглядит похоже, а точнее в нем нет ошибок и обязательно присутствует строка «Active: active (running)», то вы успешно установили себе Squid с поддержкой прозрачного проксирования HTTPS! Поздравляю!

Если не хочется ничего компилировать, то можете скачать архив с готовыми deb пакетами (x64 версия!). Если будете устанавливать из готовых пакетов, то вам нужны будут шаги: 2, 3(б), 7, 8, 9, 10, 11.

Также хочу отметить, что checkinstall позволяет создавать пакеты rpm, и вы можете этим воспользоваться. Единственное, нужно все пакеты собирать с помощью checkinstall, но я думаю, проблем с этим не будет, так как основное и самое сложное уже собрано именно checkinstall’ом.

Конфигурационный файл Squid’a с нужными директивами, описание работы и т.п. читайте в предыдущей статье!

Спасибо Татьяне Илларионовой и разработчикам Squid’a за помощь в создании данного рецепта!

UPD 11.12.15: По просьбе пользователя nikitasius проверил Cloudflare. Товарищ nikitasius писал в комментариях:

Видимо для сайтов, которые за Cloudflare такая система корректно работать не будет…
У них как правило пачка доменов в сертификатах.
В случае, если example.com находится в одном сертификате с freepron.cum, кальмар сработает на freepron, если последний в локальном бане, так?
Так вот, проверил. Добавил один из его доменов из Cloudflare в черный список блокировки HTTPS, на него браузер не заходит, но на другие домены, которые прописаны в сертификате, браузер спокойно заходит. Так что, проверка Cloudflare пройдена

UPD 14.12.15: спешу поделиться с коллегами отличной новостью! Я нашел способ заставить работать новые версии Squid’а без особых танцев с бубном! Необходимо, чтобы у клиентов и в настройках Squid’а были одинаковые DNS! В моем случае, на шлюзе с Кальмаром крутится Bind. Назначил клиентам именно его, и Кальмару директивой:

dns_nameservers 127.0.0.1
. После чего все успешно заработало. Проверено на Squid 4.0.3, собрана БЕЗ Libressl!

UPD 16.12.15: Пакеты для Centos!

UPD 25.04.16: Просьба для тех, кто тестировал х64 сборку написать, все ли работает. Есть сообщения о глюках, в частности сильная нагрузка на ЦП после истечении некоторого времени и последующий сегфолт. Сам проверить пока-что не могу

UPD 04.05.18: написал новую статью, где решается проблема глюков новых версий Squid + в логах красивые доменные имена вместо ip адресов + обход блокировок РКН.

Для тех, кто думает, что это MITM =)

В опросе последний пункт конечно же шуточный=) Если ВНИМАТЕЛЬНО прочитать предыдущую статью, то сразу станет ясно, что никакой атаки на пользователя нет, так как не происходит подмены сертификатов!!!

Как SQUID следит за http и https трафиком

Прочитано: 2 790

Сегодня я покажу, как реализовать вот такую вот схему:

Компьютер с двумя сетевыми картами, одна eth0 смотрит в интернет, а другая eth2 смотрит в локальную сеть. Далее на этой системе будет развернут пакет DNSMASQ (для управления DNS и DHCP в локальной сети) и пакет SQUID версии 3.5.19 с поддержкой анализа, как трафика http так и зашифрованного трафика https на котором уже большинство ресурсов работает. Также будет разобрано, как получать статистику использования интернета не по назначению. Для чего все это? — дело в том, что на текущем месте поставили задачу нужно руководству предоставлять статистику по сотрудникам как они в рабочее время используют ресурсы интернета, а то что-то в последнее время упала производительность отделов и нужно это хоть как-то обосновать перед учредителями. Ну это если честно не моё дело, мне поручено предоставить сформированную статистику, чем я и займусь в рамках описания пошаговых действий.

И так в моем распоряжении система (Ubuntu 14.04.5 Server amd64) со следующими характеристиками:

если нужно будет больше, то HDD я расширю через LVM (система обязательно должна стоять на LVM разделе), а CPU & RAM через vSphere Client в свойствах виртуальном машины, физическое же использование серверов уже подошло к концу или применяется под выполнение конкретных задач, я же с таким редко сталкиваюсь, а потому стараюсь задействовать виртуализацию.

Начинаю…

Шаг №1: Настройка сетевых интерфейсов:

[email protected]:~$ sudo nano /etc/network/interfaces

auto eth0

iface eth0 inet dhcp

auto eth2

iface eth2 inet static

address 10.90.90.1

netmask 255.255.255.0

[email protected]:~$ sudo ifup eth2

(У меня интерфейс eth0 получает от Mikrotik (который является шлюзом в интернет) сетевой адрес который прописан, как статика для данной системы)

Шаг №2: Привожу систему к актуальному состоянию в рамках текущего релиза Ubuntu Trusty:

[email protected]:~$ sudo rm -Rf /var/lib/apt/lists/

[email protected]:~$ sudo apt-get update && sudo apt-get upgrade -y

Итого информация по системе:

[email protected]:~$ uname -a && lsb_release -a

Linux srv-host 3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:16:20 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

No LSB modules are available.

Distributor ID: Ubuntu

Description: Ubuntu 14.04.5 LTS

Release: 14.04

Codename: trusty

Шаг №3: Указываю именование системы, настраиваю часовой пояс, время:

[email protected]:~$ sudo nano /etc/hosts

10.90.90.1 srv-host.polygon.local srv-host

[email protected]:~$ sudo nano /etc/hostname

srv-host.polygon.local

[email protected]:~$ sudo apt-get install ntpdate ntp -y

[email protected]:~$ sudo nano /etc/ntp.conf

server <IP_ADDRESS_MIKROTIK>

Шаг №4: Устанавливаю пакет dnsmasq и настраиваю его:

[email protected]:~$ sudo apt-get install dnsmasq -y

[email protected]:~$ dnsmasq --version | head -n 1

Dnsmasq version 2.68 Copyright (c) 2000-2013 Simon Kelley

[email protected]:~$ sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.backup

[email protected]:~$ sudo bash -c "cat > /etc/dnsmasq.conf"

^C — по клавиатурному сочетанию Ctrl + C прерываем выполнение команды выше по очистке содержимого файла /etc/dnsmasq.conf

[email protected]:~$

[email protected]:~$ sudo nano /etc/dnsmasq.conf

interface=eth2

resolv-file=/etc/resolv.dnsmasq.conf

domain=polygon.local

server=/polygon.local/10.90.90.1

server=/90.90.10.in-addr.arpa/10.90.90.1

dhcp-range=10.90.90.20,10.90.90.30,1D

dhcp-option=3,10.90.90.1

dhcp-leasefile=/var/lib/misc/dnsmasq.leases

log-queries

log-facility=/var/log/dnsmasq.log

dhcp-option=1,255.255.255.0

Проверяю конфигурационный файл /etc/dnsmasq.conf на корректность:

[email protected]:~$ /usr/sbin/dnsmasq --test

dnsmasq: syntax check OK.

Советую после внесения изменений в файл /etc/dnsmasq.conf делать (stop && start, restart у меня почему-то не отрабатывал и я кучу времени убил на это чтобы выяснить):

[email protected]:~$ sudo /etc/init.d/dnsmasq stop

[email protected]:~$ sudo /etc/init.d/dnsmasq start

Снимаем символ комментария со строки в файле dhclient.conf:

ekzorc[email protected]:~$ sudo nano /etc/dhcp/dhclient.conf

prepend domain-name-servers 127.0.0.1;

Шаг №5: Нужно настроить правила маршрутизации для обработки соединений от локальной сети.

[email protected]:~$ sudo ufw enable

Command may disrupt existing ssh connections. Proceed with operation (y|n)? y

Firewall is active and enabled on system startup

[email protected]:~$ sudo nano /etc/default/ufw

IPV6=no

DEFAULT_FORWARD_POLICY="ACCEPT"

[email protected]:~$ sudo nano /etc/ufw/sysctl.conf

net/ipv4/ip_forward=1

#IPv6

net.ipv6.conf.all.disable_ipv6=1

net.ipv6.conf.default.disable_ipv6=1

net.ipv6.conf.lo.disable_ipv6=1

[email protected]:~$ sudo ufw default deny

Default incoming policy changed to 'deny'

(be sure to update your rules accordingly)

[email protected]:~$ sudo ufw allow ssh

Для DNS — это 53 порт (TCP+UDP)

[email protected]:~$ sudo ufw allow domain

Для DHCP — это порт 67 и 68 UDP

[email protected]:~$ sudo ufw allow from any port 68 to any port 67 proto udp

[email protected]:~$ sudo ufw logging on

[email protected]:~$ sudo nano /etc/ufw/before.rules

*nat

:POSTROUTING ACCEPT [0:0]

-A POSTROUTING -s 10.90.90.0/24 -o eth0 -j MASQUERADE

COMMIT

[email protected]:~$ sudo ufw disable && sudo ufw enable

Firewall stopped and disabled on system startup

Command may disrupt existing ssh connections. Proceed with operation (y|n)? y

Firewall is active and enabled on system startup

[email protected]:~$ sudo ufw reload

[email protected]:~$ sudo ufw status

Шаг №6: Проверяю, что рабочие станции в локальной сети за данной системой (srv-host) получают (если не получают то попробуйте прописать вручную, если работает то значит Вы что-то намудрили в конфигурационном файле dnsmasq.conf) сетевой адрес из диапазона и видят интернет.

C:\Windows\system32>ping ya.ru

Обмен пакетами с ya.ru [93.158.134.3] с 32 байтами данных:

Ответ от 93.158.134.3: число байт=32 время=8мс TTL=53

Ответ от 93.158.134.3: число байт=32 время=7мс TTL=53

Шаг №7: Теперь собственно самый ответственный шаг — это установка и настройка squid на данной Ubuntu‘овской системе которая в настоящий момент выполняет роль шлюза ориентированного для малой сети, где использование домен контроллера не оправдано (к примеру сеть полностью состоит из Linux машин, или парк машин ограничен малым числом, и т.д).

Текущая версия squid из дефолтных репозитариев слишком стара, а потому я произведу установку репозитария в котором я убедился присутствует версию deb пакета squid равным 3.5.19

[email protected]:~$ apt-cache show squid3 | grep Version

Version: 3.3.8-1ubuntu6.8

Version: 3.3.8-1ubuntu6

[email protected]:~$ sudo nano /etc/apt/sources.list

deb http://ubuntu.diladele.com/ubuntu trusty main

deb-src http://ubuntu.diladele.com/ubuntu trusty main

На заметку: советую выделить отдельно стоящую систему на которой развернуть сервер кэширующих пакетов (deb), в частности задействовав утилиту apt-cacher. Этим вы всегда будете иметь все пакеты (deb-пакеты) которые вы когда либо ставили, по сути это будет Ваша резервная копия и Вы не будете зависеть ни от кого.

Обновляю информацию по репозитариям добавленным в систему:

[email protected]:~$ sudo apt-get update

Теперь смотрю какая версия squid мне доступна для установки:

[email protected]:~$ apt-cache show squid3 | grep Version

Version: 3.5.19-1

Version: 3.3.8-1ubuntu6.8

Version: 3.3.8-1ubuntu6

Отлично, а теперь приступаю к установке:

[email protected]:~$ nano script-tools.sh

# install build tools

apt-get -y install devscripts build-essential fakeroot debhelper dh-autoreconf cdbs

# install build dependences for squid

apt-get -y build-dep libecap

apt-get -y build-dep squid3

# uninstall libecap2 as we will be using the libecap3

apt-get -y --purge remove libecap2-dev libecap2

# install additional packages for new squid

apt-get -y install nettle-dev libgnutls28-dev libssl-dev libdbi-perl

[email protected]:~$ sudo sh ./script-tools.sh

После ставлю пакет libecap3:

[email protected]:~$ sudo apt-get install libecap3 libecap3-dev -y --force-yes

А теперь ставлю Squid версии 3.5.19 с поддержкой OpenSSL:

[email protected]:~$ sudo apt-get install squid-langpack squid-common squid squidclient -y --force-yes

[email protected]:~$ squid -v

Squid Cache: Version 3.5.19

Service Name: squid

Ubuntu linux

configure options: '--build=x86_64-linux-gnu' '--prefix=/usr' '--includedir=${prefix}/include' '--mandir=${prefix}/share/man' '--infodir=${prefix}/share/info' '--sysconfdir=/etc' '--localstatedir=/var' '--libexecdir=${prefix}/lib/squid3' '--srcdir=.' '--disable-maintainer-mode' '--disable-dependency-tracking' '--disable-silent-rules' 'BUILDCXXFLAGS=-g -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' '--datadir=/usr/share/squid' '--sysconfdir=/etc/squid' '--libexecdir=/usr/lib/squid' '--mandir=/usr/share/man' '--enable-inline' '--disable-arch-native' '--enable-async-io=8' '--enable-storeio=ufs,aufs,diskd,rock' '--enable-removal-policies=lru,heap' '--enable-delay-pools' '--enable-cache-digests' '--enable-icap-client' '--enable-follow-x-forwarded-for' '--enable-auth-basic=DB,fake,getpwnam,LDAP,NCSA,NIS,PAM,POP3,RADIUS,SASL,SMB' '--enable-auth-digest=file,LDAP' '--enable-auth-negotiate=kerberos,wrapper' '--enable-auth-ntlm=fake,smb_lm' '--enable-external-acl-helpers=file_userip,kerberos_ldap_group,LDAP_group,session,SQL_session,time_quota,unix_group,wbinfo_group' '--enable-url-rewrite-helpers=fake' '--enable-eui' '--enable-esi' '--enable-icmp' '--enable-zph-qos' '--enable-ecap' '--disable-translation' '--with-swapdir=/var/spool/squid' '--with-logdir=/var/log/squid' '--with-pidfile=/var/run/squid.pid' '--with-filedescriptors=65536' '--with-large-files' '--with-default-user=proxy' '--with-openssl' '--enable-ssl' '--enable-ssl-crtd' '--enable-build-info=Ubuntu linux' '--enable-linux-netfilter' 'build_alias=x86_64-linux-gnu' 'CFLAGS=-g -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall' 'LDFLAGS=-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' 'CPPFLAGS=-D_FORTIFY_SOURCE=2' 'CXXFLAGS=-g -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security'

Определяю местонахождение конфигурационного файла:

[email protected]:~$ sudo updatedb

[email protected]:~$ sudo locate squid.conf

/etc/squid/squid.conf

/usr/share/doc/squid-common/squid.conf.documented.gz

/var/lib/dpkg/info/squid.conffiles

Делаю резервную копию дефолтного конфигурационного файла:

[email protected]:~$ sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.backup

Очищаю содержимое конфигурационного файла squid.conf, т. к. в нем будет содержаться только то, что необходимо мне в рамках данной заметки:

[email protected]:~$ sudo bash -c "cat > /etc/squid/squid.conf"

Теперь создаю сертификат текущего сервера с которым будет работать SQUID:

[email protected]:~$ sudo mkdir /etc/squid/ssl

[email protected]:~$ cd /etc/squid/ssl/

[email protected]:/etc/squid/ssl$ sudo openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -keyout squidca.pem -out squidca.pem

Common Name (e.g. server FQDN or YOUR name) []:<указываем IP&FQDN имя текущего сервера который смотрит в локальную сеть, в моем случае это 10.90.90.1>

Ограничиваем доступ к полученному приватному ключу squidca.pem:

[email protected]:/etc/squid/ssl$ sudo chmod 400 squidca.pem
[email protected]:/etc/squid/ssl$ cd ~/

А теперь собственно и конфигурационный файл squid.conf:

На заметку: описание директив для данной версии SQUID можно найти здесь: http://www.squid-cache.org/Versions/v3/3.5/cfgman/

[email protected]:~$ sudo nano /etc/squid/squid.conf

######################################

# Обслуживаемые прокси-сервером сети #

######################################

acl localnet src 10.90.90.0/24 # RFC1918 possible internal network

#################################################

# Правила какие порты разрешены прокси-сервером #

#################################################

# Порт 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

visible_hostname srv-host.polygon.local

# ниже две директивы для подробного логирования

strip_query_terms off

log_mime_hdrs on

################################################################

# Пути к файлам запрещающих, разрешающих определенные действия #

################################################################

# Листинг IP-адресов компьютеров которые игнорируются SQUID запреты

acl SuperIP src "/etc/squid/SuperIP.txt"
# Разрешенный список сайтов

acl WhiteList dstdomain "/etc/squid/WhiteList.txt"

# Запрещенный список сайтов

acl BlackList dstdomain "/etc/squid/BlackList.txt"

#########################

# Параметры DNS записей #

#########################

# Список DNS серверов(IP адреса), которые будут использоваться вместо тех, что определены в /etc/resolv.conf файле

dns_nameservers 10.90.90.1

#########################################

# Правила ограничений доступа клиентов #

#########################################
# Запретить доступ к портам, отсутствующим в списке выше

http_access deny !Safe_ports

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

http_access deny CONNECT !SSL_ports

# Разрешить только локальное управление кэшем

http_access allow localhost manager

http_access deny manager

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

http_access allow localhost

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

http_access allow SuperIP

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

http_access deny BlackList
# Правила разрешающего доступ в интернет из локальной сети указанной в localnet

http_access allow localnet

# Блокирует все, что не было разрешено выше

http_access deny all

################################################

# Правила подключений клиентов к прокси-серверу#

################################################

# Подключения через прозрачный порт

http_port 10.90.90.1:3128 intercept options=NO_SSLv3:NO_SSLv2

# Подключение через указания прокси-сервера на строне клиента

http_port 10.90.90.1:3130 options=NO_SSLv3:NO_SSLv2

# Подключение по HTTPS через прозрачный порт с параметрами подставки сертификата

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

# Принимаем сертификаты, даже если они не прошли проверку.

always_direct allow all

sslproxy_cert_error allow all

sslproxy_flags DONT_VERIFY_PEER
# Укажем список запрещенный сайтов (в файле домены вида .domain.com) и правила блокировки их

acl blocked ssl::server_name "/etc/squid/BlackList.txt"

# Устанавливаем защищенное соединение и считываем заголовок HTTP

acl step1 at_step SslBump1

ssl_bump peek step1

# Закрываем соединение, если клиент заходит на ресурс указанные в blocked

ssl_bump terminate blocked

ssl_bump splice all

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

#########################################

# Дополнительные параметры конфигурации #

#########################################

# Путь для дискового кеширования

cache_dir aufs /var/spool/squid 20000 49 256

# Путь сохранения дампов аварийного завершения

coredump_dir /var/spool/squid

# Время жизни объектов для протоколов 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

maximum_object_size 61440 KB

minimum_object_size 3 KB

cache_swap_low 90

cache_swap_high 95

# Максимальный размер объекта, сохраняемого в оперативной памяти

maximum_object_size_in_memory 512 KB

memory_replacement_policy lru

logfile_rotate 4

По окончании не забываем сохранить внесенные изменения в конфигурационный файл squid.conf.

Создаю необходимые текстовые файлы предопределенные в конфигурационном файле squid.conf:

[email protected]:~$ sudo touch /etc/squid/SuperIP.txt

[email protected]:~$ sudo touch /etc/squid/WhiteList.txt

[email protected]:~$ sudo nano /etc/squid/BlackList.txt

.fishki.net

.yaplaka.com

.odnoklassniki.ru

games.mail.ru

hh.ru

superjob.ru

Теперь нужно проверить конфигурационный файл squid.conf на корректность: (в выводе не должно быть ни какого упоминания об ERROR)

[email protected]:~$ sudo squid -k parse

Наполняю файл запрещающих сайтов не относящихся к работе:

[email protected]:~$ sudo bash -c "echo .yandex.ru > /etc/squid/BlackList.txt"

Теперь запускаю SQUID:

[email protected]:~$ sudo /etc/init.d/squid stop

[email protected]:~$ sudo /etc/init.d/squid start

[email protected]:~$ sudo /etc/init.d/squid status

* squid is running

[email protected]:~$ sudo netstat -tulpn | grep 'squid'

tcp 0 0 192.168.1.174:3128 0.0.0.0:* LISTEN 2108/(squid-1)

tcp 0 0 192.168.1.174:3129 0.0.0.0:* LISTEN 2108/(squid-1)

tcp 0 0 192.168.1.174:3130 0.0.0.0:* LISTEN 2108/(squid-1)

udp 0 0 0.0.0.0:35255 0.0.0.0:* 2108/(squid-1)

udp6 0 0 :::45353 :::* 2108/(squid-1)

[email protected]:~$ sudo tail -f /var/log/squid/cache.log

Теперь осталось дополнить правила в брандмауэре на заворачивание всего трафика из локальной сети на SQUID:

[email protected]:~$ sudo nano /etc/ufw/before.rules

*nat

:POSTROUTING ACCEPT [0:0]

:PREROUTING ACCEPT [0:0]

-A POSTROUTING -s 10.90.90.0/24 -o eth0 -j MASQUERADE

-A PREROUTING -p tcp -m tcp -s 10.90.90.0/24 --dport 443 -j REDIRECT --to-ports 3129

-A PREROUTING -p tcp -m tcp -s 10.90.90.0/24 --dport 80 -j REDIRECT --to-ports 3128

COMMIT

ЛИБО ДАТЬ ДОСТУП ИЗ ВСЕЙ СЕТИ — НО  ЛУЧШЕ ИСПОЛЬЗОВАТЬ РЕДАКТИРОВАНИЕ ФАЙЛА /etc/ufw/before.rules

[email protected]:~$ sudo ufw allow from 10.90.90.0/24 to any port 3128

[email protected]:~$ sudo ufw allow from 10.90.90.0/24 to any port 3129

После перезапускаю ufw:

[email protected]:~$ sudo ufw reload

Шаг №8: Проверяю, как отрабатывает блокировка и собственно сама работа squid с клиентской станции в локальной сети:

, но вот что всплыло, если добавить себя IP адрес в файлы SuperIP.txt то интернет как и нужно работает без ограничений, а если себя туда не добавлять то на всех страницах я получаю отбивку, что доступ запрещен:

Анализ логов сервера привел меня:

[email protected]:~$ sudo tail -f /var/log/squid/access.log

1472897326.734 144614 10.90.90.26 TAG_NONE/200 0 CONNECT 217.69.133.148:443 - HIER_NONE/- -

1472897326.734 144539 10.90.90.26 TCP_TUNNEL/200 11013 CONNECT top-fwz1.mail.ru:443 - ORIGINAL_DST/217.69.133.148 -

1472897340.692 5001 10.90.90.26 TCP_DENIED/200 0 CONNECT 5.255.255.5:443 - HIER_NONE/- -

1472897348.502 0 10.90.90.26 TCP_DENIED/200 0 CONNECT 5.255.255.5:443 - HIER_NONE/- -

1472897348.513 0 10.90.90.26 TCP_DENIED/200 0 CONNECT 5.255.255.5:443 - HIER_NONE/- -

1472897348.525 1 10.90.90.26 TAG_NONE/403 3768 GET https://yandex.ru/ - HIER_NONE/- text/html

1472897348.534 0 10.90.90.26 TCP_DENIED/200 0 CONNECT 5.255.255.5:443 - HIER_NONE/- -

1472897348.553 0 10.90.90.26 TAG_NONE/403 3768 GET http://srv-host.polygon.local:0/squid-internal-static/icons/SN.png - HIER_NONE/- text/html

1472897357.933 59 10.90.90.26 TCP_DENIED/403 4383 GET http://yahoo.com/ - HIER_NONE/- text/html

1472897358.036 2 10.90.90.26 TCP_DENIED/403 4428 GET http://srv-host.polygon.local:0/squid-internal-static/icons/SN.png - HIER_NONE/- text/html

^C[email protected]:~$ sudo tail -f /var/log/squid/cache.log

2016/09/03 13:07:49 kid1| ERROR: No forward-proxy ports configured.

2016/09/03 13:07:57 kid1| ERROR: No forward-proxy ports configured.
У меня просто в squid.conf Не правильно была указана сеть для которой работает squid:

acl localnet src 10.90.90.0/24 # RFC1918 possible internal network

[email protected]:~$ sudo service squid restart

[email protected]:~$ sudo service squid status

* squid is running

Вот теперь с клиентской станции все прекрасно открывается, за исключением домена Yandex, если же попробовать перейти на https://yandex.ru в ответ получится отбивка от squid:

Отлично, работает как и планировалось.

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

10.90.90.1:3130

а на сервере squid поправить правила:

[email protected]:~$ sudo nano /etc/ufw/before.rules

# другие правила не трогает, оставляем как есть.

#-A PREROUTING -p tcp -m tcp -s 10.90.90.0/24 --dport 443 -j REDIRECT --to-ports 3129

-A PREROUTING -p tcp -m tcp -s 10.90.90.0/24 --dport 443 -j REDIRECT --to-ports 3130
-A PREROUTING -p tcp -m tcp -s 10.90.90.0/24 --dport 80 -j REDIRECT --to-ports 3130

Либо так, но лучше будет как сделано выше.

[email protected]:~$ sudo ufw allow from 10.90.90.0/24 to any port 3130 proto tcp

[email protected]:~$ sudo ufw reload

Затем на избранных компьютерах прописать:

Пуск — Панель управления — Свойства обозревателя — вкладка «Подключение» — «Настройка сети» —

отметить галочкой: Использовать прокси-сервер для локальных подключений.

Адрес: 10.90.90.1 Порт:3130

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

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

либо Sarg

либо Free-sa

Если также как и я используете Sarg, то вот так выглядит сформированная статистика:

И не забываем настроить планировщик создания отчетов:

[email protected]:~$ sudo crontab -e

00 07-22 * * * root sarg-reports today

00 23 * * * root sarg-reports daily

59 23 * * 0 root sarg-reports weekly

59 23 1 * * root sarg-reports monthly

Вот теперь уже все. На этом я прощаюсь и до новых встреч на моем блоге. C уважением, автор блога — ekzorchik.

 

Ubuntu 16.04 прозрачный Squid HTTPS

Ubuntu 16.04 прозрачный Squid HTTPS

Решил посмотреть на работу прозрачного Squid transparent.
В версиях выше 3 указывают intercept
Много натыкался на сложности в настройках именно в режиме HTTPS
Как оказалось не зря.
Так сложилось что при установке через apt мы получаем Squid без поддержки SSl
Приступим

Есть два пути решения.

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

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

https://launchpad.net/~notartom/+archive/ubuntu/squid-ssl


sudo add-apt-repository ppa:notartom/squid-ssl
sudo apt-get update

sudo apt-get install squid squid-langpack

2) Без подмены сертификатов
Вот здесь уже сложнее. Необходимо пересобирать пакет Squid.

Чтобы постоянно не вводить sudo переходим в root


sudo -s

Разблокируем ветки где указан src


nano /etc/apt/sources.list

Должно выйти так

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


apt-get update 
apt-get dist-upgrade -y
apt-get install openssl
apt-get install devscripts build-essential
apt-get install dpkg-dev libssl-dev

Создадим папку где будет производится сборка


mkdir makes
cd makes

Качаем зависимости (для выполнения этой операции был поставлен dpkg-dev)


apt-get build-dep squid3

Качаем исходник


apt-get source squid3

В случае ошибки доступа apt “Невозможно сбросить права для скачивания” меняем права и повторяем


chmod 777 squid3_3.5.12-1ubuntu7.2.dsc
apt-get source squid3

В моем случае это был файл squid3_3.5.12-1ubuntu7.2.dsc может быть и squid3_3.5.12-1ubuntu7.3.dsc и другие разновидности

Если этого не сделать или будут ошибки, то не появится папка debian

Переходим в полученную папку


cd squid3-3.5.12

Добавляем поддержку ssl
Редактируем файл правил


nano debian/rules

Добавляем строчки


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

Должно выйти

ВАЖНО: чтобы все параметры заканчивались \ , а именно дописать после proxy

Собираем DEB пакеты ( Процесс долгий )


dpkg-buildpackage -d

Возможные ошибки:


configure: error: library 'crypto' is required for OpenSSL

Необходимо установить libssl-dev и перезапустить процесс сборки


apt-get install libssl-dev
rm config.log
dpkg-buildpackage -d

Идем на папку выше и там должны быть получившиеся пакеты


ls -1

squid3-3.5.12
squid3_3.5.12-1ubuntu7.2_all.deb
squid3_3.5.12-1ubuntu7.2_amd64.build
squid3_3.5.12-1ubuntu7.2_amd64.changes
squid3_3.5.12-1ubuntu7.2.debian.tar.xz
squid3_3.5.12-1ubuntu7.2.dsc
squid3_3.5.12.orig.tar.gz
squid_3.5.12-1ubuntu7.2_amd64.deb
squid-cgi_3.5.12-1ubuntu7.2_amd64.deb
squidclient_3.5.12-1ubuntu7.2_amd64.deb
squid-common_3.5.12-1ubuntu7.2_all.deb
squid-dbg_3.5.12-1ubuntu7.2_amd64.deb
squid-purge_3.5.12-1ubuntu7.2_amd64.deb

Ставим


dpkg -i *.deb

Правим зависимости и переставляем (На этом моменте он подтянул apache для каких то своих целей)


apt-get install -f
dpkg -i *.deb

Если все успешно то смотрим версию squid и что у нас вышло


squid -v

(код в строку. Отформатировал для наглядности)


Squid Cache: Version 3.5.12
Service Name: squid
Ubuntu linux
configure options:  '--build=x86_64-linux-gnu'
'--prefix=/usr'
'--includedir=${prefix}/include'
'--mandir=${prefix}/share/man'
'--infodir=${prefix}/share/info'
'--sysconfdir=/etc'
'--localstatedir=/var'
'--libexecdir=${prefix}/lib/squid3'
'--srcdir=.'
'--disable-maintainer-mode'
'--disable-dependency-tracking'
'--disable-silent-rules'
'BUILDCXXFLAGS=-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now'
'--datadir=/usr/share/squid'
'--sysconfdir=/etc/squid'
'--libexecdir=/usr/lib/squid'
'--mandir=/usr/share/man'
'--enable-inline'
'--disable-arch-native'
'--enable-async-io=8'
'--enable-storeio=ufs,aufs,diskd,rock'
'--enable-removal-policies=lru,heap'
'--enable-delay-pools'
'--enable-cache-digests'
'--enable-icap-client'
'--enable-follow-x-forwarded-for'
'--enable-auth-basic=DB,fake,getpwnam,LDAP,NCSA,NIS,PAM,POP3,RADIUS,SASL,SMB'
'--enable-auth-digest=file,LDAP'
'--enable-auth-negotiate=kerberos,wrapper'
'--enable-auth-ntlm=fake,smb_lm'
'--enable-external-acl-helpers=file_userip,kerberos_ldap_group,LDAP_group,session,SQL_session,unix_group,wbinfo_group'
'--enable-url-rewrite-helpers=fake'
'--enable-eui'
'--enable-esi'
'--enable-icmp'
'--enable-zph-qos'
'--enable-ecap'
'--disable-translation'
'--with-swapdir=/var/spool/squid'
'--with-logdir=/var/log/squid'
'--with-pidfile=/var/run/squid.pid'
'--with-filedescriptors=65536'
'--with-large-files'
'--with-default-user=proxy'
'--enable-ssl'
'--enable-ssl-crtd'
'--with-openssl'
'--enable-build-info=Ubuntu linux'
'--enable-linux-netfilter'
'build_alias=x86_64-linux-gnu'
'CFLAGS=-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wall'
'LDFLAGS=-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now'
'CPPFLAGS=-Wdate-time -D_FORTIFY_SOURCE=2'
'CXXFLAGS=-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security'

Конфигурация без блокировок и прочего. Именно посмотреть работу прозрачного режима. Обычная базовая с добавлением SSL

Переходим в папку squid и генерируем сертификат


cd /etc/squid/
openssl req -new -newkey rsa:1024 -days 365 -nodes -x509 -keyout squidCA.pem -out squidCA.pem

Упростим конфигурацию


cp squid.conf squid.conf.bak
cat squid.conf.bak | grep -v "^#" | grep -v "^$" > squid.conf

Добавим сеть src 192.168.20.0/24
Добавим порты под HTTP 3128 и HTTPS 3129
Добавим генерацию сертификатов sslcrtd_program


nano 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 local src 192.168.20.0/24

acl CONNECT method CONNECT

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
http_access allow local
http_access deny all

http_port 192.168.20.1:3128 intercept
https_port 192.168.20.1:3129 intercept ssl-bump cert=/etc/squid/squidCA.pem

ssl_bump peek all
ssl_bump splice all

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

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

Для режима варианта с подменой сертификата следующие строчки писать не надо


ssl_bump peek all
ssl_bump splice all
sslcrtd_program /usr/lib/squid/ssl_crtd -s /var/lib/ssl_db -M 4MB

Применяем конфигурацию


squid -k parse
squid -k reconfigure

Для работы необходимо настроить iptables


nano tables

#!/bin/bash
#==========================================================
# Настройка IPTABLES
#==========================================================

#==========================================================
# Сетевый интерфейсы
#==========================================================
LAN="enp0s8"
WAN="enp0s17"
LO="lo"

#==========================================================
# Локальная сеть
#==========================================================
LAN_RANGE=192.168.20.0/255.255.255.0

#==========================================================
# Путь к таблицам
#==========================================================
IPTABLES="/sbin/iptables"

#==========================================================
# Список портов
#==========================================================
SSH="22"
DNS="53"
SQUIDH="3128"
SQUIDS="3129"
HTTP="80"
HTTPS="443"

# Сбрасываем все правила
#=========================================================================================
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -X
$IPTABLES -t nat -X
$IPTABLES -t mangle -X

# Базовая расстановка правил
#==========================================================
$IPTABLES --policy INPUT   ACCEPT       #DROP
$IPTABLES --policy OUTPUT  ACCEPT       #DROP
$IPTABLES --policy FORWARD DROP         #ACCEPT

# Включаем форвардинг ip в ядре.
#=========================================================================================
/bin/echo 1 > /proc/sys/net/ipv4/ip_forward

# Включаем маскарадинг для маскарад для отработки NAT
#=========================================================================================
$IPTABLES -t nat -A POSTROUTING -o $WAN -j MASQUERADE

# Разрешаем пакеты по уже установленным соединениям
#=========================================================================================
$IPTABLES -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Разрешаем доступ к SSH и DNS серверу если INPUT DROP (Не пригодилось)
#=========================================================================================
#$IPTABLES -A INPUT --protocol tcp -i $LAN --dport $SSH -j ACCEPT
#$IPTABLES -A INPUT --protocol tcp -i $LAN --dport $DNS -j ACCEPT
#$IPTABLES -A INPUT --protocol udp -i $LAN --dport $DNS -j ACCEPT

# Разрешаем доступ к HTTP и HTTPS серверу если INPUT DROP (Не пригодилось)
#=========================================================================================
#$IPTABLES -A INPUT --protocol tcp -i $LAN --dport $HTTP -j ACCEPT
#$IPTABLES -A INPUT --protocol tcp -i $LAN --dport $SQUID -j ACCEPT

# Заворачиваем SQUID
#=========================================================================================
iptables -t nat -A PREROUTING -i $LAN -p tcp --dport $HTTP  -j REDIRECT --to-port $SQUIDH
iptables -t nat -A PREROUTING -i $LAN -p tcp --dport $HTTPS -j REDIRECT --to-port $SQUIDS

# Смотрим что мы натворили
#=========================================================================================
$IPTABLES -L -n -t nat -v

Если в качестве шлюза используется маршрутизатор, то на нем перенаправляем порты 80 и 443 на сервер где стоит SQUID на порты 3128 и 3129 соответственно
В таком случае правила “Заворачиваем SQUID” для iptables ненужны.

Применим


chmod +x tables
./tables

Так как под рукой не было DNS сервера то поставил dnsmasq. Порт в iptables 53
Ставил только DNS. DHCP не настраивал поэтому только указываем интерфейс dnsmasq


sudo apt-get install dnsmasq dnsmasq-utils
nano /etc/dnsmasq.conf

interface=enp0s8

Блокировка сайтов HTTPS в отличии от непрозрачного squid осуществляется через директивы ssl_bump
http://wiki.squid-cache.org/Features/SslBump
http://www.squid-cache.org/Doc/config/ssl_bump/

PS:
ВНИМАТЕЛЬНО читаем комментарии
С момента написания статьи прошло много времени. Многое спрошено, добавлено, рассмотрено в обсуждении

Facebook

Twitter

Мой мир

Вконтакте

Одноклассники

Перехват и просмотр HTTPS трафика на прокси-сервере Squid 4.9

Рассмотрим как реализовать перехват пользовательских HTTPS-запросов в сеть интернет для дальнейшего анализа и учета их. Все ниже описанные действия производятся на Debian 9 Stretch с установленным прокси-сервером Squid 4.9.

 

Для работы с HTTPS трафиком необходимо, чтобы Squid был собран с следующими параметрами:

—enable-ssl-crtd —with-openssl

ПОДСКАЗКА. Как собрать из исходников Squid 4.9 с необходимыми параметрами, можно посмотреть из этой статьи.

 

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

 

Выполним генерацию CA сертификата и назначим права доступа для него, выполним команды:

cd /usr/local/etc/squid/ssl

openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -keyout squidca.pem -out squidca.pem

 

chown proxy:proxy squidca.pem

chmod 640 squidca.pem

 

Конвертируем сертификат в формат для импорта на пользовательские системы:

openssl x509 -outform der -in squidca.pem -out squidca.crt

ПОДСКАЗКА. Как скачать сертификат из Linux системы в Windows, можно посмотреть из этой статье.

Полученный сертификат необходимо установить в «Доверенные корневые сертификаты» на все пользовательские компьютеры, которые будут работать через прокси-сервер Squid. В доменной среде это проще всего сделать при помощи GPO (Group Policy objects).

 

Далее необходимо инициализировать каталог для хранения кэша имитированных сертификатов и указать разрешения на этот каталог для прокси-сервера Squid, выполним команды:

/usr/lib/squid/security_file_certgen -c -s /var/lib/ssl_db -M 4MB

 

chown proxy:proxy -R /var/lib/ssl_db

 

В файле конфигурации (/etc/squid/squid.conf) указываем следующие параметры:

http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/ssl/squidca.pem

 

acl step1 at_step SslBump1

 

ssl_bump peek step1

ssl_bump bump all

 

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

 

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

acl nosslintercept ssl::server_name «/etc/squid/sites_nossl.txt»

 

acl step1 at_step SslBump1

 

ssl_bump peek step1

ssl_bump splice nosslintercept

ssl_bump bump all

ПОЯСНЕНИЕ. Указываем ACL (nosslintercept) с указанием списка сайтов исключений (прим. /etc/squid/sites_nossl.txt) и затем в обработке ssl_bump ничего не делаем с указанными в списке сайтами, а запросы к всем остальными сайтам мы перехватываем.

 

Перезапускаем Squid и проверяем работу:

/etc/init.d/squid restart

 

На скриншоте выше видим что запрос к сайту https://yandex.ru был успешно перехвачен прокси-сервером, о чем свидетельствует имитированный сертификат и в лог-файле /var/log/access.log будут фиксироваться все действия на данном сайте.

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

 

ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОБЛАГОДАРИ АВТОРА

 

Настроить Squid в качестве прозрачного прокси HTTP и HTTPS

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

.

Уведомление

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

Интернет -> etho
IP интерфейса: — 192.168.2.39/24 Шлюз: — 192.168.2.1

LAN -> eth2
IP интерфейса: — 192.168.231.126 / 24 Шлюз: — 0.0.0.0

Если у вас единый интерфейс, не беспокойтесь. вы можете создать виртуальный интерфейс, который действует либо через LAN, либо за Интернет. У этого процесса есть еще несколько шагов, поэтому я решил разделить его на 4 основных раздела, чтобы облегчить понимание.

Итак, давайте подробно рассмотрим каждый раздел.

1) Для анализа https-трафика необходимы следующие пакеты.

yum установить openssl openssl-devel
 

2) Загрузите и установите последнюю версию Squid

Место загрузки: — http: // www.squid-cache.org/Versions/

–squid запускается как пользователь squid, следующие параметры обязательны.

./configure --with-openssl --enable-ssl-crtd --with-default-user = squid
сделать
сделать установку
 

3) Инициализировать каталог squid ssl_db

/ usr / локальный / squid / libexec / ssl_crtd -c -s / var / lib / ssl_db
chown -R squid.squid / var / lib / ssl_db
 

Динамически генерируемые сертификаты ssl хранятся в каталоге / var / lib / ssl_db

4) Прокомментируйте или добавьте следующие дополнительные поля в squid.conf файл.

http_port 3130
http_port 3128 перехват
https_port 3129 перехватить ssl-bump generate-host-Certific = on dynamic_cert_mem_cache_size = 4MB

cert = / usr / local / squid / ssl_cert / myca.pem key = / usr / local / squid / ssl_cert / myca.pem

ssl_bump server-first all

sslcrtd_program / usr / local / squid / libexec / ssl_crtd -s / var / lib / ssl_db -M 4 МБ
sslcrtd_children 8 запуск = 1 простоя = 1

каталог_коредумпа / usr / локальный / сквид / вар / кеш / сквид
 

5) создать папку сертификата и сгенерировать ключи

mkdir / usr / местный / сквид / ssl_cert
chown -R кальмар.кальмар / usr / местные / кальмар / ssl_cert
cd / usr / local / squid / ssl_cert
 

6) выполнить новый запрос сертификата

openssl req -new -newkey rsa: 1024 -days 1365 -nodes -x509 -keyout myca.pem -out myca.pem

пример: -
Название страны (двухбуквенный код) [XX]: lk
Название штата или провинции (полное название) []: western
Название населенного пункта (например, город) [Город по умолчанию]: colombo
Название организации (например, компания) [Default Company Ltd]: it
Название организационной единицы (например, раздел) []: itdept
Общее имя (например, ваше имя или имя хоста вашего сервера) []: squidserver.местный
Адрес электронной почты []: [email protected]
 

7) Создать сертификат для веб-браузеров. позже этот файл der (myca.der) необходимо добавить в браузер, чтобы избежать ошибки SSL.

openssl x509 -в myca.pem -outform DER -out myca.der
 

1) установить привязку

yum install bind

2) Настроить DNS

vim /etc/ named.conf

#### —————- ##### acl mynet { 192.168.0.0 / 16; 127.0.0.1; }; параметры { слушай {mynet; }; порт прослушивания 53 {127.0.0.1; }; порт 53 для прослушивания v6 {:: 1; }; каталог «/ var / named»; дамп-файл «/var/ named/data/cache_dump.db»; файл статистики «/var/ named/data/ named_stats.txt»; memstatistics-файл «/var/ named/data/ named_mem_stats.txt»; разрешить запрос {mynet; localhost; }; рекурсия да; только вперед; экспедиторы { 192.168.2.1; 8.8.8.8; }; dnssec-enable да; dnssec-validation да; dnssec-lookaside auto; / * Путь к ключу ISC DLV * / bindkeys-файл «/etc/ named.iscdlv.key»; каталог управляемых ключей «/ var / named / dynamic»; pid-файл «/run/ named/ named.pid»; файл ключа сеанса «/run/ named/session.key»; }; Ведение журнала { channel default_debug { файл «data / named.пробег»; выраженность динамическая; }; }; зона «.» В { подсказка типа; файл «named.ca»; }; включить «/etc/ named.rfc1912.zones»; включить «/etc/ named.root.key»; зона «squidserver.local» IN { тип мастер; файл «/var/ named/squidserver.local/db.home»; allow-query { mynet; }; };

1

2

3

4

5

6

7

8

9

10

11

12

13

140002

14

18

19

20

21

22

23

24

25

26

27

28

29

30

000

000 34

35

36

37

38

39

40

41

42

43

44

45

46

49

00030002 47

00030002 47

0003

51

52

53

54

55

56

57

#### —————- #####

acl mynet {

192.168.0.0 / 16;

127.0.0.1;

};

опции {

прослушивание {mynet; };

порт прослушивания 53 {127.0.0.1; };

прослушивание порта v6 53 {:: 1; };

каталог «/ var / named»;

файл-дамп «/var/ named/data/cache_dump.db»;

файл статистики «/var/ named/data/ named_stats.txt»;

файл-статистики-памяти «/ var / named / data / named_mem_stats.txt «;

allow-query {mynet; localhost;};

рекурсия да;

только пересылка;

пересылки {

192.168.2.1; 8.8.8.8;

};

dns -enable yes;

dnssec-validation yes;

dnssec-lookaside auto;

/ * Путь к ключу ISC DLV * /

файл-привязки ключей «/ etc / named.iscdlv.key «;

каталог-управляемых ключей» / var / named / dynamic «;

pid-file» /run/ named/ named.pid «;

session-keyfile» / run / named / session.key «;

};

logging {

channel default_debug {

file» data / named.run «;

динамический уровень серьезности;

};

};

зона «.» IN {

type hint;

file «named.ca «;

};

include» /etc/ named.rfc1912.zones «;

include» /etc/ named.root.key «;

зона» squidserver.local «IN {

Мастер типа

;

файл «/var/ named/squidserver.local/db.home»;

allow-query {

mynet;

};

};

#### —————- #####

#### —————- #####

3) Настроить зону для squidserver.местный

mkdir /var/ named/squidserver.local
коснитесь /var/ named/squidserver.local/db.home
chown -R named. named /var/ named/squidserver.local/db.home
 

4) Добавьте следующую строку в /var/ named/squidserver.local/db.home

$ ORIGIN squidserver.local.
86400 долларов США
@ IN SOA proxy.squidserver.local. proxy.squidserver.local. (
2014032801; Серийный
28800; Обновить
7200; Повторить
604800; Срок действия
86400; TTL отрицательного кэша
)
@ IN NS прокси.squidserver.local.
прокси IN A 192.168.231.126
 

5) Старт с именем

сервис под названием start

будьте осторожны с интерфейсом и IP-адресом. Измените эти значения в соответствии с вашими требованиями. Вы можете узнать об iptables отсюда, если вы новичок.

1) Перенаправить трафик HTTP и HTTPS на squid

iptables -t nat -A PREROUTING -i eth2 -p tcp -m tcp –dport 80 -j REDIRECT –to-ports 3128
iptables -t nat -A PREROUTING -i eth2 -p tcp -m tcp –dport 443 -j REDIRECT –в порты 3129

2) Включите порт 53 UDP и TCP, порт 80,443,3128,3129 TCP из входящего порта LAN.

пример: — Добавлено в правило 5, его можно изменить в соответствии с существующим правилом iptable
iptables -I INPUT 5 -p udp -m udp –dport 53 -j ACCEPT

iptables -I INPUT 5 -p tcp –dport 53 -m state –state NEW, ESTABLISHED -j ACCEPT
iptables -I INPUT 5 -p tcp –dport 80 -j ACCEPT
iptables -I INPUT 5 — p tcp –dport 443 -j ACCEPT
iptables -I INPUT 5 -p tcp –dport 3128 -m state –state NEW, ESTABLISHED -j ACCEPT
iptables -I INPUT 5 -p tcp –dport 3129 -m state –State НОВОЕ, УСТАНОВЛЕННОЕ -j ПРИНЯТЬ

3) Так что же будет с другим трафиком типа ftp, vpn.Давайте пропустим этот трафик.

Предположим, что squid не обрабатывает эти запросы. Принять соединение изнутри (eth2) и перенаправить их в (eth0) internet
iptables -I FORWARD 1 -o eth0 -i eth2 -s 192.168.231.0/24 -m conntrack –ctstate NEW -j ACCEPT

Мы принимаем к пересылке все уже установленные соединения.
iptables -I FORWARD 2 -m conntrack –ctstate ESTABLISHED, RELATED -j ACCEPT

Маскарадинг (замена IP-адреса локального источника на общедоступный)
iptables -A POSTROUTING -t nat -j MASQUERADE

4) включить пересылку пакетов для IPv4

отредактируйте / etc / sysctl.conf и добавьте следующее:
net.ipv4.ip_forward = 1

1) Настройте клиентский шлюз по умолчанию и DNS как 192.168.231.126 (IP-адрес LAN)

2) Загрузите myca.der в веб-браузер, чтобы избежать ошибки SSL.

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

Связанные

.

Использование Squid для прокси-сайтов SSL

Кальмар

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

Установка Squid на CentOS

Просматривая разные версии, похоже, что в 3.5 появилась улучшенная поддержка SSL-Bumping, который теперь называется Peek and Slice. Это позволяет Squid проверять рукопожатие TLS и генерировать динамические сертификаты на лету, поэтому браузер не выдает никаких предупреждений (пока браузер доверяет сертификату CA).Эта версия доступна на CentOS 7.4:

  <> sudo yum info squid
Загруженные плагины: fastestmirror, remove-with-leaves
Скорость загрузки зеркала из кэшированного хост-файла
 * атомный: www7.atomicorp.com
 * база: centos.expedientevirtual.com
 * epel: mirrors.develooper.com
 * Дополнительно: mirror.genesisadaptive.com
 * обновления: pubmirrors.dal.corespace.com
Установленные пакеты
Имя: кальмар
Арка: x86_64
Эпоха: 7
Версия: 3.5.20
Релиз: 10.el7
Площадь: 10 м
Репо: установлено
Из репо: база
Описание: кэширующий прокси-сервер Squid
URL: http: // www.squid-cache.org
  

Установить довольно просто:

  <> sudo yum install squid
  

Затем откройте свой брандмауэр:

  <> sudo iptables -L -n -v | grep 3128
    0 0 ПРИНЯТЬ tcp - * * 192.168.1.0/24 0.0.0.0/0 состояние NEW tcp dpt: 3128
  

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

Этот процесс подробно описан в разделе «Создание динамического сертификата SSL», а хороший пример конфигурации доступен на SSL-Bump с использованием промежуточного центра сертификации.Итак, сначала давайте сгенерируем файлы сертификатов:

  <> openssl req -new -newkey rsa: 2048 -sha256 -days 365 -nodes -x509 -extensions v3_ca -keyout squid-ca-key.pem -out squid-ca-cert.pem
  

Затем объедините файлы:

  <> кот кальмар-ca-cert.pem squid-ca-key.pem >> squid-ca-cert-key.pem
  

Затем переместите файл в место squid может прочитать:

  <> sudo mkdir / etc / squid / certs
<> sudo mv squid-ca-cert-key.# '/etc/squid/squid.conf
acl localnet src 10.0.0.0/8 # RFC1918 возможная внутренняя сеть
acl localnet src 172.16.0.0/12 # RFC1918 возможная внутренняя сеть
acl localnet src 192.168.0.0/16 # RFC1918 возможная внутренняя сеть
acl localnet src fc00 :: / 7 # RFC 4193 диапазон локальной частной сети
acl localnet src fe80 :: / 10 # RFC 4291 локальные (напрямую подключенные) машины
acl SSL_ports порт 443
acl Safe_ports порт 80 # http
acl Safe_ports порт 21 # ftp
acl Safe_ports порт 443 # https
acl Safe_ports порт 70 # gopher
acl Safe_ports порт 210 # wais
acl Safe_ports port 1025-65535 # незарегистрированные порты
acl Safe_ports порт 280 # http-mgmt
acl Safe_ports порт 488 # gss-http
acl Safe_ports порт 591 # файловый менеджер
acl Safe_ports порт 777 # многоязычный http
acl CONNECT метод CONNECT
http_access deny! Safe_ports
http_access deny CONNECT! SSL_ports
http_access разрешить диспетчер локального хоста
http_access deny manager
http_access разрешить локальную сеть
http_access разрешить localhost
http_access запретить все
http_port 3128 ssl-bump \
  сертификат = / etc / squid / certs / squid-ca-cert-key.суслик: 1440 0% 1440
шаблон_обновления -i (/ cgi-bin / | \?) 0 0% 0
refresh_pattern. 0 20% 4320
  

Подтвердите, что конфигурация в порядке:

  <> sudo squid -k parse
2018/04/07 15: 13: 06 | Запуск: инициализация схем аутентификации ...
2018/04/07 15: 13: 06 | Запуск: инициализированная схема аутентификации 'базовая'
2018/04/07 15: 13: 06 | Запуск: инициализированная схема аутентификации 'дайджест'
2018/04/07 15: 13: 06 | Запуск: инициализированная схема аутентификации 'согласовать'
2018/04/07 15: 13: 06 | Запуск: инициализированная схема аутентификации 'ntlm'
2018/04/07 15: 13: 06 | Запуск: Инициализированная аутентификация.2018/04/07 15: 13: 06 | Файл конфигурации обработки: /etc/squid/squid.conf (глубина 0)
2018/04/07 15: 13: 06 | Обработка: acl localnet src 10.0.0.0/8 # RFC1918 возможная внутренняя сеть
2018/04/07 15: 13: 06 | Обработка: acl localnet src 172.16.0.0/12 # RFC1918 возможная внутренняя сеть
2018/04/07 15: 13: 06 | Обработка: acl localnet src 192.168.0.0/16 # RFC1918 возможная внутренняя сеть
2018/04/07 15: 13: 06 | Обработка: acl localnet src fc00 :: / 7 # RFC 4193 диапазон локальной частной сети
2018/04/07 15: 13: 06 | Обработка: acl localnet src fe80 :: / 10 # RFC 4291 локальные (напрямую подключенные) машины
2018/04/07 15: 13: 06 | Обработка: acl SSL_ports порт 443
2018/04/07 15: 13: 06 | Обработка: acl Safe_ports порт 80 # http
2018/04/07 15: 13: 06 | Обработка: acl Safe_ports port 21 # ftp
2018/04/07 15: 13: 06 | Обработка: acl Safe_ports порт 443 # https
2018/04/07 15: 13: 06 | Обработка: acl Safe_ports port 70 # gopher
2018/04/07 15: 13: 06 | Обработка: acl Safe_ports port 210 # wais
2018/04/07 15: 13: 06 | Обработка: acl Safe_ports port 1025-65535 # незарегистрированные порты
2018/04/07 15: 13: 06 | Обработка: acl Safe_ports port 280 # http-mgmt
2018/04/07 15: 13: 06 | Обработка: acl Safe_ports порт 488 # gss-http
2018/04/07 15: 13: 06 | Обработка: acl Safe_ports port 591 # filemaker
2018/04/07 15: 13: 06 | Обработка: acl Safe_ports port 777 # многоязычный http
2018/04/07 15: 13: 06 | Обработка: acl CONNECT метод CONNECT
2018/04/07 15: 13: 06 | Обработка: http_access deny! Safe_ports
2018/04/07 15: 13: 06 | Обработка: http_access deny CONNECT! SSL_ports
2018/04/07 15: 13: 06 | Обработка: http_access разрешить localhost manager
2018/04/07 15: 13: 06 | Обработка: http_access deny manager
2018/04/07 15: 13: 06 | Обработка: http_access allow localnet
2018/04/07 15: 13: 06 | Обработка: http_access разрешить localhost
2018/04/07 15: 13: 06 | Обработка: http_access deny all
2018/04/07 15: 13: 06 | Обработка: http_port 3128 ssl-bump cert = / etc / squid / certs / squid-ca-cert-key.pem generate-host-Certificates = on dynamic_cert_mem_cache_size = 16 МБ
2018/04/07 15: 13: 06 | Обработка: https_port 3129 перехватить ssl-bump cert = / etc / squid / certs / squid-ca-cert-key.pem generate-host-Certific = on dynamic_cert_mem_cache_size = 16MB
2018/04/07 15: 13: 06 | Запуск аутентификации на порту [::]: 3129
2018/04/07 15: 13: 06 | Отключение аутентификации на порту [::]: 3129 (перехват включен)
2018/04/07 15: 13: 06 | Обработка: sslcrtd_program / usr / lib64 / squid / ssl_crtd -s / var / lib / ssl_db -M 16MB
2018/04/07 15: 13: 06 | Обработка: acl step1 at_step SslBump1
2018/04/07 15: 13: 06 | Обработка: ssl_bump peek step1
2018/04/07 15: 13: 06 | Обработка: ssl_bump bump all
2018/04/07 15: 13: 06 | Обработка: ssl_bump splice all
2018/04/07 15: 13: 06 | Обработка: coredump_dir / var / spool / squid
2018/04/07 15: 13: 06 | Обработка: refresh_pattern ^ ftp: 1440 20% 10080
2018/04/07 15: 13: 06 | Обработка: refresh_pattern ^ gopher: 1440 0% 1440
2018/04/07 15: 13: 06 | Обработка: шаблон_обновления -i (/ cgi-bin / | \?) 0 0% 0
2018/04/07 15: 13: 06 | Обработка: refresh_pattern.0 20% 4320
2018/04/07 15: 13: 06 | Инициализация контекста прокси https
2018/04/07 15: 13: 06 | Инициализация http_port [::]: 3128 SSL context
2018/04/07 15: 13: 06 | Использование сертификата в /etc/squid/certs/squid-ca-cert-key.pem
2018/04/07 15: 13: 06 | Инициализация https_port [::]: 3129 SSL-контекст
2018/04/07 15: 13: 06 | Использование сертификата в /etc/squid/certs/squid-ca-cert-key.pem
  

Теперь давайте создадим базу данных SSL и убедимся, что пользователь squid может получить к ней доступ:

  <> sudo / usr / lib64 / squid / ssl_crtd -c -s / var / lib / ssl_db
<> sudo chown squid: squid -R / var / lib / ssl_db
  

Затем включите службу, запустите ее и убедитесь, что она работает:

  <> sudo systemctl включить squid
<> sudo systemctl start squid
<> sudo systemctl status squid.служба
● squid.service - прокси для кеширования Squid
   Загружено: загружено (/usr/lib/systemd/system/squid.service; включено; предустановка поставщика:  
.

Настройка прокси-сервера Squid | SSLTrust

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

Во-первых, зачем вам использовать прямой прокси? Раньше было очень популярно завершать все исходящие соединения на прокси-сервере перед их отправкой в ​​Интернет.Это уже не так популярно на предприятии, но иногда вы можете столкнуться с этим. Однако Squid может делать гораздо больше, чем просто перехватывать обмен данными в виде обычного текста — он может расшифровывать SSL / TLS-сообщения на лету, а также в нескольких различных конфигурациях, которые имеют соответствующие последствия для безопасности.

Существует два подтипа прокси-серверов прямого доступа — явный и неявный, и два способа прокси-соединения SSL / TLS — завершающие и не завершающие. Возможна любая из четырех комбинаций, и каждая имеет свой набор требований.Явный v. Неявный просто указывает, должен ли клиент указывать (и, возможно, аутентифицироваться) прокси-сервер на своей стороне. В этой ситуации клиент знает, что это происходит. Он использует сообщения CONNECT для взаимодействия с прокси-сервером и помогает ему согласовывать подключение к месту назначения.

Неявные соединения, с другой стороны, немного сложнее и намного опаснее. В этой конфигурации прокси-сервер выполняет то, что в другом контексте можно было бы рассматривать как атаку типа «злоумышленник в середине».Клиент совершенно не подозревает, что куда-то отправляется их трафик, он выдает себя за пункт назначения, расшифровывает свое сообщение и повторно шифрует его для отправки на реальный целевой сервер. Ответы также собираются на лету и отправляются обратно на исходный сервер. Как мы знаем, SSL / TLS предотвращает атаки «злоумышленник посередине» двояко — за счет использования асимметричной криптографии для защиты связи с помощью закрытого ключа и за счет ведения реестра доверенных открытых ключей. Неявные прокси-серверы прямого доступа обходят обе эти защиты (хотя часто намеренно, а иногда даже безопасно).Вместо того, чтобы явно указывать соединение, клиент просто отправляет свой трафик, как обычно. Где-то в восходящем направлении трафик буквально перенаправляется устройством уровня 3 на прокси-сервер, который затем преобразует трафик в другой интерфейс, чтобы избежать обнаружения на другом конце. Он представляет собой сертификат, действительный для любого домена, который он генерирует, когда запросы попадают в него в режиме реального времени, и, поскольку клиент должен быть настроен на доверие тому же корневому сертификату CA, который использует прокси, разрешит соединение.(Помните, что любой сертификат, которому доверяют как корневой сертификат, может подписывать действительные сертификаты для любых доменов и путей, а не только для своего собственного.)

Однако эта конфигурация невероятно полезна. Поскольку прокси-сервер завершает соединение и повторно согласовывает с пунктом назначения, он может фактически изменить тип шифрования, используемого в полете. Предположим, у вас есть более старое программное обеспечение, использующее Java 6. Вы можете поставить прокси-сервер Squid перед этим сервером, чтобы он мог достичь соответствия PCI, поскольку даже если программное обеспечение может взаимодействовать только через старый простой HTTP или HTTPS с использованием TLS v1 (в настоящее время не -соответствует), прокси повторно зашифрует трафик с помощью TLS 1.2 золотой стандарт.

Как настроить такую ​​конфигурацию? Что ж, это определенно может доставить немало хлопот. Он также отличается для каждой операционной системы, но основные принципы одинаковы. Это не для слабонервных, требуется некоторый опыт компиляции программного обеспечения в Linux.

На момент написания этой статьи лучшей версией для использования является Squid 3.5. Загрузите его с веб-сайта проекта и разархивируйте в каталог. Вам понадобятся gcc, make и, возможно, другие инструменты среды разработки для вашего дистрибутива Linux.В частности, на ubuntu установка build-essential должна вас покрыть. Вам понадобится два сетевых адаптера на этом блоке, чтобы вы могли использовать NAT между ними.

Вам нужно создать пользователя aptly: squid.

  adduser squid  

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

 ./конфигурировать
        --prefix = / usr
        --exec-prefix = / usr
        --includedir = / usr / include
        --datadir = / usr / share
        --libdir = / usr / lib64
        --libexecdir = / usr / lib64 / squid
        --localstatedir = / var
        --sysconfdir = / etc / squid
        --sharedstatedir = / var / lib
        --with-logdir = / var / log / squid
        --with-pidfile = / var / run / squid.пид
        --with-default-user = squid
        --enable-silent-rules
        - включить отслеживание зависимостей
        --with-openssl
        --enable-icmp
        --enable-delay-пулы
        --enable-useragent-log
        --enable-esi
        --enable-follow-x-forwarded-for
        --enable-auth
        --enable-ssl-crtd
        --disable-arch-native
        --with-openssl 

Выполните make, а затем выполните установку.

Вам потребуется создать собственный центр сертификации.

  компакт-диск / и т. Д. / Кальмар
mkdir ssl_cert
chown squid: кальмар ssl_cert
chmod 600 ssl_cert
cd ssl_cert
openssl req -new -newkey rsa: 2048 -sha256 -days 365 -nodes -x509 -keyout myCA.pem -out myCA.pem  

Вы можете решить, что ваш CA должен быть действителен более 1 года.

  openssl x509 -in myCA.pem -outform DER -out myCA.der  

Вам нужно будет установить бит UID в вспомогательном приложении squid «pinger».

  chown root: root / usr / lib64 / squid / pinger  

Ваш squid.conf должен выглядеть примерно так:

 #
# Рекомендуемая минимальная конфигурация:
#

# Пример правила, разрешающего доступ из ваших локальных сетей.# Адаптируйтесь к списку ваших (внутренних) IP-сетей, откуда вы просматриваете
# должно быть разрешено
acl localnet src 10.0.0.0/8 # RFC1918 возможная внутренняя сеть
acl localnet src 172.16.0.0/12 # RFC1918 возможная внутренняя сеть
acl localnet src 192.168.0.0/16 # RFC1918 возможная внутренняя сеть
acl localnet src fc00 :: / 7 # RFC 4193 диапазон локальной частной сети
acl localnet src fe80 :: / 10 # RFC 4291 локальные (напрямую подключенные) машины
acl localnet SRC 127.0.0.1

acl SSL_ports порт 443
acl Safe_ports порт 80 # http
acl Safe_ports порт 21 # ftp
acl Safe_ports порт 443 # https
acl Safe_ports порт 70 # gopher
acl Safe_ports порт 210 # wais
acl Safe_ports port 1025-65535 # незарегистрированные порты
acl Safe_ports порт 280 # http-mgmt
acl Safe_ports порт 488 # gss-http
acl Safe_ports порт 591 # файловый менеджер
acl Safe_ports порт 777 # многоязычный http
acl CONNECT метод CONNECT

sslproxy_cert_error разрешить все
# отключите это в производственной среде, это опасно, но полезно для тестирования
sslproxy_flags DONT_VERIFY_PEER
#
# Рекомендуемая минимальная конфигурация разрешения доступа:
#
# Запретить запросы к определенным небезопасным портам
http_access deny! Safe_ports

# Запретить ПОДКЛЮЧЕНИЕ к другим, кроме безопасных SSL-портов
http_access deny CONNECT! SSL_ports

# Разрешить доступ к cachemgr только 
.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *