LINUX.ORG.RU
решено ФорумAdmin

nginx mirror, сложный пример конфига, зеркалирование части трафика по мак адресу.

 


0

1

Сломал уже давно голову, не могу победить, ни как.
Дано, вот такой конфиг, в таком варианте, всё что прилетает на name1, name2 будет зеркалироваться на name3.
А как сделать так, что бы зеркалировалось не всё, а только лишь например условный DC:DC:DC:DC:DC:DC на name3
Т.е. я хочу DC:DC:DC:DC:DC:DC и на name2 и на name3
Или любой другой мак-адрес.

        map $cookie_src $backend {
                default name1;
                AB:AB:AB:AB:AB:AB name2;
		DC:DC:DC:DC:DC:DC name2;
        }

upstream name1 {
                server 111.111.111.111;
}

upstream name2 {
                server 222.222.222.222;
}

upstream name3 {
                server 333.333.333.333;
}


server {
        listen 10.0.0.1:80;
        listen 35.35.35.35:8881;

        server_name name.ru;

        access_log on;
        access_log /var/log/nginx/test-access.log;
        error_log /var/log/nginx/test-error.log;

        location / {
                mirror /mirror;
                proxy_set_header Host name.name.ru;
                proxy_pass http://$backend;
        }

        location = /mirror {
               internal;
               proxy_set_header Host name.name.ru
               proxy_pass http://name3$request_uri;
        }

}



Последнее исправление: forzasakh (всего исправлений: 1)

Вроде ты тут делал похожую тему раньше?
На вид всё просто - через map надо выключать mirror в зависимости от значения заголовка. Что именно не получается?

zolden ★★★★★
()

Ты нашел как в nginx получить mac-адрес источника ? IMHO чисто средствами nginx это не сделать.

А вот iptables умеет работать с mac-адресами. Можно сделать редирект на другой порт для конкретного mac-адреса или списка мас-адресов.

vel ★★★★★
()
Ответ на: комментарий от zolden

Не получается любой мак-адрес зеркалировать, всё остальное работает.
Перенаправление трафика (мак-адреса) на другой бэкенд, работает.
Поступление трафика (мак-адрес) на дефолтный бэкенд, работает.
Если рассмотреть только вот эот кусок конфига:

        map $cookie_src $backend {
                default name1;
                AB:AB:AB:AB:AB:AB name2;
		DC:DC:DC:DC:DC:DC name2;
        }
У меня таких мак-адресов которые прилетают в заголовке оч. много, может быть допустим 100 мак-адресов.
Если я пропишу вот так:
        map $cookie_src $backend {
                default name1;
        }
То будет всё прилетать на «свой» дефолтный сервер, т.е. в моём примере на name1. Тут всё ОК!.
Далее, ели я сделаю вот так:
        map $cookie_src $backend {
                default name1;
                AB:AB:AB:AB:AB:AB name2;
        }
Тут весь трафик (мак-адреса) будут прилетать на дефолт (name1), за исключением AB:AB:AB:AB:AB:AB, он будет именно перенаправляться на name2.
В данном примере я хочу что бы AB:AB:AB:AB:AB:AB прилетал в два места, не перенаправлением разумеется, а зеркалированием.
Например AB:AB:AB:AB:AB:AB прилетает на дефолт (name1) и зеркалируется на name2 не знаю как сделать.
Не знаю как map подружить с mirror и location и так ли вообще это делается?

forzasakh
() автор топика
Ответ на: комментарий от vel

Не, это не средствами nginx, т.е. сам nginx мак-адреса не понимает да, но есть кука которая прилетает в заголовке, в ней содержится мак, по этому маку и делаю прокси. А хочу миррор, который собственно не могу реализовать.

forzasakh
() автор топика
Ответ на: комментарий от forzasakh

Дык так бы и сказал, что по кукам!

«location = /mirror» - это не опречатка ? IMHO «location /mirror» было бы логичнее...

Чисто теоретически....

Я бы добавил еще один мап

map $cookie_src $mirror_mac {
                default 0;
		DC:DC:DC:DC:DC:DC 1;
        }
