使用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 下載安全