Хитрим со Squid в корпоративной сети

    Недавно наткнулся на одну достаточно занятную статью (http://habrahabr.ru/blogs/sysadm/28063/), в которой описывалась возможность создания кластера proxy-серверов для увеличения суммарной пропускной способности. Изначально показалось, что место данного интересного решения – в музее устаревших технологий, однако, поразмыслив, пришел к более интересным выводам.
    Дело в том, что наша контора, как и я, географически находимся в зоне с достаточно дорогим интернетом и не особо толковым в плане IT генеральным руководством. Как результат – на 500 с гаком человек приходится канал мегабита в два максимум; так что счастливым считается тот час, в который личная скорость поднимается выше отметки в 128 кбит/сек. А это более чем печально.

    К счастью, работаю я в адекватном отделе, открытом ко всему новому и, что немаловажно, так же недовольному имеющимися скоростями. Каждому сотруднику полагается компьютер и запись в Active Directory, согласно учетным данным которой центральная прокся выдает ему свой кусочек тощего инета. Как видим, это достаточно благоприятная среда для того, чтобы воспользоваться преимуществами каскадирования прокси-серверов. Не стану описывать предпринятые шаги по конфигурации squid-ов – это и так хорошо описано в вышеприведенном материале. Покажу лишь картинку, иллюстрирующую общий замысел, и немного её откомментирую:

    image

    На компы заинтересованных сотрудников отдела ставится squid, который конфигурируется на получение интернета от центрального proxy-сервера конторы с использованием соответствующих учетных данных. Делается это следующей строчкой конфигурации squid:

    cache_peer адрес прокси parent порт 0 no-query default login=юзер: пароль

    Так как в файле конфигурации хранится пароль, настоятельно рекомендуется ограничить к нему доступ.
    Далее, поднимается proxy-сервер отдела, который раскидывает поступающие запросы по проксям сотрудников, используя достаточно честный алгоритм round-robin (Round-robin — алгоритм распределения нагрузки распределённой вычислительной системы методом перебора её элементов по круговому циклу). Чтобы север знал, какие прокси ему доступны, в его конфигурацию добавляются вот такие строчки:

    cache_peer прокси сотрудника parent порт 0 no-query round-robin

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

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

    acl localhost src 127.0.0.1/32
    acl proxynet src proxy отдела
    http_access allow proxynet
    http_access allow localhost
    http_access deny all

    Для того чтобы отсечь лишних пользователей от полученного кластера, в конфигурации proxy-сервера отдела прописываются вот такие строки, реализующие базовую аутентификацию (пути верны в случае использования squid-а в системе Windows, установленного в папку по умолчанию):

    auth_param basic program c:/squid/libexec/ncsa_auth.exe c:/squid/etc/passwd
    auth_param basic children 5
    auth_param basic casesensitive off
    acl Authenticated proxy_auth REQUIRED
    http_access deny !Authenticated

    А в файле c:/squid/etc/passwd прописываются пары логин/хэш_пароля, по которым производится аутентификация.

    На этом можно было бы и закончить данную статью, если бы не один немаловажный аспект, подтолкнувший меня к её написанию. Согласно политикам домена, нам приходится периодически менять свои пароли, и, естественно, часть коллег периодически забывает синхронизировать эти изменения в файле конфигурации своего proxy, что выражается в не очень приятном симптоме, а именно: периодическом запросе аутентификационных данных у всех пользователей кластера при открытии страниц. Это очень сильно раздражает, поэтому было принято решение о написании диагностической утилиты, которая, располагаясь на машине с proxy отдела, по запросу проверяла бы доступность и корректную работу всех подшефных прокси-серверов.

    Алгоритм достаточно тривиален, однако я приведу его здесь. Метод GetPeers, получая на вход имя файла конфигурации прокси-сервера отдела, достает по нему список всех прокси-серверов:

    private static IEnumerable<String> GetPeers(string configFileName)
    {
    char[] separators = new char[]{' ', '\t'};
    List<String> strings = new List<String>();
    StreamReader reader = new StreamReader(configFileName, Encoding.Default);
    while (!reader.EndOfStream)
    {
    string st = reader.ReadLine().Trim();
    if (st.ToLower().StartsWith("cache_peer"))
    {
    string[] substrings = st.Split(separators);
    strings.Add("http://" + substrings[1] + ":" + substrings[3]);
    }
    }
    return strings;
    }

    Метод IsPeerAvaliable проверяет, в каком состоянии находится прокси-сервер с указанным URL-ом. Перечисление PeerStatus однозначно не является академически полным, как и метод определения статуса, однако его вполне достаточно для «любых практических целей»:

    private static PeerStatus IsPeerAvaliable(string peer)
    {
    WebRequest request = WebRequest.Create("http://ya.ru");
    request.Method = "GET";
    request.Proxy = new WebProxy(peer);
    request.Timeout = 5000;
    try
    {
    request.GetResponse();
    return PeerStatus.OK;
    }
    catch (WebException ex)
    {
    if (ex.Status == WebExceptionStatus.ConnectFailure)
    return PeerStatus.Offline;
    if (ex.Status == WebExceptionStatus.ProtocolError)
    return PeerStatus.AuthError;
    return PeerStatus.Error;
    }
    catch (Exception ex)
    {
    return PeerStatus.Error;
    }
    }

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

    image

    Какие выводы по этому всему можно сделать?
    • Скорость и отзывчивость интернета действительно возросла: особенно при многопоточной загрузке и открытии тяжелых страниц с кучей картинок. Так, например, скорость загрузки с 10-12 Кбайт/сек возрасла до 40-50.
    • Оптимальное количество участников кластера прокси в таком случае, видимо, следует подбирать эмпирически: вполне вероятно, что добавление N-го участника не принесет никакой пользы (эффективность подобного кластера в случае, когда в нем будет сидеть вся контора, очевидно, равна 0).
    • Особый респект в данном случае хочется выразить генеральному руководству, которое своими мудрыми решениями вынуждает сотрудников тратить их рабочее время на решение сторонних, в общем-то, вопросов.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 47

      +7
      Честно говоря, у меня некоторый когнитивный диссонанс после прочтения статьи. А почему центральный прокси не может прилично кешировать? Зачем пачка проксей? Или все упирается в ЦП центральной прокси?
        +1
        У меня тоже.

        Хорошо что у них «не особо толкове в ИТ генеральное руководство». А то бы уже уволили за такое…
          0
          Хотя скорее даже плохо, что них «не особо толковое в ИТ генеральное руководство»…
            0
            Может, арахисом платят?
          +2
          не-не! скорее всего данная конструкция позволяет обмануть шейпер. И обманывает… Получается, что все участники подключенные в данную схему сливают свою полосу в общее ведро, из которого сами же потом черпают.
          +2
          К сожалению, доступа к конфигурационному файлу центральной прокси у меня нет, поэтому всё, что излагаю далее, всего лишь догадки.

          Подозреваю, что центральный прокси базируется на принципах коммунизма и всеобщего равенства с одной стороны (1/N скорости канала каждому из N), и принципе «никому много не давать» с другой (не более X Кбайт/сек).

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

          Если я этот файл буду качать только со своего аккаунта, то упрусь в одно из ограничений: либо канал дюже нагружен и мне дадут только 1/N часть, либо он свободен, но получу я не более X Кбайт/сек.

          Если же я буду тот же файл качать при помощи вот такого кластера из M участников, то цифири будут несколько другими:
          либо M/(N+M-1) всей ширины канала, либо M*X Кбайт/сек, что в обоих случаях превышает первоначальные значения.
            +2
            Т.е. вы сделали такое извращение, чтобы как бы одновременно сидеть с кучи разных проксей. теперь понятно.

            Целесообразность сомнительна по-прежнему. Ниже писали, что просьба не кошмарить отдел, особенно если надо для работы, эффективна.
              +1
              Ага, извращение. В материале, который давал в заголовке статьи, оно самое и описано.

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

              Если бы результата не было, вряд ли я стал бы писать эту статью, верно?

              Не поверите, но мы тоже просили. В результате — получили возможность скачивать большие файлы по ночам на той же скорости.
                0
                Надо продолжать кошмарить техслужбу.

                Иногда подобные ограничения — не бешенство матки техслужбы, а вполне оправданные ограничения. Например, или так, или интернетов не будет, ибо дорого. Ясно, что без интернетов не обойтись, тогда только так. Деньги, деньги.
            +10
            Если отрезать социальные сети и порнуху, то скорость и отзывчивость интернета возрастет на порядок.
              –1
              1. Это вопрос к админам. Сейчас и так введены у нас достаточно «умные» ограничения. Например, запрет на загрузку файлов больше 10 метров.

              2. Если поотрубать всё нафиг, то рабочее время доблестных IT-сотрудников будет занято чем? Правильно! Прокидкой туннеля к домашнему компу.
                0
                За такие игры могут и уволить)
                  0
                  На основании?
                  Пусть сначала покажут бумажки, где черным по белому прописано, что вот то-то, то-то и то-то делать нельзя.

                  С другой стороны, ещё и для себя стоит ответить на вопрос, хочу ли я работать в конторе с зомби-инетом, урезанными почтовыми ящиками и посредственной з/п.
                    0
                    Нецелевое использование ЛВС, несанкционированное вмешательство в работу компьютерных систем. А будете просить бумажки — напишут в трудовой реальную причину увольнения. Прокиньте лучше опенвпн домой — шифрование всего трафика + шейперы сквида идут лесом.
                      –1
                      1. Почему нецелевое? Получаю доступ к ресурсам, связанным, между прочим, с моими рабочими обязанностями.
                      2. Почему несанкционированное? Мне доменной политикой на моем компе выданы права администратора.
                      3. «напишут в трудовой реальную причину увольнения»… ага, «читал на уроке литературы», «разговаривал на русском языке» (с)

                      А насчет опенвпн — займусь на досуге. Всё же интересно своими лапками пощупать. (:
                        0
                        /etc/openvpn/server.conf — 10 строчек, потом генерятся сертификаты.
                        на рабочую машину ставится виндовый опенвпн, тоже 10 строчек в конфиге и нужные сертификаты, сгенерированные сервером.
                          0
                          если инет проксируется сквидой, с чего вы взяли миф о доступности впн?
                            0
                            squid — кэширующий прокси-сервер для протоколов HTTP, FTP, Gopher и HTTPS.
                            openvpn можно пробросить по любому порту tcp\udp напрямую через корпоративный шлюз.
                              +1
                              только если открыт метод connect.
                                +1
                                Админы, не знающие про delay_pools в сквиде, врядли прикроют connect.
                                  0
                                  connect прикрыт в дефолтовом конфиге сквида.
                                    0
                                    На 443 порт обычно прекрасно открыт.
                          0
                          кстати, постоянно пользюсь еще более простым способом (особенно когда установить опенвпн нельзя изза ограниченной учетки). Цепляешься по ссш на свой сервак. Обычно прокатывает 443 порт. Там уже можно настроить броузер на Socks прокси localost 1080
                          +1
                          Зачем впн? чтобы потом ещё и роутинг настраивать? ssh-туннель гораздо проще, то же шифрование и прочие плюшки, только не забудтье DNS запросы в туннель завернуть. И без всяких админских прав для винды решается putty portable и если настройки браузера залочены, то и браузер тоже портабл. А вообще, на работе и правда, обычно, работать надо, а не на хабре сидеть :)
                            0
                            ага! точно так. по поводу работы тоже, кстати :)
                            –1
                            шейперы никак не идут лесом… остаются с тобой
                              0
                              Каким же образом шейперы сквида могут воздействовать на тоннель, никоим образом со сквидом не связанный? Вы точно линукс внедряете?
                                –1
                                я что-то недопонял… если вы предлагаете прокинуть опенвпн через сквид, то почему считаете, что нет возможности шейпить трафик…
                                или это вы так… в рамках наезда?
                                  0
                                  Значит я тоже недопонял. Я предлагал прокинуть на любом открытом порту.
                    –2
                    А Вы на работе работать пробовали?
                      +2
                      Пробовали, не помогает (:

                      Вы, прошу прощения за переход на личности, в какой сфере трудитесь?

                      Мне как разработчику, доступ в инет необходим. Как иначе я узнаю, например, что обновление офиса KB2251419 заваливает все VSTO-приложения-шаблоны и Microsoft признало эту проблему; или что HASP Business Studio не работает с Windows 7 (x64), или зарегистрируюсь на очередное мероприятие Autodesk, или почитаю интересующие меня аспекты в .NET Framework 4.0?
                        –5
                        Тружусь в IT, инженер по инфраструктурным решениям.

                        Если Вам нужен «расширенный» интернет, пишите служебку с обоснованием. Тратить рабочее время на что-то, отличное от прямых обязанностей — верный путь к разнообразным взысканиям, вплоть до увольнения. Вы ведь не за обеденный перерыв всё это настроили, верно? :)
                          0
                          Ага, раскусили. У нас ещё технологические перерывы есть! (:

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

                          Примеров — куча, холиваров, в том числе и на Хабре, тоже.
                            –2
                            Да нет, не скользкая. Есть должностная инструкция, в которой стоить подпись сотрудника. Все действия, которые туда не попадают, должны быть согласованы. Понятно, что ситуации бывают самые разные, но Вы, по-моему, подставляетесь. Не всегда у начальство хорошее настроение :)
                              +1
                              Верно, подставляюсь.

                              Ещё у меня стоит не прописанный в должностной инструкции PuntoSwitcher, Foobar, и (какой ужас!) я принес из дома наушники.

                              Работать же в ПОЛНОМ соответствии с должностной инструкцией я (как и любой другой человек в здравом уме) буду только в случае, если по каким-то причинам решу принять участие в итальянской забастовке.

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

                                Дело-то Ваше. Убеждать кого-то лично я не собираюсь, но если хоть один человек после нашего диалога задумается в нужном ключе, значит, я не зря распинался :)
                            +1
                            как по мне это совковый подход какой то и ничего хорошего он не дает. если сотрудник выполняет все свои обязанности и успевает сделать требуемую работу за 4 часа например вместо 8ми, то я считаю он имеет право заниматься чем угодно, что не мешает работать другим и не противоречит интересам фирмы.

                            Другое дело что если такое наблюдается постоянно то начальство должно задуматься: нужно ли несколько сотрудников или просто уволить лишних, загрузить одного и повысить ему зп.
                        0
                        странная идея с каскадом проксей. :(

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

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

                          Только задачи разные:
                          — вы рассказываете, как всё должно быть.
                          — а я описал, как через }-{опу сделать так, чтобы всё хоть как-то работало в отдельно взятом уголке вселенной на основе той ситуации, которая есть.
                          +2
                          какие продвинутые нынче юзеры пошли, прям диву даёшься…
                            0
                            если мозг пытлив… и видимо не женат
                            +1
                            ужас, даже спустя 2 года после написания статьи находятся бедные люди, которые находят применение каскаду :)
                              0
                              Жесть
                                0
                                Нужно было назвать статью: Как платить провайдеру за 10мБит интернет, а получить 100мБит.

                                Ну и соотвественно задать немного другие стартовые реалии.
                                  0
                                  OMG O_O!

                                  Автор, погуглите на тему SQUID + SAMS. :D
                                  Эта приблуда к кальмару от отечественного разработчика позволяет ограничивать канал, считать трафик и даже отключать превысивших лимит юзверей.
                                    0
                                    SAMS — просто удобная морда. Сквид сам все нужное умеет.
                                      0
                                      Ну, разумеется. Как и Linux все умеет — достаточно только скриптами обвязать. :)

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

                                  Самое читаемое