в «location /mirror» попробовал использовать конструкцию типа
location /mirror {
      internal;
      if ( $mirror_mac != 1 ) {
           return 404;
      }
      proxy_set_header Host name.name.ru
      proxy_pass http://name3$request_uri;
}

vel ★★★★★
()
Ответ на: комментарий от vel

Вроде бы заработало, предварительно) На тестовом конфиге. Завтра еще раз проверю, но в любом случае спасибо! Пришлось лишиться бэкендов правда) но это не принципиально)

forzasakh
() автор топика
Ответ на: комментарий от forzasakh

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


        map $cookie_src $mirror1 {
                default off;
                AB:AB:AB:AB:AB:AB name1;
        }

        map $cookie_src $mirror2 {
                default off;
                AB:AB:AB:AB:AB:AB name2;
        }

        location / {
                mirror $mirror1;
                mirror $mirror2;
                proxy_set_header Host name.name.ru;
                proxy_pass http://$backend;
        }

zolden ★★★★★
()
Ответ на: комментарий от vel

C одним мак-адресом DC:DC:DC:DC:DC:DC всё работает

map $cookie_src $mirror_mac {
                default 0;
		DC:DC:DC:DC:DC:DC 1;
        }

location /mirror {
      internal;
      if ( $mirror_mac != 1 ) {
           return 404;
      }
      proxy_set_header Host name.name.ru
      proxy_pass http://name3$request_uri;
}

А вот как реализовать более одного мака, точнее как это расписать в location if Т.е.

map $cookie_src $mirror_mac {
                default 0;
		DC:DC:DC:DC:DC:DC 1;
                AB:AB:AB:AB:AB:AB 2;
       }
Пробовал так: не работает и разные другие варианты,
location /mirror {
      internal;
      if ( $mirror_mac != 1 ) {
           return 404;
      }
      if ( $mirror_mac != 2 ) {
           return 404;
      }
      proxy_set_header Host name.name.ru
      proxy_pass http://name3$request_uri;
}

forzasakh
() автор топика
Ответ на: комментарий от zolden

Map в nginx даёт записать только две переменные, в моём варианте это получается:
map $cookie_src $backend
в твоём:
map $cookie_src $mirror1
Соответственно переменная $backend у меня пропадает, а когда в location вместо $backend пишу адрес, то весь трафик идёт по этому адресу. Т.е. я не могу прописать вот так:

        location / {
                mirror $mirror1;
                mirror $mirror2;
                proxy_set_header Host name.name.ru;
                proxy_pass http://$backend;
        }
А могу только так:
        location / {
                mirror $mirror1;
                mirror $mirror2;
                proxy_set_header Host name.name.ru;
                proxy_pass http://222.222.222.222;
        }
Т.е. в конечном итоге у меня получается, что зеркалируется ВСЁ, нет разделения на $mirror1 и $mirror2 Так получилось у меня с этим примером... Это разумеется не упрёк как может показаться) Я просто хочу разобраться =) А оно не работает...

forzasakh
() автор топика
Ответ на: комментарий от forzasakh

Map в nginx даёт записать только две переменные

Ээ...не уверен что понял.
map выставляет значение одной переменной в зависимости от другой или других.
Если тебе нужно с backend что-то ещё сделать, то сделай.

zolden ★★★★★
()
Ответ на: комментарий от vel

Тупил немножко =) Всё заработало так как надо, вот таким образом:

map $cookie_src $mirror_mac {
#                default 0;
		DC:DC:DC:DC:DC:DC 1;
		AB:AB:AB:AB:AB:AB 1;
		FD:DF:DF:DF:DF:DF 1;
        }
....

        location / {
                mirror /mirror;
                proxy_set_header Host name.name.ru;
                proxy_pass http://37.37.37.37;

        location /mirror {
                internal;
                if ( $mirror_mac != 1 ) {
                      return 404;
                }
        proxy_set_header Host name.name.ru
        proxy_pass http://name3$request_uri;
}
Хоть default в самом начале и закомментирован, всё раво всё льётся по умолчанию на вот это: proxy_pass http://37.37.37.37;
Далее из всего трафика, из куки выхватываю те маки которые мне нужны, присваиваю 1 и благополучно всё зеркалируется вот сюда: proxy_pass http://name3$request_uri;

forzasakh
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.