Назад | Перейти на главную страницу

Маршрутизация потока TCP Nginx на основе IP-адреса источника

Я настроил nginx как обратный прокси для потока TCP (не http). Я хотел бы применить другую маршрутизацию для определенного IP-адреса источника - можно ли это сделать и как? Мне известны рекомендации для модуля http, использующего если директива, но, похоже, это не работает для этих потоков.

Существующая конфигурация:

stream {
  server {
    listen 8000;
    proxy_pass staging;
  }
}

upstream staging {
    server 1.2.3.4:8000;
}

Желаемая конфигурация (не работает):

stream {
  server {
    listen 8000;
    proxy_pass staging1;
    if ( $remote_addr ~* 4.5.6.7 ) {
        proxy_pass staging2;
    }
  }
}

upstream staging1 {
    server 1.2.3.4:8000;
}
upstream staging2 {
    server 1.2.3.44:8000;
}

Это дает ошибку «24314 # 24314: директива if здесь не разрешена», поскольку она не применяется к модулю потока - есть ли какие-либо другие функции, позволяющие достичь аналогичного результата?

Вы можете использовать директиву map для этого поведения. Что-то вроде этого (непроверено).

upstream staging1 {
    server 1.2.3.4:8000;
}
upstream staging2 {
    server 1.2.3.44:8000;
}

map $remote_addr $upstream {
    4.5.6.7     staging2;
    default     staging1;
}

stream {
    server {
        listen 8000;
        proxy_pass $upstream;
    }
}