Nobody about something

Настройка ziproxy на нескольких IP

Написано 1 сентября 2008 в 15:55 - Рубрики: *nix

Недавно встала нетривиальная задача.

Есть ziproxy. Есть сервер с несколькими IP. Ziproxy умеет слушать либо все IP, либо один избранный. В интернет при этом ziproxy ходит либо с основного IP на интерфейсе, либо со всех, указанных в настройках, но по очереди.

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

Насколько я знаю, из прокси серверов так можно настроить squid и, вроде бы, 3proxy.

Но, во-первых, сквид – это нечто монстроподобное (я его боюсь :) ), а во-вторых, необходимо было всё-таки постараться сделать это через ziproxy.

Решение было найдено. Можно просто запустить несколько демонов ziproxy, каждый со совоим конфигом. Что, собственно, и было проделано. Результат оказался удачным.

Но меня посетила мысль, а нельзя ли как-то это автоматизировать. То есть написать скрипт на шелле (в каком-то роде инсталлятор), который сделает нужные конфиги, произведёт необходимые правки и всё это дело запустит. Для запуска демонов я планировал использовать существующие rc.d скрипты, сделав несколько их копий просто, и один “мастер-скрипт” (как я в первый раз вручную и сделал). Но как выяснилось, на linux системах этого не получится сделать. Пришлось также написать свой rc.d скрипт.

Сразу прошу сильно за этот скрипт не бить. Я в нём по старой привычке сделал обработку всех возможных внештатных ситуаций. (защита от дурака), поэтом скрипт получился немного запутанный.

Вообщем, понеслась моча по трубам.

Стартовый скрипт я разбирать не буду. Там нету ничего интересного (разве, что учащимся скриптописанию на шелле он будет интересен. Но те его могут скачать и почитать)

  1. Установка. Установка в зависимости от системы:
    FreeBSD

    cd /usr/ports/www/ziproxy
    make install clean

    В линуксах в зависимости от дистра

    apt-get install ziproxy
    urpmi ziproxy
    yum install ziproxy

    и т.д.
    В Ubuntu, кстати, в репозиториях нету. Не знаю, если вообще ziproxy в дебиановских репозиториях. На крайняк собрать из исходников

  2. Далее идёт первичная настройка. Ищем конфиг и проводим первичную настройку. Обычно она ограничивается настройкой аутентификации и сжатия. За первое отвечает опция

    PasswdFile="имя_файла"

    Внутри указанного файла хранятся пары

    логин:пароль

    Пароль хранится в нешифрованном виде.

    За сжатие отвечают опции вида Process_ТИП. Картинки я сжимать не рекомендую. А рекомендую сжимать различные файлы стилей, яваскрипты и т.п. Вообщем вот такие опции:

     ProcessHTML_CSS = true
     ProcessHTML_JS = true
     ProcessHTML_tags = true
     ProcessHTML_text = true
     ProcessHTML_PRE = true
     ProcessHTML_NoComments = true

    Настраивать IP и тому подобное нельзя. Иначе мой конфигуратор может обломится :) Он расчитан на дефолтные значения этих опций.

  3. Собственно, настройка в нужном режиме. Для этого я написал небольшой скриптик. Далее его текст с комментариями. До запуска скрипта необходимо в той же директории, где и скрипт, создать файл с именем 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

  4. Запускаем. В моём случае это /usr/local/etc/rc.d/ziproxy_all start. Для остановки вместо start юзать stop

Данный конфигуратор и стартовый скрипт должны работать как во BSD системах, так и в Linux.

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

Если необходимо изменить какие-либо опции в конфиге ziproxy, то меняем их в шаблоне, и заново запускаем скрипт. Необходимо изменить IP – меняем список IP в файле iplist и перезапускаем скрипт. Всё очень просто :)

Критика и предложения принимаются.

Комментарии (5) на запись “Настройка ziproxy на нескольких IP”

  1. Sergey Klimov пишет 1 сентября 2008 в 22:29

    Вообще проще всего сделать подобную вещь с соксами, делается аналогично описанному запускается несколько socks5 по одному на каждый IP.
    ИМХО, конечно, так заморачиваться не стоит, /etc/rc.local нас спасет :)

  2. tuupic пишет 1 сентября 2008 в 22:42

    Ну мне было нечего делать и я решил сделать всё правильно, со стартовым скриптом. Этот скрипт потом, если что можно и в мониторинг запихать. Причём руками почти ничего делать не надо. В этом и смысл – всё на автомате :)
    socks5 я ещё, чувствую, буду так же ставить. Но ziproxy и socks – разные прокси для разных целей: socks не умеет сжимать, не всег программы умеет использовать socks-прокси.

  3. ronalex пишет 10 ноября 2008 в 23:53

    Напишите пожалуйста мне на мыло webpixelstatic@gmail.com, очень нужна Ваша помощь

  4. tuupic пишет 11 ноября 2008 в 1:44

    А что непонятно в статье-то? Написано проще некуда.

  5. vadim s. sabinich пишет 3 марта 2009 в 12:50

    Еле-еле нашел эту статью. Сделай поиск, чтоли =)

Оставить комментарий