Parece que o nginx pode não ser a melhor ferramenta para o trabalho aqui - haproxy (se você quiser um balanceamento de carga TCP / UDP simples) ou o rsyslog (se você quiser algo um pouco mais sensível a aplicativos) pareceria melhor , e cumpriria a mesma função que o nginx atualmente é.
Examinando sua configuração, você pode até mesmo ter um liststash listener de frontend em 514, que poderia encaminhar para outra instância de logstash para processamento real. Como o logstash não faz o balanceamento de carga do AFAIK, você poderia "rotear" os eventos com base em algumas tags / tipos que você colocou no lugar.
Verificando o link , para que você tenha TCP e UDP, você precisa de algo como:
stream {
upstream logstash_servers {
server logstash-collector-01:514;
server logstash-collector-02:514;
server logstash-collector-03:514;
}
server {
listen 514;
...
}
server {
listen 514 udp;
...
}
}
Não estou completamente claro se a utilização dos logstash_servers no bloco do servidor UDP fará com que o nginx fale UDP ou TCP a eles, portanto, talvez seja necessário disponibilizá-los.
Eu duvido que o problema seja o nó nginx usando o IP "errado" como fonte ao se conectar com os back-ends do logstash - normalmente, o front-end do nginx usará o que o IP "certo" fizer que, no seu caso, significaria um endereço dentro de 172.18 / 16. Isso é semelhante ao modo como o nginx é usado ao fazer proxy reverso para localhost: nessa situação, o nginx se comunicará com o aplicativo localhost usando um IP de origem de 127.0.0.1 (ou :: 1), não o IP em que nginx viu a solicitação. .
E há também o fato de que você parece estar dizendo que tudo isso funciona para o UDP - o que tenderia a dizer que o roteamento não é um problema como esse, mas que algo em sua configuração TCP poderia ser.