Настоящая статья написана исключительно в информационных и экспериментальных целях. Под терминами "прокси"/"proxy" в данной статье подразумеваются локальные кэширующие прокси-серверы, которые используются для оптимизации трафика и улучшения производительности сети.
Автор подчеркивает, что содержание статьи не является научным исследованием или профессиональной рекомендацией. Все описанные решения, подходы и технологии реализованы на основе личного опыта и экспериментов автора.
Использование материалов статьи, включая скрипты, конфигурации и инструкции, осуществляется исключительно на ваш страх и риск. Автор не несет никакой ответственности за возможные проблемы, сбои, убытки или другие последствия, возникшие в результате применения описанных методов или решений.
Любые действия, предпринятые на основе данной статьи, являются вашим осознанным выбором, и вы берете на себя всю полноту ответственности за их последствия. Автор настоятельно рекомендует проводить тестирование в изолированных и безопасных средах перед внедрением решений в рабочую инфраструктуру.
Скрипт автоматической установки и настройки squid с поддержкой https и intercept. Squid будет распределять трафик по доменам на прокси (можно отправлять трафик куда угодно, но нужно что бы был интерфейс для этого) и стандартный шлюз.
Так же, есть возможность настройки псевдо "кластера" из нескольких установок. В таком случае трафик будет распределятся по tcp соединениям на установки squid в режиме backup.
Все пакеты берутся из репозитория и официальных источников, кроме пакетов самого squid (squid и squid_helper). Стандартный squid не способен работать просто так в прозрачном режиме из-за DNS validate. Подробнее о проблеме и как можно самому пересобрать пакеты, можно узнать в старой, но всё ещё актуальной статье.
В установке используются:
Squid и его helpers - Сам прозрачный прокси сервер.
Consul - Service discovery и kv база данных, используется для псевдо кластеризации.
Redsocks - Прокси клиент. Вместо него можно использовать всё что угодно, главное что бы был дополнительный “физический” сетевой интерфейс или его подобие. Можно просто добавить сетевой интерфейс и отправлять трафик на другой шлюз.
Keepalived - Стандартный vrrp. Используется для отказоустойчивости.
Самописные скрипты для взаимодействия утилит между собой и перенаправления трафика.
Всего 4 типа установки:
Для оптимального использования каналов прокси, рекомендую использовать либо 1 тип установки, либо 4(Главный мастер) и 3(Бэкапы, на которые отправляется весь трафик).
Скрипт установки сделан под altlinux p10.В целом, если необходимо адаптировать под другую систему - это не так трудно, как может показаться.
Есть установка в docker, но только под тип установки 1. Репозиторий
Предполагаемая топология выглядит следующим образом:
Далее будет всё расписано для установки в виде кластера. Тип установки 1 особо комментировать не приходится, там есть только базовый функционал прозрачного squid с https и перенаправления сайтов из /etc/squid/vpn_sites на интерфейс proxy.
Для начала нужно скачать скрипт:
wget https://raw.githubusercontent.com/govorunov-av/SquidFW/refs/heads/main/install.sh
Далее редактируем переменные в начале скрипта:
vim install.sh
##### BEGIN CHANGEABLE VARS ##### ##### REQUIRED VARS ##### HOME_NET='192.168.0.0/16' INTERNAL_NET='10.1.0.0/24' #ONLY /24 PREFIX NODE_TYPE=3 #1 for single install, 2 for vrrp Master, 3 for vrrp Backup, 4 for LoadBalancer SQUID_LINK='https://github.com/govorunov-av/SquidFW/raw/refs/heads/main/squid-6.10-alt1.x86_64.rpm' SQUID_HELPER_LINK='https://github.com/govorunov-av/SquidFW/raw/refs/heads/main/squid-helpers-6.10-alt1.x86_64.rpm' ########## ##### VARS FOR 1,2,3 NODES TYPE ##### PROXY_IP='123.123.123.123' PROXY_PORT='1234' PROXY_LOGIN='user123' PROXY_PASSWORD='pass123' RU_SITES=" #Here you can write domain coming from the domains of the vpn_sites #EXAMPLE: You write .com domain in vpn_sites and here you write .habr.com, this domains will be use default gateway .habr.com" VPN_SITES=" .com" ########## ##### VARS FOR 2,3,4 NODES TYPE ##### KEEPALIVED_VIP=192.168.100.254 #HA ip KEEPALIVED_PASSWORD=123321123 #Password for link Backup nodes #SET LB_SERVER and CONSUL_ENCRYPT FOR 3 NODE TYPE, if need to connect to node 4 type LB_SERVER=192.168.11.1 CONSUL_ENCRYPT='U1jGPtm9rduzZP5LK96g01T2H7QKgqsgqpCKZc=' #This value is issued after the installation of a type 4 node ########## ##### END CHANGEABLE VARS #####
Пакеты squid, по умолчанию, используются мои. Можно самому пересобрать squid и использовать свои ссылки на пакеты
Нода установленная в 4 режиме будет балансировать трафик в соответствии с weight каждого воркера. Weight устанавливается автоматически (с помощью speedtest-cli), может устанавливаться довольно долго (сервис запускается раз в 5 часов и периодически вылезает 403 ошибка), weight храниться в consul и его можно установить вручную.
consul kv put squid/clients/$NET_IP/weight 75
Так же keepalived priority устанавливается автоматически, при установки, и храниться в consul, можно изменить вручную(Максимальное значение - 255).
consul kv put squid/clients/$NET_IP/priority 210
Consul мониторит ещё и работу прокси (по curl ifconfig.me --interface $INTERNAL_NET_IP ), можно использовать web страницу consul`а для мониторинга. http://$LB_SERVER:8500. Для этого используется Service discovery. И если прокси не доступна, то из конфига Мастера нода автоматически уберется в течении минуты, а при возобновлении работа автоматически добавиться.
При установке указывать RU_SITES и VPN_SITES необходимо только при первой установке ноды типа 3, при установке последующих нод это делать не имеет смысла, так как данные этих переменных с первой ноды переходят в consul и далее используются для других установок.
Посмотреть это так же можно в web consul`а
http://$MASTER_IP:8500/ui/squidfw1/kv/squid/configs/
Посмотреть работоспособность proxy можно сразу на главном экране
http://$MASTER_IP:8500/ui/squidfw1/services
Keepalived приоритет и weight можно устанавливать так же в web.
http://192.168.16.1:8500/ui/squidfw1/kv/squid/clients/$CLIENT_IP/priority
http://192.168.16.1:8500/ui/squidfw1/kv/squid/clients/$CLIENT_IP/weight
Таким образом consul можно использовать как импровизированный сервис для мониторинга состояния “кластера”
В случае необходимости выключить ноду/ы - это необходимо делать правильно через shutdown. Иначе сервис в consul может зависнуть и быть как бы доступным, хотя не является таковым.
Публиковать все необходимые файлы тут невозможно. Wikijs ломается от огромного кол-ва символов. Поэтому GitHub репозиторий всего этого: репозиторий