架构 - 保持客户端IP的透明代理实现方案
2023年03月23日 14:03:31 [原创]
场景:

如上图,客户端通过反向代理或者负载均衡接入后端机器,这时候server直接通过remote_addr获取到的是反向代理或者负载均衡的IP地址,而不是客户端的真实IP地址。
解决方案:
1:通过http-x-forwarded-for
这种方式是通过在反向代理或者负载均衡器中配置http-x-forwarded-for,将客户端的真实IP地址传递给后端机器。
缺点:需要业务端配合改动,业务端需要封装IP获取方法,先从http请求头中的http-x-forwarded-for获取,对业务是侵入式的,如果是老业务中大量存在通过remote_addr获取的则改动量大,此方式不是很友好。如果是PHP则也可以通过nginx fastcgi参数修改传递给php的remote_addr,但如果是golang这些直接监听端口的场景也不适用,且这种改动不利于后期统一维护。
2:透明代理
内核模块(Transparent Proxy) + netfilter 规则 + setsockopt
优点:业务层无需任何改动,代理层或者负载均衡对业务来说完全是透明的,后端server通过remote_addr获取的即是客户端真实ip。
完整方法请联系 yixiaogo@hotmail 邮箱获取