使用Haproxy转发TCP到业务服务器端,后端报文看到的源 IP 地址是代理服务器的IP 。
为了让后端能够获取到用户端实际的 IP 地址,有三个方案:
1. http 请求记录标识:
在客户端和服务器建立TCP连接之前,一般都是先http请求拿到服务器的IP和PORT。 在http请求时,使用客户端的ID或者macid,device_id,golbal_id等唯一标识映射用户的ip,存储起来,ex:redis的hash 或 zset。 这样,后端tcp服务器就可以根据唯一标识,在存储中拿到用户的ip。虽然不是最精准的,但是也是最接近真实的。
2. haproxy 配置添加send-proxy:
ex:
listen tcp-frontend
bind 192.168.123.77:8577
balance roundrobin
mode tcp
option tcplog
server tcp-backend 192.168.123.60:8577 send-proxy
加了send-proxy后,第一次socket连接时,服务端会收到proxy协议:
PROXY TCP4 192.168.123.55 192.168.123.77 52505 8577
PROXY TCP6 ... .. ... ...
#PROXY TCP4/6 client_ip, proxy_ip, client_port, proxy_port