网络 – 透明代理到Docker网络意味着TCP被破坏

前端之家收集整理的这篇文章主要介绍了网络 – 透明代理到Docker网络意味着TCP被破坏前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我的日志记录设置是一个Docker主机,为syslog公开了UDP 514. Nginx容器的端口已发布,因此当您将日志发送到10.1.1.100时(如下图所示),它首先命中Nginx,其配置为Logstash容器的透明负载平衡是:

user root;
events {worker_connections 32768;}
stream {
 upstream logstash_servers {
  server logstash-collector-01:514;
  server logstash-collector-02:514;
  server logstash-collector-03:514;
 }
 listen 514 udp;
 proxy_pass logstash_servers;
 proxy_bind $remote_addr transparent;
 }
}

Docker_network

这很好用.但是,TCP 514(或任何TCP,就此而言)没有.即使我添加正确的侦听器和配置,我相信TCP握手没有完成,因为Nginx执行透明的负载平衡,其proxy_bind传递,例如,10.1.1.5作为源IP,例如172.18.0.4(Logstash实例).然后该实例尝试完成握手,但10.1.1.5(以及沿途的任何路由器)不知道如何路由到172.18.0.0/16的Docker网络.

这里有解决方案能够使用TCP进行日志记录吗?

最佳答案
听起来Nginx可能不是这里工作的最佳工具 – 无论是haproxy(如果你想要简单的TCP / UDP负载平衡),还是rsyslog(如果你想要一些稍微更多的应用程序感知)似乎更合适,并且会实现与Nginx目前相同的功能.

查看您的设置,您甚至可以在514上有一个前端logstash监听器,它可以转发到另一个logstash实例进行实际处理.
由于logstash不是AFAIK执行负载平衡,您可以根据您放置的某些标记/类型来“路由”事件.

检查https://www.nginx.com/resources/admin-guide/tcp-load-balancing/,为了同时拥有TCP和UDP,您需要以下内容

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;
        ...
    }
}

我不清楚在UDP服务器块中使用logstash_servers是否会导致Nginx对它们说UDP或TCP,因此您可能需要使它们都可用.

我有点怀疑在连接到logstash后端时使用’错误’IP作为源的Nginx节点问题 – 通常,你的Nginx前端将使用’正确’的IP来做这件事,在你的情况下,将意味着在172.18 / 16内的地址.
这类似于在反向代理localhost时如何使用Nginx:在这种情况下,Nginx将使用源IP为127.0.0.1(或:: 1)与localhost应用程序通信,而不是Nginx看到请求来自的IP .

还有一个事实,你似乎说这一切都适用于UDP – 这往往会说路由不是一个问题,但你的TCP设置可能是.

猜你在找的Nginx相关文章