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: Настройка сетевых интерфейсов:
ekzorchik@srv-host:~$ 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
ekzorchik@srv-host:~$ sudo ifup eth2
(У меня интерфейс eth0 получает от Mikrotik (который является шлюзом в интернет) сетевой адрес который прописан, как статика для данной системы)
Шаг №2: Привожу систему к актуальному состоянию в рамках текущего релиза Ubuntu Trusty:
ekzorchik@srv-host:~$ sudo rm -Rf /var/lib/apt/lists/
ekzorchik@srv-host:~$ sudo apt-get update && sudo apt-get upgrade -y
Итого информация по системе:
ekzorchik@srv-host:~$ 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: Указываю именование системы, настраиваю часовой пояс, время:
ekzorchik@srv-host:~$ sudo nano /etc/hosts
10.90.90.1 srv-host.polygon.local srv-host
ekzorchik@srv-host:~$ sudo nano /etc/hostname
srv-host.polygon.local
ekzorchik@srv-host:~$ sudo apt-get install ntpdate ntp -y
ekzorchik@srv-host:~$ sudo nano /etc/ntp.conf
server <IP_ADDRESS_MIKROTIK>
Шаг №4: Устанавливаю пакет dnsmasq и настраиваю его:
ekzorchik@srv-host:~$ sudo apt-get install dnsmasq -y
ekzorchik@srv-host:~$ dnsmasq --version | head -n 1
Dnsmasq version 2.68 Copyright (c) 2000-2013 Simon Kelley
ekzorchik@srv-host:~$ sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.backup
ekzorchik@srv-host:~$ sudo bash -c "cat > /etc/dnsmasq.conf"
^C — по клавиатурному сочетанию Ctrl + C прерываем выполнение команды выше по очистке содержимого файла /etc/dnsmasq.conf
ekzorchik@srv-host:~$
ekzorchik@srv-host:~$ 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 на корректность:
ekzorchik@srv-host:~$ /usr/sbin/dnsmasq --test
dnsmasq: syntax check OK.
Советую после внесения изменений в файл /etc/dnsmasq.conf делать (stop && start, restart у меня почему-то не отрабатывал и я кучу времени убил на это чтобы выяснить):
ekzorchik@srv-host:~$ sudo /etc/init.d/dnsmasq stop
ekzorchik@srv-host:~$ sudo /etc/init.d/dnsmasq start
Снимаем символ комментария со строки в файле dhclient.conf:
ekzorchik@srv-host:~$ sudo nano /etc/dhcp/dhclient.conf
prepend domain-name-servers 127.0.0.1;
Шаг №5: Нужно настроить правила маршрутизации для обработки соединений от локальной сети.
ekzorchik@srv-host:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)?
y
Firewall is active and enabled on system startup
ekzorchik@srv-host:~$ sudo nano /etc/default/ufw
IPV6=no
DEFAULT_FORWARD_POLICY="ACCEPT"
ekzorchik@srv-host:~$ 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
ekzorchik@srv-host:~$ sudo ufw default deny
Default incoming policy changed to 'deny'
(be sure to update your rules accordingly)
ekzorchik@srv-host:~$ sudo ufw allow ssh
Для DNS — это 53 порт (TCP+UDP)
ekzorchik@srv-host:~$ sudo ufw allow domain
Для DHCP — это порт 67 и 68 UDP
ekzorchik@srv-host:~$ sudo ufw allow from any port 68 to any port 67 proto udp
ekzorchik@srv-host:~$ sudo ufw logging on
ekzorchik@srv-host:~$ sudo nano /etc/ufw/before.rules
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.90.90.0/24 -o eth0 -j MASQUERADE
COMMIT
ekzorchik@srv-host:~$ 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
ekzorchik@srv-host:~$ sudo ufw reload
ekzorchik@srv-host:~$ 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
ekzorchik@srv-host:~$ apt-cache show squid3 | grep Version
Version: 3.3.8-1ubuntu6.8
Version: 3.3.8-1ubuntu6
ekzorchik@srv-host:~$ 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-пакеты) которые вы когда либо ставили, по сути это будет Ваша резервная копия и Вы не будете зависеть ни от кого.
Обновляю информацию по репозитариям добавленным в систему:
ekzorchik@srv-host:~$ sudo apt-get update
Теперь смотрю какая версия squid мне доступна для установки:
ekzorchik@srv-host:~$ apt-cache show squid3 | grep Version
Version: 3.5.19-1
Version: 3.3.8-1ubuntu6.8
Version: 3.3.8-1ubuntu6
Отлично, а теперь приступаю к установке:
ekzorchik@srv-host:~$ 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
ekzorchik@srv-host:~$ sudo sh ./script-tools.sh
После ставлю пакет libecap3:
ekzorchik@srv-host:~$ sudo apt-get install libecap3 libecap3-dev -y --force-yes
А теперь ставлю Squid версии 3.5.19 с поддержкой OpenSSL:
ekzorchik@srv-host:~$ sudo apt-get install squid-langpack squid-common squid squidclient -y --force-yes
ekzorchik@srv-host:~$ 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'
Определяю местонахождение конфигурационного файла:
ekzorchik@srv-host:~$ sudo updatedb
ekzorchik@srv-host:~$ sudo locate squid.conf
/etc/squid/squid.conf
/usr/share/doc/squid-common/squid.conf.documented.gz
/var/lib/dpkg/info/squid.conffiles
Делаю резервную копию дефолтного конфигурационного файла:
ekzorchik@srv-host:~$ sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.backup
Очищаю содержимое конфигурационного файла squid.conf, т. к. в нем будет содержаться только то, что необходимо мне в рамках данной заметки:
ekzorchik@srv-host:~$ sudo bash -c "cat > /etc/squid/squid.conf"
Теперь создаю сертификат текущего сервера с которым будет работать SQUID:
ekzorchik@srv-host:~$ sudo mkdir /etc/squid/ssl
ekzorchik@srv-host:~$ cd /etc/squid/ssl/
ekzorchik@srv-host:/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:
ekzorchik@srv-host:/etc/squid/ssl$ sudo chmod 400 squidca.pem
ekzorchik@srv-host:/etc/squid/ssl$ cd ~/
А теперь собственно и конфигурационный файл squid.conf:
На заметку: описание директив для данной версии SQUID можно найти здесь: http://www.squid-cache.org/Versions/v3/3.5/cfgman/
ekzorchik@srv-host:~$ 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:
ekzorchik@srv-host:~$ sudo touch /etc/squid/SuperIP.txt
ekzorchik@srv-host:~$ sudo touch /etc/squid/WhiteList.txt
ekzorchik@srv-host:~$ sudo nano /etc/squid/BlackList.txt
.fishki.net
.yaplaka.com
.odnoklassniki.ru
games.mail.ru
hh.ru
superjob.ru
Теперь нужно проверить конфигурационный файл squid.conf на корректность: (в выводе не должно быть ни какого упоминания об ERROR)
ekzorchik@srv-host:~$ sudo squid -k parse
Наполняю файл запрещающих сайтов не относящихся к работе:
ekzorchik@srv-host:~$ sudo bash -c "echo .yandex.ru > /etc/squid/BlackList.txt"
Теперь запускаю SQUID:
ekzorchik@srv-host:~$ sudo /etc/init.d/squid stop
ekzorchik@srv-host:~$ sudo /etc/init.d/squid start
ekzorchik@srv-host:~$ sudo /etc/init.d/squid status
* squid is running
ekzorchik@srv-host:~$ 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)
ekzorchik@srv-host:~$ sudo tail -f /var/log/squid/cache.log
Теперь осталось дополнить правила в брандмауэре на заворачивание всего трафика из локальной сети на SQUID:
ekzorchik@srv-host:~$ 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
ekzorchik@srv-host:~$ sudo ufw allow from 10.90.90.0/24 to any port 3128
ekzorchik@srv-host:~$ sudo ufw allow from 10.90.90.0/24 to any port 3129
После перезапускаю ufw:
ekzorchik@srv-host:~$ sudo ufw reload
Шаг №8: Проверяю, как отрабатывает блокировка и собственно сама работа squid с клиентской станции в локальной сети:
, но вот что всплыло, если добавить себя IP адрес в файлы SuperIP.txt то интернет как и нужно работает без ограничений, а если себя туда не добавлять то на всех страницах я получаю отбивку, что доступ запрещен:
Анализ логов сервера привел меня:
ekzorchik@srv-host:~$ 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
^Cekzorchik@srv-host:~$ 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
ekzorchik@srv-host:~$ sudo service squid restart
ekzorchik@srv-host:~$ sudo service squid status
* squid is running
Вот теперь с клиентской станции все прекрасно открывается, за исключением домена Yandex, если же попробовать перейти на https://yandex.ru в ответ получится отбивка от squid:
Отлично, работает как и планировалось.
Если же нужно подсадить на прокси не всю локальную сеть, а только конкретные компьютеры, то нужно в настройках браузера прописать:
10.90.90.1:3130
а на сервере squid поправить правила:
ekzorchik@srv-host:~$ 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
Либо так, но лучше будет как сделано выше.
ekzorchik@srv-host:~$ sudo ufw allow from 10.90.90.0/24 to any port 3130 proto tcp
ekzorchik@srv-host:~$ sudo ufw reload
Затем на избранных компьютерах прописать:
Пуск — Панель управления — Свойства обозревателя — вкладка «Подключение» — «Настройка сети» —
отметить галочкой: Использовать прокси-сервер для локальных подключений.
Адрес: 10.90.90.1 Порт:3130
и после нажать OK, Применить, OK и все, данный компьютер теперь будет логироваться.
Вот собственно и все поданной задаче которую я запланировал. Только вот в самом начале я упомянул, для удобного формирования логов потребуется Вам уже самостоятельно по опубликованным ранее заметкам поставить:
либо Sarg
либо Free-sa
Если также как и я используете Sarg, то вот так выглядит сформированная статистика:
И не забываем настроить планировщик создания отчетов:
ekzorchik@srv-host:~$ 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:
ВНИМАТЕЛЬНО читаем комментарии
С момента написания статьи прошло много времени. Многое спрошено, добавлено, рассмотрено в обсуждении
Мой мир
Вконтакте
Одноклассники
Перехват и просмотр 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 только
.