使用Haproxy转发TCP到业务服务器端,后端报文看到的源 IP 地址是代理服务器的IP 。
为了让后端可以获取到用户端实际的 IP 地址,有三个方案:html
在客户端和服务器创建TCP链接以前,通常都是先http请求拿到服务器的IP和PORT。 在http请求时,使用客户端的ID或者macid,device_id,golbal_id等惟一标识映射用户的ip,存储起来,ex:redis的hash 或 zset。 这样,后端tcp服务器就能够根据惟一标识,在存储中拿到用户的ip。虽然不是最精准的,可是也是最接近真实的。git
ex:github
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协议:redis
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
里面有haproxy的Ip与用户真实IP。改造下tcp服务器,就能够拿到客户端tcp链接时的真实ip。shell
TCP 协议下,为了将客户端 IP 传给服务器,会将客户端的 IP,port 在转发时放入了自定义的 tcp option 字段。后端
https://support.huaweicloud.com/eu-west-0-usermanual-elb/zh_cn_elb_06_0001.html
TOA模块源代码地址:
https://github.com/Huawei/TCP_option_addresscentos
https://cloud.tencent.com/document/product/685/18805
TOA内核安装包地址:
(1) Centos 6.x 下载
(2) Centos 7.x 下载安全