Envoy代理后获取客户端真实ip

项目中经常会有需求获取到客户端的ip,但是项目经过envoy代理后怎么获取呢?

一般的做法是通过envoy转发时Header中带的X-Forward-For来取,但是envoy需要正确配置才能将客户端ip添加到X-Forward-For中去

经项目正确验证,envoy需要注意以下两个配置

use_remote_address: 默认值false,设置为true才能使用客户端连接的真实远程地址

skip_xff_append: 需要设为false,如果设置为true,则不会将远程地址附加到x-forwarded-for中

如图,这两个配置是跟http_filters同级

 

 

服务端获取ip,本人项目是grpc项目, 通过 ServerCallContext.RequestHeaders.Get("x-forwarded-for") 即可获取到客户端ip

 

注意!注意!!注意!!!

1. 因为envoy项目需要运行在docker容器中,如果运行在windows系统的docker容器中(DockerDesktop),这种方式获取到的ip实际上是容器的网关ip

所以一定要将envoy项目放到linux的docker容器中运行,切记切记!

2. 追加坑:envoy在linux中已swarm模式部署为service时,自动做了负载均衡,此时获取的ip是名为ingress的网络的负载服务端的ip而不是客户端ip,此问题docker官方未给出解决方案

用docker compose up方式运行是可以的

不知道windows的docker还有多少坑!

 

 

参考地址:https://www.likecs.com/show-682654.html

swarm模式issue  https://github.com/moby/moby/issues/39465

posted @ 2022-04-21 09:41  along_bro  阅读(434)  评论(0编辑  收藏  举报