HAProxydocker集装箱做L4负载平衡不透明

使用官方最新的HAProxy Docker容器和下面的configuration文件:

frontend logging_frontend bind *:1514 mode tcp timeout client 1m default_backend logging_backend backend logging_backend mode tcp balance roundrobin timeout connect 10s timeout server 1m server logstash-collector-01 logstash-collector-01:1514 check server logstash-collector-02 logstash-collector-02:1514 check server logstash-collector-03 logstash-collector-03:1514 check 

我得到的日志(通过nxlog发送到1514通过TCP)不存储实际的客户端IP,而是泊坞窗网关IP。 例如:

2017-03-02T15:57:41.585Z 172.18.0.1 {“EventTime”:“2017-03-01 15:25:02”,“Hostname”:“server.mycompany.net”,“Keywords”:58096435992,“事件types “:” ERROR “ ”SeverityValue“:4, ”严重性“: ”ERROR“, ”事件ID“:551, ”SOURCENAME“: ”微软Windows的SMBSERVER“, ”ProviderGuid“:”{D48CE617-33A2-4BC3 -A5C7-11AA4F29619E} “ ”版本“:1, ”任务“:551, ”OpcodeValue“:0 ”RecordNumber“:5267740, ”的ProcessID“:4 ”线程ID“:5732, ”通道“:” Microsoft- Windows-SMBServer / Security“,”Domain“:”NT AUTHORITY“,”AccountName“:”SYSTEM“,”UserID“:”S-1-5-184“,”AccountType“:”User“,”Message“ “SMB会话身份validation失败\ r \ n \ r \ n客户端名称:\\ 10.1.1.43 \ r \ n客户端地址:10.1.1.43:54118 \ r \ n用户名:\ r \ n会话ID:0xAF9FC8000015 \ r \ n状态: (0xC000006D)\ r \ n \ r \ n指导:\ r \ n \ r \ n尝试连接到使用不正确凭据的共享时应该会出现此错误。\ r \ n \ r \ n此错误并不总是表示授权有问题 ,但主要是authentication。 对于非Windows客户端更为常见。\ r \ n \ r \ n如果在NTLM中使用不正确的用户名和密码,客户端和服务器之间的LmCompatibility设置不匹配,Kerberos服务主体名称重复,Kerberos票证授权服务不正确无法访问访问权限的访客帐户“,”Opcode“:”Info“,”EventReceivedTime“:1488470262,”SourceModuleName“:”eventlog“,”SourceModuleType“:”im_msvistalog“}

请注意,报告服务器是10.2.3.95,Docker主机是10.1.38.223,并且Docker网桥接口(和本地容器子网)是172.18.0.0/16(具有172.18.0.1,logging在日志中,是网关) 。

从tcpdump(修改为显示接口): tcpdump的

  1. 外部接口eno16777728获取从10.2.3.95到主机IP 10.1.38.223的PUSH包(包含日志数据)
  2. 这得到由Docker DNAT'd从10.2.3.95到HAProxy容器(172.18.0.6)
  3. HAProxy确认PUSH(截图的最后一个数据包显示了使用10.xxx IP在外部接口上回复SNAT的答复)
  4. (图像中出现故障 – 检查时间戳) HAProxy决定在后端容器172.18.0.3中进行负载平衡
  5. (在图像中失序– 检查时间戳) Docker接口网关SNAT在其虚拟以太网接口上的数据包(为什么?)
  6. 从后端服务器到Docker网关的ACK
  7. 从后端服务器到HAProxy(?)的ACK
  8. 从后端服务器到HAProxy(?)的ACK

当我尝试使HAProxy在客户端IP上透明地使用backend中的source 0.0.0.0 usesrc clientip时,根本没有任何东西被logging。

对我来说,这个问题有两个成功的途径。 之一:

  • 如何解释loginDocker网关IP的行为?

或者更重要的是:

  • 我怎样才能得到原来的客户端IP出现在这些日志中,最好是作为客户端IP字段(在日志下面的时间戳开始)?