воскресенье, 26 апреля 2020 г.

nginx проксирование tcp/udp соединений

 nginx - это не только 10 килограммов веб серверов, но ещё и как все помним офигительный проксятник... Прилетела мне тут задачка - мониторить соединения которые стучатся на определённый tcp порт (а если понадобится, то и на udp)... Навскидку конечно можно проще простого - закрутить iptables с логированием да и делов, но вот nginx... Эта штука даёт куда больше воли в плане фантазии - к примеру редиректить соединения по условиям (скажем откуда кто пришёл, туда того и редиректить); можно прикрутить на 1 порт разнае редиректы/условия и т.д. и т.п. Но мне пока достаточно логировать соединения и в принципе на этом могу в последующем фигачить какие то графики (хочешь в модуле статистики самого nginx'a, хочешь прикручивай это дело к графане/zabbix и т.п.) и выстраивать какие то звонилки (а в некоторых случаях если угодно сразу банить козлов через прикрутку к fail2ban) в случае возникновения аномалий в работе тех или иных сервисов... Итак, собираю nginx...

sudo add-apt-repository -y ppa:nginx/development
sudo apt-get update
sudo apt-get install -y wget curl tmux unzip nginx

Далее создают конфиг для nginx'а (обычно пасутся /etc/nginx/conf.d или /etc/nginx/sites-[available/enabled])... примерно с таким содержанием (говорю же - мне пока достаточно...):

stream {

# Исключаем локальные (свои айпишники из логов)
map $remote_addr $log_ip {
"77.220.204.113" 0;
"77.220.204.114" 0;
default 1;
}


    upstream strange_web_server {
        server 10.20.20.10:8080;
    }

    upstream backup_server {
        server 10.20.20.11:22;
    }


# формат логов (если что необходимо, привинтить доп. переменные какие надо...
log_format proxy '$remote_addr [$time_local] '
                 '$protocol $status $bytes_sent $bytes_received '
                 '$session_time "$upstream_addr" '
                 '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';

    access_log /var/log/nginx/tcpproxy.log proxy if=$log_ip;
    error_log /var/log/nginx/error-tcpproxy.log;

# Собственно слушаем на определённом айпишнике, на определённом порту ну и проксируемс...
    server {
        proxy_connect_timeout 60s;
        listen 8.8.8.5:88;
        proxy_pass strange_web_server;
    }

    server {
        proxy_connect_timeout 60s;
        listen 8.8.8.5:7722;
        proxy_pass backup_server;
    }


}


За сим всё... :)

Комментариев нет:

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