Где найти живые прокси листы? — Хабр Q&A

Где найти живые прокси листы? — Хабр Q&A Сертификаты

Что получилось

  1. Отдельные модули для разворачивания шифрованного SSL/TLS-туннеля, один из которых при желании можно использовать как самостоятельную программу типа ssl-telnet. Ещё можно заменить их на какие-то альтернативные реализации (например с другой крипто-библиотекой), при этом остальная часть прокси ничего не заметит. Аналогично с инкрементальными обновлениями, ничего даже не нужно перезапускать. А ещё можно их использовать как демки по работе с OpenSSL (я прочёл много документации и всяких обсуждений в процессе их написания, возможно кто-то сможет теперь всё это быстрее усвоить). Код старался делать максимально понятным и простым.

    • У клиента есть хранилище сертификатов для: белый список по сайтам (принимать и не проверять), чёрный список по сайтам (не проверять и не принимать), список вопросов (те, которые не входят ни в белый, ни в чёрный и не прошли валидацию — аналог браузерной страницы с предложением внести подозрительный сертификат в список исключений). Для сайтов можно включать режим белого списка (то есть принимать только сертификаты из него, остальные считать недоверенными). К сожалению, всё это делается путём манипуляций над файлами, интерактивного приложения пока нет.
    • Серверная часть сама генерирует сертификаты ко всем сайтам на лету, ей нужен только корневой сертификат, добавленный как trusted root CA в браузер.

  2. Возможность пробросить точку выхода в интернет через, например, ssh port forwarding (связанный с этим функционалом код расположен в helpers/remote.c и в proxy.c в месте где обрабатывается аргумент “–proxy”. Это не тоже самое что запустить само прокси на удалённом сервере. Тут важно что кеш и расшифровка SSL/TLS находятся на локальном компе, а пробрасывается только “внешний” конец. Хотя я давно не проверял работу этого режима, могла и сломаться.

  3. Единообразный формат файлов правил для: блокировки загрузки страниц, блокировки куков, управления кешированием, включения сниффера, включения raw-режима (для real-time стримингов).

  4. Аналог /etc/hosts но усовершенствованный: возможность сопоставления айпи-адреса не только по хосту, но и по порту и по протоколу, а так же сменить порт и протокол подключения.

  5. Кеш, управляемый прописанными ему настройками, а не заголовками, присланными сервером. Заголовки управления кешированием часто не отражают действительность (или отражают мнение владельца сайта, которое может расходиться с критериями удобства пользования этим сайтом), поэтому сейчас они игнорируются. Думаю что стоит сделать их учёт по принципу “если сайт разрешил кешировать то значит можно, а если нет — разбираемся сами можно или нельзя”, но пока руки не дошли. Кеш хранится в интуитивно понятно организованном дереве директорий, хранится бессрочно, но можно либо вручную удалять отдельные сохранения, либо настройкой задать “игнорировать всё что сохранено раньше такого-то времени”.

    • Кроме кеша есть ещё сохранения — это те страницы, которые не берутся с диска при запросе к ним, но на всякий случай всё равно сохраняются. При включении оффлайн-режима они тоже смотрятся (в файл offline.flag надо прописать предпочтительное время, за которое будут искаться сохранённые страницы при обращении к ним). При настройке сохранений учтите, что, несмотря на то, что сохраняются только ответы (содержимое POST-запросов не сохраняется), в них всё же могут быть некоторые данные, которые стоит беречь от кражи, а сохранённые на диске страницы — дополнительный вектор атаки.

  6. Возможность кастомных действий перед, после или вместо загрузки страницы проксированным запросом. Реализваны хардкодом, файл handle/inc.rewrite.c

  7. Есть dashboard (двоичный файл со статусами всех потоков прокси) и программа для его вывода на экран в удобном виде.
    ./dashboard --basedir=/path/to/proxy/base --highlight --loop

  8. Любой аспект работы прокси можно легко переделать при необходимости. Код, несмотря на то, что он весьма разросся по сравнению с первыми версиями, всё ещё занимает очень мало места, и не потребует много времени как на первоначальное изучение, так и на освежение в памяти забытых деталей. С другой стороны, кому-то это и минус — для пользования всеми возможностями программы предполагается её регулярная пересборка и правка кода, а не “скомпилировал и удалил исходники”.

Плюсы и минусы( ) Модульность(-) Из-за изоляции OpenSSL работает медленнее чем могло бы( ) Гибкая настраиваемость под конкретные нужды( -) Много настроек прямо в исходном коде в виде #define и не только( -) IPv6 не поддерживается(-)

Нет интерактивного приложения для настройки и управления(-) Код местами весьма плох и костылен(-) До сих пор нет поддержки Access-Control-Allow-Origin с не ‘*’ в закешированных ответах — но единственное что у меня от этого ломалось это интерфейс мэйлру почты.(-)

До сих пор нет поддержки учёта настроек кеширования, присылаемых сервером(-) Скачивать через него большие файлы (не в raw режиме) неэффективно — сначала прокси скачает файл себе на диск, затем будет через localhost-сеть отдавать его браузеру, который опять будет сохранять его на диск, а ещё там где-то (а может и в нескольких местах) прописано ограничение в 10мбайт на запрос

Post несколько файлов с многократным кодированием¶

Вы можете отправить несколько файлов в одном запросе. Например, предположим,
что вы хотите загрузить файлы изображений в HTML-форму с несколькими полями
файлов «images»:

Для этого достаточно прописать файлы в список кортежей (form_field_name,file_info):

>>> url='https://httpbin.org/post'>>> multiple_files=[... ('images',('foo.png',open('foo.png','rb'),'image/png')),... ('images',('bar.png',open('bar.png','rb'),'image/png'))]>>> r=requests.post(url,files=multiple_files)>>> r.text{  ...  'files': {'images': 'data:image/png;base64,iVBORw ....'}  'Content-Type': 'multipart/form-data; boundary=3131623adb2043caaeb5538cc7aa0b3a',  ...}

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

Что такое бесплатные proxy серверы? В первую очередь это оптимальный вариант для тех, кто только учится. Они подойдут вам, если анонимность не так важна:

  • Proxysite – прост и интуитивно понятен в использовании. В выпадающем меню выберите один из серверов Северной Америки или Европы, введите URL и перейдите, нажав на кнопку. Можно скорректировать настройки: указать систему и браузер, который вы якобы используете.
  • KProxy – сервисом можно пользоваться как бесплатно, так и на платной основе. Во втором случае вы сможете выбрать другое местоположение и добиться стабильной скорости интернет-соединения.

KProxy может использоваться как через сайт, так и с помощью специального расширения на браузерах Mozilla Firefox и Google Chrome.

  • Hide My Ass (HMA). Пользоваться им максимально просто – введите ссылку в поисковую строку и подключитесь. У ресурса большое количество ограничений: его нельзя использовать для онлайн-игр, передачи потокового видео или банкинга. Да и открыть можно только одну вкладку.
  • Anonymouse – универсальное средство для обеспечения конфиденциальности при посещении сайтов и для отправки электронной почты. В нём легко разобраться даже новичку – просто выберите соответствующий раздел в списке.

Что же касается платных прокси, то, по мнению пользователей, в пятёрку лучших вошли следующие proxy серверы:

  • Zenscrape – в отличие от большинства других серверов является полностью автоматизированным. Идеален для крупномасштабных проектов по парсингу. В зависимости от сайта, к которому вы подключаетесь, Zenscape использует разные типы прозрачных прокси. Стоимость тарифов варьируется от 700 до 15 000 рублей в месяц.
  • Microleaves – крупномасштабная сеть с большим пулом меняющихся IP, которые нужны для обхода блокировок. Три категории высокоскоростных прокси-серверов. Стоимость варьируется от 1200 до 9 200 рублей.
  • Luminati – большая сеть, которая помогает заниматься сбором данных без беспокойства, о том, что бота занесут в чёрный список. Имеет более  35 миллионов IP-адресов, доступных практически из любой точки мира. Большая свобода выбора: от постоянных резидентных, ротационных и мобильных прокси-серверов. Резидентные прокси стоят от 750 рублей за 1 ГБ. Есть тестовый домен.
  • NetNut – Позволяет осуществлять таргетирование на уровне нужного вам региона. Использует возможности DiviNetworks для доставки данных и управления сетью, что обеспечивает качественный сервис. Есть выбор из нескольких ежемесячных планов от 260 до 1 200 рублей за 1 ГБ.

DiViNetworks – технология, благодаря которой интернет-провайдеры предоставляют стабильные резидентные IP-адреса.

  • Storm Proxies — сервис предоставляет доступ к пулу более чем 70 тыс. сменяющих друг IP. Замена происходит каждые 3–15 минут, что подразумевает 100% защиту от блокировки. Это означает, что пользователь может выбрать прокси сервер в любой точке мира. Минимальная цена за резидентный прокси – 3700 рублей в месяц за 5 портов.

Настройка squid или как не купить платное решение

Всем привет!

Часто в организациях используем разного рода прокси, прокси как составляющая программного шлюза или самостоятельный классический вариант squid анализатор логов и т.п.

Мы пытались внедрить решение от Ideco и ИКС, в итоге остановились на squid. Под катом история пути и техническая информация по настройке старого доброго кальмара.

Начну пожалуй с того, что конечно странно на habr в 2021 году видеть статью про настройку squid, но тем не менее, даже в нынешние время платные продукты могут уступать по некоторым пунктам open source софту который так или иначе лежат в основе платного продукта с красивым интерфейсом.

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

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

В сети компании насчитывается свыше 550 компьютеров. Большинству из них нужен доступ к внутренним ресурсам.

Все разворачивалось в виртуальной среде, сервер виртуализации Hyper-v core — Неверный выбор, о причинах изложу в конце статьи.

Немного о выборе конкурсантов, UserGate помню его из времен начала работы в IT, по старой памяти приложение windows — по умолчанию не подходит.

Интернет Контроль Сервер (ИКС)- дело дошло до тестов. Удалось корректно загрузить из 10 только 2 раза, отмечая его отличную нестабильность пошли дальше. К стати, не могу не отметить юмор разработчиков, кто в курсе тот поймет! Продукт развивается, может быть уже проблем нет, но и задача решена.

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

1. Невозможно дать доступ к определенным ресурсам всей сети или всем пользователям домена — по умолчанию не считая таких пользователей за пользователя которого нужно лицензировать.

1.1 — Из пункта 1 вытекает немалая цена, т.к. у нас в компании довольно много компьютеров которым необходимо подключение к внутренним web сервисам и не нужен доступ в интернет, покупать лицензии для использования внутренних ресурсов мы не планировали, также не планировали разводить зоопарк серверов раздающих интернет.

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

Кстати, шлюз ideco доступен в бесплатной версии до 40 пользователей и без привязки к AD. Также появился IDECO SELECTA, или я не заметил его выпуска или он был выпущен уже после всех тестов.

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

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

Мы используем ubuntu server, следовательно следующая информация актуальна для этой ОС и с другими ОС может серьёзно различаться.

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

Настройка OS ubuntu server 16.04:

apt-get update
apt-get upgrade
apt-get install mc g   libecap3-dev libdb-dev libldap2-dev libpam0g-dev libldb-dev libsasl2-dev libkrb5-dev gcc libssl-dev krb5-user libpam-krb5 libkrb5-3 libsasl2-modules-gssapi-mit linux-virtual-lts-xenial linux-tools-virtual-lts-xenial linux-cloud-tools-virtual-lts-xenial linux-image-virtual linux-tools-virtual linux-cloud-tools-virtual squid3

Т.к. мы используем Hyper-v виртуализацию то мы установили необходимые пакеты.

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

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

Распаковываем в home или любой другой каталог.

tar xzf squid-3.5.26.tar.gz
cd /home/squid-3.5.26/
chmod  x configure 

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

./configure '--enable-ssl' '--with-openssl=/usr/lib/ssl/' '--disable-ipv6' '--enable-ssl-crtd' '--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-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'

make
make install

–with-openssl=/usr/lib/ssl/ — указываем путь до openssl, указан дефолтный путь в ubuntu server.

–disable-ipv6 — выключаем ipv6 — о причинах читайте ниже.

–enable-ssl-crtd — это для связки генерации ssl сертификатов для bump.

Возможно будут зависимости, нужно их установить.

По умолчанию все устанавливается в /etc/squid/

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

mkdir /etc/squid/ssl/private

Создаем сертификат:

Переходим в каталог

cd mkdir /etc/squid/ssl/private

Создаем ключ

openssl genrsa -aes256 -out private.pem 2048

Создаем сертификат

openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:2048 -keyout private.pem -out public.pem

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

openssl x509 -outform der -in public.pem -out squid3domainlocal.der

Создаем базу сертификатов:

/usr/lib/squid/ssl_crtd -c -s /etc/squid/ssl/ssl_db/

Назначаем доступ:

chown root:proxy -R /etc/squid/ssl
chmod 640 -R /etc/squid/ssl/private
chmod 660 -R /etc/squid/ssl/ssl_db

Обращаю Ваше внимание на то, что имя прокси сервера и имя указанное при создании сертификата должно быть одинаковое. Формат squid3.domain.local.

Полученный squid3domainlocal.der через групповые политики или вручную вносим в доверенные центры сертификации. Прокси сервер в браузере указываем не ip а полное имя компьютера, к примеру squid3.domain.local.

Создаем обычного пользователя в домене, пусть будет squid3.

Для прохождения аутентификации через kerberos нам нужен keytab пользователя squid3 для principal HTTP/squid3.DOMAIN.LOCAL@DOMAIN.LOCAL, при стандартном входе в домен через net ads создается keytab /etc/krb5.keytab, но в нем указаны principal не http а host. Что делает невозможным проходить аутентификацию пользователей через web браузер. Если Вы расположили keytab в /etc/krb5.keytab и после вводите в домен саму машину, то keytab просто будет дополнен новыми principal.Но обращаю Ваше внимание на то, что устанавливать пакет samba и вводить машину в домен не нужно, достаточно сгенерированного keytab для пользователя.

Далее идем на домен контроллер и выполняем нехитрую команду:

ktpass -princ HTTP/squid3.DOMAIN.LOCAL@DOMAIN.LOCAL mapuser squid3@DOMAIN.LOCAL -crypto AES128-SHA1 -pass XXXXXXXXXXXXXX -ptype KRB5_NT_PRINCIPAL -out c:krb5.keytab

Переносим полученный файл на прокси сервер и далее помещаем в удобное расположение, я выбираю /etc/krb5.keytab.

Если Вы хотите сделать авторизацию еще и для web сайта, статистика или внутренний портал компании то нужно создать группу и включить туда пользователей proxy и www-data.

Создаем группу:

groupadd allowreadkeytab

Добавляем необходимых пользователей в группу:

adduser proxy allowreadkeytab
adduser www-data allowreadkeytab

Назначаем владельцев на krb5.keytab

chown root:allowreadkeytab /etc/krb5.keytab

Если нет необходимости дополнительным сервисам давать доступ, то группу не создаем, просто выставляем владельцев и права:

chown root:proxy /etc/krb5.keytab

Назначаем доступ:

chmod 640 /etc/krb5.keytab

Получаем:

-rw-r----- 1 root allowreadkeytab /etc/krb5.keytab

Или

-rw-r----- 1 root proxy /etc/krb5.keytab

Чтение и запись для root, только чтение для allowreadkeytab и без доступа для остальных.

Настраиваем krb5.conf

mcedit /etc/krb5.conf

Сохраняем.

Обращаю Ваше внимание, что ниже squid.conf не будет содержать все acl и все правила, будут лишь по 1 примеру настройки, полная настройка acl и листами доступа к сайтам и т.п. будет слишком объемной. Ниже приведенный конфиг можно рассматривать как требующий доработки под свои нужды.

Переходим к настройке squid:

mcedit /etc/squid/squid.conf


acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 21

acl purge method PURGE
acl CONNECT method CONNECT

http_access allow purge localhost
http_access deny purge
http_access deny CONNECT !SSL_ports

Тут важный момент, есть сайты которые поднимают соединение непосредственно с «компьютером», и аутентификация пользователя не производится. Как следствие происходит блокировка соединения. Для обхода этой проблемы дается доступ конкретному ip к конкретному сайту.

!!! Важное примечание !!! Правило должно быть расположено выше правил с аутентификацией basic, ntlm, kerberos и др.

acl authip src "/etc/squid/pools/ip.txt"
acl domainautip dstdomain "/etc/squid/exceptions/domain.txt"
http_access allow authip domainautip 
http_reply_access allow authip  domainautip

Определяем aclы:

Документация

Acl для определения типа контента:

acl application_mime rep_mime_type application/octet-stream
acl video_mime rep_mime_type “/etc/squid/ban/mime_type_video.txt”

Также фильтровать некоторый контент можно по url, для этого создаем acl:

acl blockextention urlpath_regex -i “/etc/squid/ban/blockextention.txt”

Есть еще любопытный acl allowerrorsert, т.к. мы не разрешаем по умолчанию доступ к сайтам с кривыми сертификатами, я использую allowerrorsert для определения перечня разрешенных сайтов с «кривыми» ssl. Об этом не много ниже.

acl banksites dstdomain "/etc/squid/allow/bank.txt"
acl allofficesites dstdomain "/etc/squid/allow/alloffice.txt"

acl manual dstdomain "/etc/squid/ban/manual.txt"
acl allowerrorsert dstdomain "/etc/squid/exceptions/allowerrorsert.txt"

Также есть возможность управлять доступом к сайтам на основе ssl правил, но на мой взгляд эффективнее управлять через http_access. Вот пример acl для использования в правилах ssl:

acl sslproxy ssl::server_name "/etc/squid/ban/proxy.txt"

Ниже мы еще вернемся к этому типу acl и их применению.

Позволяет видеть в расширенном режиме запросы POST и mime.

strip_query_terms off
log_mime_hdrs on

Аутентификация и авторизация пользователя в группе active direcory через kerberos:

auth_param negotiate program /usr/lib/squid/negotiate_kerberos_auth -s HTTP/squid3.domain.local@DOMAIN.LOCAL
auth_param negotiate children 20 startup=10 idle=10
auth_param negotiate keep_alive on

Тут следует остановиться и разобрать подробнее, children — максимальное количество процессов доступные для запуска, startup количество процессов которые запущены всегда, idle максимальная очередь к помощнику при превышении указанного числа будет запускаться новый процесс помощника.

Небольшое отступление по работе авторизации:

Тут есть особенность, дело в том, что некоторые сайты пытаются подключить вагон разных ресурсов и картинок с других сайтов, собрать кучу статистики и прочее, каждый запрос проходит авторизацию это может вызвать большую очередь к процессу помощника авторизации, можно просто увеличить children, увеличить idle… но это только на первый взгляд, запросов от 1 пользователя может быть несколько десятков тысяч, что за собой несет большую очередь. При появлении большой очереди нагрузка на CPU зашкаливает. В условиях большого количества пк и малой доли пользователей с полноценным доступом в интернет, установленный на пк chrome создавал прям удивительное количество соединений — 500 тыс. запросов на clients1.google.com в сутки. Как следствие были пики очередей.

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

Поиск пользователя в группе:

external_acl_type domainusers ttl=300 negative_ttl=60 ipv4 %LOGIN /usr/lib/squid3/ext_kerberos_ldap_group_acl -a -T d09fd0bed0bbd18cd0b7d0bed0b2d0b0d182d0b5d0bbd0b820d0b4d0bed0bcd0b5d0bdd0b0 -D DOMAIN.LOCAL

external_acl_type allow-all ttl=300 negative_ttl=60 ipv4 %LOGIN /usr/lib/squid3/ext_kerberos_ldap_group_acl -a -g internet-allow-all -D DOMAIN.LOCAL

Две строки выше выполняю 1 функцию, загружают помощника для поиска пользователя в группе, можете сами выполнить в командной строке /usr/lib/squid3/ext_kerberos_ldap_group_acl -a -g internet-allow-all -D DOMAIN.LOCAL жмем enter и набираем имя пользователя, если пользователь будет найден в указанной группе, то ответ будет OK если нет то ERR. Обращаю внимание на то, что указанная группа internet-allow-all создана в AD.

Если Вы обратили внимание, то две строки отличаются, в 1 непонятный набор букв и цифр во второй все ясно… В первой строке указана группа «Пользователи домена», не желая разбираться с кириллицей в конфиге сквида и работе хелпера, я решил сделать так, это единственная группа в AD которая связана с этим сервисом имя которой написано кириллицей. Синтаксис тоже изменен, с g что означает группу на T.

Обещал рассказать почему отключил ipv6, это была длинная история, не шла авторизация у пользователя потому что я не указал в строке external_acl_type…….ipv4 т.к. мы не используем ipv6 да и мало кто использует в локальных сетях решено было вообще отключить чтобы избежать подобных проблем. На сёрфинге интернета это тоже никак не отражается.

Группы для ограничения скорости:

external_acl_type disable-speed ttl=300 negative_ttl=60 ipv4 %LOGIN /usr/lib/squid3/ext_kerberos_ldap_group_acl -a -g internet-deny-speed -D DOMAIN.LOCAL

external_acl_type allow-speed ttl=300 negative_ttl=60 ipv4 %LOGIN /usr/lib/squid3/ext_kerberos_ldap_group_acl -a -g internet-allow-speed -D DOMAIN.LOCAL

internet-allow-speed — Группа созданная в AD.

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

acl domainusers external domainusers
acl allow-all external allow-all
acl allow-speed external allow-speed
acl disable-speed external disable-speed

Далее следуют разрешающие и блокирующие правила. Правила работают как обычно по цепочке, все что cверху имеет большее значение.

http_access allow localhost
http_access deny manual
http_reply_access deny application_mime
http_access allow allow-all
http_reply_access allow allow-all

http_access allow domainusers banksites
http_access deny domainusers

Тут начинается bump, в строке http_port указываем порт и указываем функцию ssl-bump далее включаем генерацию сертификатов, далее размер кеша, далее указываем сам сертификат к слову который добавлен в качестве доверенного центра сертификации на компьютерах домена, далее ключ.

Схема работы следующая, клиент заходит на сайт google.com, клиент устанавливает соеденение ssl с прокси, а прокси в свою очередь с сайтом, прокси поднимает ssl с сайтом и отдельно ssl с клиентом выступая при этом посредником.

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

http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=16MB  cert=/etc/squid/ssl/private/public.pem key=/etc/squid/ssl/private/private.pem

настройки помощника который генерирует ssl сертификаты для сайтов:

sslcrtd_program /usr/lib/squid/ssl_crtd -s /etc/squid/ssl/ssl_db -M 16MB
sslcrtd_children 20 startup=10 idle=10

visible_hostname = squid3.domain.local

Cоздаем acl с шагами bump, существует всего 3 шага, sslbump1 смотрит на открытую информацию в сертификате, та которая доступна всем.

sslbump2 создает соединение с сайтом sslbump3 создает соединение с клиентом.

acl step1 at_step SslBump1
acl step2 at_step SslBump2
acl step3 at_step SslBump3

Указываем acl которые будут внесены в исключения при работе с sslbump

acl sslbanksites ssl::server_name "/etc/squid/exceptions/bank.txt"
acl allowsplice ssl::server_name "/etc/squid/exceptions/allowsplice.txt"

В bank.txt и allowsplice.txt находятся имена доменов.

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

sslproxy_cert_error allow allowerrorsert

splice — пропустить все последующие действия т.е. не делать bump пропустить как есть.

peek — подсмотреть доступную инфу без полного бампа

terminate — закрыть соединение, не используем, фильтруем через http_access

bump — «влезает» в соединение, делает https видимым как http

ssl_bump splice allowsplice
ssl_bump splice sslbanksites
ssl_bump peek step1 all
ssl_bump bump step2 all 
ssl_bump bump step3 all

Закрываем доступ всем.

http_access deny all
icp_access deny all
htcp_access deny all

Прочие настройки

cache deny all
error_directory /etc/squid/errors/
forwarded_for off

Режем скорость, указываем сколько пулов задержки мы используем:

delay_pools 3

VIP-пользователи, избранные сайты без ограничений по скорости

delay_class 1 1
delay_access 1 allow allow-speed
delay_access 1 allow banksites
delay_parameters 1 -1/-1
delay_access 1 deny all

В нерабочее время — Интернет отключается (до 100КБ/сек.)

delay_class 2 2
delay_access 2 allow !workhours
delay_parameters 2 -1/-1 10000/10000
delay_access 2 deny all

Ограничение на закачку — до 10MB загружают весь канал без ограничений, свыше только 100 КБ/С

delay_class 3 2
delay_access 3 allow disable-speed
delay_parameters 3 -1/-1 32000/10485760
delay_access 3 deny all

В синтаксисе лога изменена буква a на большую A, вот тут: %6tr %>A. Это дает возможность в логах видеть имя компьютера вместо его IP адреса, что конечно удобней.

logformat squid %ts.tu %6tr %>A %Ss/>Hs %<st %rm %ru %[un  %Sh/%<a %mt

Не много о проблемах и об особенностях которые возникали.

Прокси сервер выведен в отдельную dmz, файрволом жестко ограничен доступ в dmz и из нее. Т.к. сквид постоянно опрашивает dns и kerberos по udp преимущественно, то он незамедлительно превышал допустимое количество подключений с 1 ip, на сервер AD который находится в другой dmz, соединения сбрасывались. Проблема была неочевидная, хелпер авторизации падал, клиент получал окно аутентификации.

Ошибка выглядит так:

support_krb5.cc(64): pid=36139 :2021/10/24 08:53:51| kerberos_ldap_group: ERROR: Error while initializing credentials from keytab: Cannot contact any KDC for realm ‘DOMAIN.LOCAL’

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

Была еще 1 ошибка:

support_sasl.cc(276): pid=8872 :2021/10/24 06:26:31| kerberos_ldap_group: ERROR: ldap_sasl_interactive_bind_s error: Local error
support_ldap.cc(957): pid=8872 :2021/10/24 06:26:31| kerberos_ldap_group: ERROR: Error while binding to ldap server with SASL/GSSAPI: Local error

В bind нужно скопировать обратную зону.

UPD — Самое интересное

Возникла проблема с высокой нагрузкой на cpu и io, проц грузил в основном negotiate_kerberos io грузил ext_kerberos_ldap_group_acl, понятное дело что negotiate_kerberos запускал ext_kerberos_ldap_group_acl, нагрузка была не постоянная, два раза в день по 30 минут.

Изменение соотношения количества children и idle нужного результата не дало. В процессе отладки была ясная картина, при любой конфигурации в период пиков запускалось максимальное количество процессов аутентификации. Был проанализирован access.log, как результат анализа было выделено то, что в момент пиковой нагрузки было очень много ssl соединений, это натолкнуло на мысль что проблема кроется не в авторизации а в ssl_bump, для эксперимента был отключен ssl_bump, как результат было полное отсутствие нагрузки на протяжении всего дня. В целом в течении дня работа кальмара и его помощников не вызывала нарекании, но в определенные моменты приходило огромное количество соединений, сухие цифры: от 1 компьютера в единицу времени (5-15 мин) пришло 10000 запросов на ssl соединение которое попадает под правило bump. В другой день тоже самое с другого компьютера на .*whatsapp.net.

В конечном итоге ssl_bump включен, работает без нареканий. Если идет куча запросов на хост который недоступен по таймауту, вот тут возникают пики. На уменьшение очереди в основном повлияло исключение clients1.google.com и clients2.google.com из прокси.

Решать дать доступ к clients1.google.com и clients2.google.com, отключить задание на обновление или исключить эти хосты из прокси решать Вам.

Относительно hyper-v, в целом всё работает стабильно, uptime обычно превышает два месяца, но наступает тот день когда абсолютно на ровном месте без ошибок в логах и какой-либо нагрузки зависают виртуальные машины или выполняется их перезагрузка, но при этом последующая загрузка не приводит загрузке рабочего состояния. Приходится делать сброс и последующая загрузка производится нормально, прошу прощения за тавтологию. При всех равных на указанном сервере крутится две виртуалки ubuntu server 16.04 и у обоих происходит ода и та же проблема с разницей между ними в несколько дней, потом опять uptime не менее 2 месяцев. Для решения этой проблемы переносим сквид в докер, следующую статью оформлю про настройку сквида в докере, в целом мало чем отличается кроме целой кучи зависимостей.

Настройка bind:

 nano /etc/bind/named.conf.options 

Редактируем и вставляем:

zone "domain.local" {
    type slave;
    masters { 192.168.XX.XX; 192.168.XX.XX;};
    file "bak.domain.local";
    forwarders {};
	
	zone  "XX.168.192.in-addr.arpa" {
    type slave;
    masters { 192.168.XX.XX; 192.168.XX.XX;};
    file  "XX.168.192.in-addr.arpa.zone";
};

Анализатор логов:

Squidanalyzer

Сайт
→ Инструкции: раз и два

Для его работы нужно установить apache2:

apt-get install apache2

Рассказывать о том, как настаивать его не буду, по ссылкам довольно понятно и доступно. Обращу внимание лишь на одно, пока не будет сгенерирован первый отчет — по web адресу ничего не появится, будет ошибка.

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

/etc/squidanalyzer/squidanalyzer.conf

И в скрипте который является шаблоном для /usr/bin/squid-analyzer:

/usr/local/share/perl/5.22.1/SquidAnalyzer.pm

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

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

В процессе отладки очень помог awk, команда которая выводит и группирует столбцы:

 cat /var/log/squid/access.log  | awk '{print $номерстолбца}' | cut -d: -f1 | sort | uniq -c | sort -n

Можно добавлять grep.

Для конвертации формата даты и времени в логе кальмара можно использовать:
%tl %6tr %>A %Ss/>Hs %<st %rm %ru %[un %Sh/%<a %mt

Обходим проверку сертификата ssl

Где найти живые прокси листы? — Хабр Q&A

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

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

Всем известно, что при посещении сайта у которого “временно” что-то случилось c сертификатом вы обнаружите предупреждение, которое показывается, если сертификат безопасности не является доверенным net::ERR_CERT_AUTHORITY_INVALID?

Привет онлайн-кинотеатрам

Все современные браузеры показывают сообщение об ошибке HSTS

Самый простой способ обхода данного запрета — это, разумеется, нажатие на вкладку “Дополнительные” и согласиться с Небезопасным режимом.

Где найти живые прокси листы? — Хабр Q&A

Но не во всех браузерах как оказывается, есть данная возможность. Так я столкнулся с данной проблемой в Chrome на Mac OS

Разработчики данной операционной системы настолько обеспокоены безопасностью пользователей, что даже убрали доступ в «Небезопасном режиме» к сайту, несмотря на то, что это сайт владельца устройства.

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

— Все хромоподобные браузеры (Chrome, Opera, Edge …) могут открыть небезопасную веб страницу, если на английской раскладке клавиатуры набрать фразу:

thisisunsafe

прямо на данной веб странице. Это даст возможность работать с сайтом без оповещение об ошибке на момент текущей сессии браузера, пока вы не закроете вкладку Chrome.

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

Для Windows

C:Program Files (x86)GoogleChromeApplicationchrome.exe" --ignore-certificate-errors

Где найти живые прокси листы? — Хабр Q&A

Для Mac OS

/Applications/Google Chrome.app/Contents/MacOS/Google Chrome --ignore-certificate-errors --ignore-urlfetcher-cert-requests &> /dev/null

Achtung! Данные манипуляции необходимо выполнять с выключенным Chrome приложением, иначе чуда не произойдет.

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

Браузер напомнит, что вы находитесь в небезопасном режиме. Поэтому крайне не рекомендуется шастать по злачным сайтам Интернета с такими правами доступами.

Где найти живые прокси листы? — Хабр Q&A

*Так же есть метод с добавлением сертификатов тестируемого сайта в конфиги браузера Настройки->Безопасность->Настроить сертификаты->Импорт… но мне он показался не продуктивным и очень муторным, поэтому не привожу

Надеюсь моя краткая статья кому-то пригодится при разработке и тестировании сайтов =)

Первые шаги

1. Установка и запуск

Для начала необходимо загрузить и установить приложение.

Если у вас не приобретена лицензия, то будет доступна 30-ти дневная пробная версия с ограничениями (функциональность не блокируется, но будут появляться окна с таймаутом 5-10 секунд до возобновления использования, а также через 30 минут будет завершаться работа приложения).

2. Начинаем сниффить трафик

Запустите Charles Proxy на MAC, зайдите в меню Help → SSL Proxying → Install Charles Root Certificate → Установить сертификат → Импортируем сертификат.

Запустите Charles Proxy на Windows, зайдите в меню Help → SSL Proxying → Install Charles Root Certificate

В Windows, в открывшемся окне Сертификат → Установить сертификат. Выбрать «Текущий пользователь» или «Локальный пользователь». Далее вы получите уведомление от мастера импорта сертификатов, что сертификат успешно импортирован.

3. Проксирование трафика веб-браузера

Рассмотрим вариант с проксированием на примере браузера Mozilla Firefox. И установку сертификата на примере двух OS: MAC и Windows.

3.1 WindowsДля этого узнаем IP-адрес ПК: в Charles Proxy перейдем в Help → Local IP Address. Видим, что ваш IP: 10.0.2.15 (p.s. в Local IP Address может быть несколько указано IP, например отображаться IP от VirtualBox, если после указания одного IP не будут отображаться запросы, попробуйте выбрать другой из списка).

Далее откроем Mozilla Firefox, перейдем в Параметры сети → Настроить. Выставим все как на скриншоте ниже и нажмем Ок.

Теперь необходимо перейти по ссылке chls.pro/ssl, а далее начнется автоматическая загрузка сертификата. В этот момент будет входящее соединение в Charles Proxy, необходимо нажать Allow, а также выполнить импорт сертификата:

3.2 MAC OSДля этого узнаем IP-адрес ПК: в Charles Proxy перейдем в Help → Local IP Address. Видим, что ваш IP: 192.168.1.50.

Далее откроем Mozilla Firefox, перейдем в Параметры сети → Настроить.

Выставим все как на скриншоте и нажмем Ок.

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

В этот момент будет входящее соединение, необходимо нажать Allow:

Следующим шагом обратите внимание на диалоговое окно, где необходимо выбрать Открыть в keychain:

Важным шагом, который вы должны сделать далее, это в Keychain Access сделать сертификат доверенным:

Где найти живые прокси листы? — Хабр Q&A
Где найти живые прокси листы? — Хабр Q&A
Не забудьте деактивировать Windows Proxy (если у вас ОС Windows) или Mac Proxy (в противном случае будет вам мешать).

Теперь у вас отображаются запросы, однако они зашифрованы, и кроме иероглифов ничего не видно. Чтобы видеть Request/Response в нормальном виде, нужно включить SSL Proxying и настроить домены, пакеты которых мы хотим перехватывать. А хотим мы получать запросы со всех сайтов. Для этого перейдите в раздел Proxy → SSL Proxying Settings.

В открывшемся диалоговом окне поставьте галочку Enable SSL Proxying, выберите раздел Include и нажмите Add.

Далее заполните поле Host значением * (как показано на скриншоте) и нажмите ОК.

В диалоговом окне «SSL Proxying Settings» нажмите ОК.

Если необходим будет определенный host, следует указать например нужный *youla* (это значит, что будет расшифровываться трафик только тот, где в запросах есть youla.

4. Настройка прокси на Android

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

Для этого узнаем IP-адрес ПК: в Charles Proxy перейдем в Help → Local IP Address. Видим, что ваш IP: 192.168.1.50.

Далее возьмите в руки телефон, откройте Свойства сети → Название сети WiFi → Прокси-сервер → Вручную → Имя хоста: *ваш IP* / Порт: *8888* → Сохраните измененные свойства сети.

Подготовка requests¶

Каждый раз, когда вы получаете объект Response из
вызова API или сеанса, атрибут request фактически является использованным
PreparedRequest.

fromrequestsimportRequest,Sessions=Session()req=Request('POST',url,data=data,headers=headers)prepped=req.prepare()# сделать что-нибудь с prepped.bodyprepped.body='No, I want exactly this as the body.'# сделать что-нибудь с prepped.headersdelprepped.headers['Content-Type']resp=s.send(prepped,stream=stream,verify=verify,proxies=proxies,cert=cert,timeout=timeout)print(resp.status_code)

Поскольку вы не делаете ничего особенного с объектом Request, вы готовите
его немедленно и изменяете объект PreparedRequest.

Затем вы отправляете его
с другими параметрами, которые вы бы отправили на requests.* или
Session.*.

Однако приведенный выше код теряет некоторые преимущества наличия объекта
Requests Session. В частности, к вашему запросу не
будет применяться состояние уровня Session, такое как
cookie.

Чтобы получить PreparedRequest
с этим состоянием, замените вызов Request.prepare() на вызов Session.prepare_request(), например так:

fromrequestsimportRequest,Sessions=Session()req=Request('GET',url,data=data,headers=headers)prepped=s.prepare_request(req)# сделать что-нибудь с prepped.bodyprepped.body='Seriously, send exactly these bytes.'# сделать что-нибудь с prepped.headersprepped.headers['Keep-Dead']='parrot'resp=s.send(prepped,stream=stream,verify=verify,proxies=proxies,cert=cert,timeout=timeout)print(resp.status_code)

Когда вы используете подготовленный поток запросов, имейте в виду, что он не
принимает во внимание среду. Это может вызвать проблемы, если вы используете
переменные среды для изменения поведения requests. Например: самоподписанные
сертификаты SSL, указанные в REQUESTS_CA_BUNDLE, не будут учитываться.

Заключение


Что же дальше? А дальше мы добавим код для сохранения данных в текстовый файл, чтобы их можно было проанализировать то, что передаёт покерный клиент серверу. Собственно, всё, MitM Proxy написан.

Осталось добавить в него немного блекджека. Например, для разбора идущего через него трафика, выдирания карт пользователя и отправки нам и т. д… Я написал разборщик трафика на лету, что бы можно было удобно мониторить, что отправляет клиент, и соотносить это с моими действиями. Демонстрация того, что получилось у меня:

Исходники mitm proxy
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using ConnectionAnalizer;

namespace MITMProxy
{
    class Program
    {

        static readonly TcpListener Listener = new TcpListener(IPAddress.Any, 4520);
        const int BufferSize = 4096;

        static void Main()
        {
            Listener.Start();
            new Task(() =>
            {
                while (true)
                {
                    var client = Listener.AcceptTcpClient();
                    new Task(() => AcceptConnection(client)).Start();
                }
            }).Start();
            Debug.WriteLine("Server listening on port 4502.  Press enter to exit.");
            Console.ReadLine();
            Listener.Stop();
        }

        private static void AcceptConnection(TcpClient client)
        {
            try
            {
                var certificate = new X509Certificate("SslServer.cer", "123");
                var clientStream = new SslStream(client.GetStream(), false);
                clientStream.AuthenticateAsServer(certificate, false, System.Security.Authentication.SslProtocols.Default, false);

                var server = new TcpClient("200.26.205.63", 4520);
                var serverSslStream = new SslStream(server.GetStream(), false, SslValidationCallback, null);
                serverSslStream.AuthenticateAsClient("lb3.playdata.co.uk");
             
                new Task(() => ReadFromClient(client, clientStream, serverSslStream)).Start();
                new Task(() => ReadFromServer(serverSslStream, clientStream)).Start();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                throw;
            }

        }

        private static bool SslValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslpolicyerrors)
        {
            return true;
        }

        private static void ReadFromServer(Stream serverStream, Stream clientStream)
        {
            var message = new byte[BufferSize];
            while (true)
            {
                int serverBytes;
                try
                {
                    serverBytes = serverStream.Read(message, 0, BufferSize);
                    clientStream.Write(message, 0, serverBytes);
                }
                catch
                {
                    break;
                }
                if (serverBytes == 0)
                {
                    break;
                }
            }
        }

        private static void ReadFromClient(TcpClient client, Stream clientStream, Stream serverStream)
        {
        	var message = new byte[BufferSize];
            var fileInfo = new FileInfo("client");
            if (!fileInfo.Exists)
                fileInfo.Create().Dispose();
            using (var stream = fileInfo.OpenWrite())
            {
                while (true)
                {
                    int clientBytes;
                    try
                    {
                        clientBytes = clientStream.Read(message, 0, BufferSize);
                    }
                    catch
                    {
                        break;
                    }
                    if (clientBytes == 0)
                    {
                        break;
                    }
                    serverStream.Write(message, 0, clientBytes);
                    memoryStream.Write(message, 0, clientBytes);
                    stream.Write(message, 0, clientBytes);

                }
                client.Close();
            }
        }
    }
}


Про сертификаты:  Продлены сроки действия сертификатов ФСБ России на продукты ViPNet Client 3.2, ViPNet Coordinator 3.2 и ViPNet Administrator 3.2. | ИнфоТеКС
Оцените статью
Мой сертификат
Добавить комментарий