Настройка ziproxy на нескольких IP
Недавно встала нетривиальная задача.
Есть ziproxy. Есть сервер с несколькими IP. Ziproxy умеет слушать либо все IP, либо один избранный. В интернет при этом ziproxy ходит либо с основного IP на интерфейсе, либо со всех, указанных в настройках, но по очереди.
Встала задача сделать так, чтобы ziproxy проксировал запрос от того IP, с которого пришёл запрос. То есть чтобы, если коннектится кто-нибудь к определённому IP, то и запрос наружу тоже должен идти от этого IP.
Насколько я знаю, из прокси серверов так можно настроить squid и, вроде бы, 3proxy.
Но, во-первых, сквид – это нечто монстроподобное (я его боюсь
), а во-вторых, необходимо было всё-таки постараться сделать это через ziproxy.
Решение было найдено. Можно просто запустить несколько демонов ziproxy, каждый со совоим конфигом. Что, собственно, и было проделано. Результат оказался удачным.
Но меня посетила мысль, а нельзя ли как-то это автоматизировать. То есть написать скрипт на шелле (в каком-то роде инсталлятор), который сделает нужные конфиги, произведёт необходимые правки и всё это дело запустит. Для запуска демонов я планировал использовать существующие rc.d скрипты, сделав несколько их копий просто, и один “мастер-скрипт” (как я в первый раз вручную и сделал). Но как выяснилось, на linux системах этого не получится сделать. Пришлось также написать свой rc.d скрипт.
Сразу прошу сильно за этот скрипт не бить. Я в нём по старой привычке сделал обработку всех возможных внештатных ситуаций. (защита от дурака), поэтом скрипт получился немного запутанный.
Вообщем, понеслась моча по трубам.
Стартовый скрипт я разбирать не буду. Там нету ничего интересного (разве, что учащимся скриптописанию на шелле он будет интересен. Но те его могут скачать и почитать)
-
Установка. Установка в зависимости от системы:
FreeBSDcd /usr/ports/www/ziproxy make install clean
В линуксах в зависимости от дистра
apt-get install ziproxy urpmi ziproxy yum install ziproxy
и т.д.
В Ubuntu, кстати, в репозиториях нету. Не знаю, если вообще ziproxy в дебиановских репозиториях. На крайняк собрать из исходников -
Далее идёт первичная настройка. Ищем конфиг и проводим первичную настройку. Обычно она ограничивается настройкой аутентификации и сжатия. За первое отвечает опция
PasswdFile="имя_файла"
Внутри указанного файла хранятся пары
логин:пароль
Пароль хранится в нешифрованном виде.
За сжатие отвечают опции вида Process_ТИП. Картинки я сжимать не рекомендую. А рекомендую сжимать различные файлы стилей, яваскрипты и т.п. Вообщем вот такие опции:
ProcessHTML_CSS = true ProcessHTML_JS = true ProcessHTML_tags = true ProcessHTML_text = true ProcessHTML_PRE = true ProcessHTML_NoComments = true
Настраивать IP и тому подобное нельзя. Иначе мой конфигуратор может обломится
Он расчитан на дефолтные значения этих опций. -
Собственно, настройка в нужном режиме. Для этого я написал небольшой скриптик. Далее его текст с комментариями. До запуска скрипта необходимо в той же директории, где и скрипт, создать файл с именем iplist и внести туда все IP на которых надо настроить прокси. На каждой строке по IP. Также в ту же директорию необходимо положить мой rc.d скрипт.
Стартовый скрипт.
Скрипт-конфигуратор
Текст скрипта-конфигуратора:#!/bin/sh
#Данные переменные необходимо настроить
#Порт, на котором будут слушать наши прокси
PORT="8180"
#Путь к rc.d (init) скрипту. Этот скрипт будет создан из моего, с правкой путей.
RCPATH="/usr/local/etc/rc.d/ziproxy_all"
#Путь к конфигу "по умолчанию". К тому, что мы правили.
CONFPATHDEF="/usr/local/etc/ziproxy/ziproxy.conf.sample"
#Путь к итоговому конфигу. Точнее конфигов будет несколько (на каждый IP по одному), а это шаблон имени. К нему в конце будет дописан номер.
CONFPATH="/usr/local/etc/ziproxy/ziproxy.conf"
echo ""
echo Configuring...
echo Using next settings:
echo Listen Port: $PORT
echo Template config path: $CONFPATHDEF
echo Config path: $CONFPATH'$n'
echo ""
echo 'Using IPs:'
i=0
for ip in `cat iplist`; do
#Проверяем, а есть ли вообще такие IP
EXIST=`ifconfig -a | grep $ip | wc -l`
if [ $EXIST -eq 0 ]; then
#если нету то говорим об этом
echo $ip - Not found on interfaces
else
i=`expr $i + 1`
#тиражируем конфиги, одновременно настраивая на нужные IP.
cat $CONFPATHDEF | sed 's/.*BindOutgoing.*/BindOutgoing = { "'$ip'" }/' | sed 's/Address =.*/Address = "'$ip'"/' | sed 's/.*Port =.*/Port = '$PORT'/' | sed 's/OnlyFrom/#OnlyFrom/' > $CONFPATH$i
echo $ip - Done
fi
done
#если IP больше 0, то создаём стартовый скрипт, прописывая пути и количество конфигов
if [ $i -gt 0 ]; then
cat ziproxy_all | sed 's/COUNT=.*/COUNT=$i/' | sed 's/PATH=.*/PATH=$CONFPATH'/ > $RCPATH
chmod 755 $RCPATH
echo Ziproxy Multi IPs was configured
echo Use $RCPATH to start/stop proxy
else
#если количество IP равно 0, то говорим об этом
echo Ziproxy was not configuring. Not found IPs
fi
- Запускаем. В моём случае это /usr/local/etc/rc.d/ziproxy_all start. Для остановки вместо start юзать stop
Данный конфигуратор и стартовый скрипт должны работать как во BSD системах, так и в Linux.
Прошу не говорить, что это бред и для такого прокси существуют более подходящие, чем ziproxy. Ziproxy тоже можно использовать так. При этом его настройка намного более проста чем у остальных.
Если необходимо изменить какие-либо опции в конфиге ziproxy, то меняем их в шаблоне, и заново запускаем скрипт. Необходимо изменить IP – меняем список IP в файле iplist и перезапускаем скрипт. Всё очень просто
Критика и предложения принимаются.



Вообще проще всего сделать подобную вещь с соксами, делается аналогично описанному запускается несколько socks5 по одному на каждый IP.
ИМХО, конечно, так заморачиваться не стоит, /etc/rc.local нас спасет
Ну мне было нечего делать и я решил сделать всё правильно, со стартовым скриптом. Этот скрипт потом, если что можно и в мониторинг запихать. Причём руками почти ничего делать не надо. В этом и смысл – всё на автомате
socks5 я ещё, чувствую, буду так же ставить. Но ziproxy и socks – разные прокси для разных целей: socks не умеет сжимать, не всег программы умеет использовать socks-прокси.
Напишите пожалуйста мне на мыло webpixelstatic@gmail.com, очень нужна Ваша помощь
А что непонятно в статье-то? Написано проще некуда.
Еле-еле нашел эту статью. Сделай поиск, чтоли =)