?

Log in

No account? Create an account
Cat-light

klink0v


Блохи в свитере деда Сергеича


Этот загадочный Eset NOD32 #3
Cat-light
klink0v

Шлю очередные лучи поноса криворуким чешским программерам из Eset. На этот раз пришлось конкретно помудохаться с обновлениями NOD-а через redirect-ы. Задача вроде и простая. Есть сервер обновлений в датацентре. Если на него пришли из локальной сети, то перенаправить клиента отдачей кода 302 на другой сервер, который находится в той же локальной сети, с целью экономии трафика и разумного использования bandwidth. Дык не тут-то было.

Обновлятор изначально на сервере запрашивает "GET /update.ver". Ну я недолго думая и прописал в своем NginX

rewrite ^ http://my.server.local$request_uri?;

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

Долго думал, ломал голову. Оказывается, апдейтер NOD-а намного кривее, чем я себе изначально представлял. И после редиректа он почему-то начинает отсчитывать папки "как будто от корня". То есть, в таком варианте, следующий запрашиваемый файл по мнению Nod updater должен иметь такой URL: "http://my.server.local/update.ver/nod2A62.nup". Понятно, что ничего похожего там просто нет. Ок, почесал репу, сделал вот так:

rewrite ^ http://my.server.local/?;

 Упс, опять облом. На этот раз редирект срабатывает, апдейтер идет в корень ("GET /") на локальный сервер, но не может найти там "update.ver". И тогда меня осенило. На локальном сервере сделал

index update.ver;

 Вот так мы победили сырость. ©

Таким образом, "глобальный" сервер в ответ на запрос "update.ver" выдаёт редирект в корень локального сервера. А локальный сервер в ответ на запрос корня выдает свой "update.ver" в качестве индексного файла. Чума! Но это ж надо так криво соорудить апдейтер. Логикой там даже и не пахнет.

Я уже давно плююсь от этого NOD-а. Но пока так и не решил что может быть лучше. Касперского просьба не предлагать. Про Symantec Endpoint Protection знаю, но пока не тестировал его в корпоративной среде. Посмотреть в его сторону что ли...


Маленький пример на NginX+GeoIP
Cat-light
klink0v

Задача следующая. Есть фирма, в ней используется корпоративный антивирус Eset NOD32. Обновление происходит по протоколу HTTP с собственного зеркала, расположенного на веб-сервере в датацентре. Фирма состоит из крупных филиалов, мелких филиалов и сотрудников, работающих удалённо. Требуется достичь следующего поведения зеркала обновлений.

  • Если IP клиента соответствует мелкому филиалу (фиксирован и заранее известен), то отдать обновления без запроса логина-пароля.
  • Если IP клиента соответствует крупному филиалу (также фиксирован и заранее известен), то выдать HTTP 302 и перенаправить на другое зеркало, расположенное в локальной сети этого филиала с целью экономии трафика.
  • Во всех остальных случаях запросить логин и пароль. Если они окажутся верными, то отдать обновления.

В NginX подобные задачи рекомендуется решать директивой "satisfy any;", но в данном случае такой трюк не проходит из-за необходимости делать редиректы. Приходится прибегать к помощи http_geo_module.

Работает он достаточно просто. В контексте http прописываем список IP адресов и вместе с ними значения переменной, которые будут присвоены в случае совпадения IP клиента со строкой в списке. По умолчанию переменная принимает значение, указанное в строке "default". В моем случае:

    geo $geo {
         default                world;
         192.168.0.0/22         internal;
         1.2.3.4/32             internal;
         192.168.14.0/24        branch;
         5.6.7.8/32             branch;
        }

Где "$geo" — имя переменной; "world" — значение этой переменной, присваиваемое когда клиент пришел "из мира", то есть не из локальных сетей; "internal" — "свои клиенты" (отдавать без пароля); "branch" — филиал с собственным зеркалом, то есть случай когда нужно делать редирект. Разумеется, все эти имена я придумал сам, они могут быть любыми.

Далее, в настройках сервера (или виртуального хоста) задаем примерно следующую конфигурацию.

server {
        listen   80;

        server_name  nod.my-company.ru nod;
        access_log  /var/log/nginx/nod.access.log;

        charset UTF-8;

        root /var/www/nod;
        autoindex  on;

        # Из "мира" только с авторизацией
        location @world {
         auth_basic "Please provide password to access updates";
         auth_basic_user_file nodpwd;
        }

        # Изнутри используем дефолтные настройки
        location @internal { }

        # Из филиала - перенаправление на внутренний сервер
        location @branch {
         rewrite ^ http://my.server.local/?;
        }

        location / {
        # Редирект в нужный именованный location
          error_page 418 = @$geo;
          return 418;
        }
}

В корневом location-е (последний в списке) анализируется переменная "$geo" и в зависимости от её значения происходит внутреннее перенаправление в один из именованных location-ов. А дальше уже можно творить всё что нам хочется, при этом поведение сервера будет определяться IP-адресом клиента.

Почему в предпоследнем location-е перенаправление идет в корень локального сервера, а не на "$request_uri", объяснил в предыдущей заметке.


Грабь награбленное?
Cat-light
klink0v

Есть у меня один товарищ. Он недавно у меня спросил: "у тебя нет случаем винды 7ки?". При этом, естественно, имелась ввиду пиратская копия. Я в ответ слегка пожурил его на тему что, мол, программисты тоже люди, тоже хотят кушать и воровать нехорошо. И даже предложил подарить ему на день рождения лицензионную винду. Тем более, что версия Home Basic, которой для домашнего использования выше крыши, стоит всего 2200 рублей (пруф). Но он отказался. И знаете чем мотивировал?

Microsoft — американская корпорация. А Америка — наш враг. В своё время госдеп_США™ приложил усилия к тому, чтобы развалить Советский Союз и низвергнуть Россию в хаос и нищету. Поэтому когда ты покупаешь продукцию пендосской компании, ты тем самым финансируешь не только безобидных трудяг-программистов, но также и терроризм вражескую страну, ибо Microsoft платит налоги в США. И госдеп™ на твои же деньги будет учинять провокации в отношении твоей родины, разваливать отечественное производство, тем самым монополизируя рынок программного обеспечения (и не только), лишать тебя свободы выбора и творить прочие гнусности. Поэтому мы принципиально не будем покупать иностранный софт, а будем его воровать.

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

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

Мы не раз, и не два спорили с ним на эту тему. Но его мотивация столь же непоколебима: "Не хочу финансировать жулика Якунина и отвратительный сервис РЖД". Типа, вот когда они перестанут там наверху всё разворовывать и обеспечат мне достойный сервис и комфорт за мои деньги, тогда и начну честно платить. А пока что принципиально зажму свои кровные. При этом, варианты "не пользоваться электричками" и "писать жалобы" он почему-то даже не рассматривает.

Вот народ, объясните мне пожалуйста кто-нибудь что это такое? Жадность? Обострённое чувство справедливости? Недальновидность? Зацикленность? Упрямство? Что? Я не понимаю.