stream做负载均衡,如何获取到真实的客户端IP
删除

请教一下,stream设置了负载均衡,后端拿不到真实CLIENT的IP,请问要如何设置header呢,我看stream好像没有类似proxy_set_header的参数


stream {
upstream web {
least_conn;
server 172.17.0.3:80 max_fails=3 fail_timeout=5s;
server 172.17.0.4:80 max_fails=3 fail_timeout=5s;
}
server {
listen 80;
proxy_pass web;
}

}


邀请回答
提问于 2020-06-28 17:52
580 次浏览
共2个回答

发表评论
  • 陶辉
    2020-07-01 15:32

    有两种办法:

    1、通过proxy_protocol协议

    这个协议是在TCP字符流的最前端,添加一串描述真实IP地址的消息。其中,1.0协议是ASCII字符串消息,如果你用tcpdump抓包,很容易看到。2.0是二进制格式,也比较容易分析。

    ngx_stream_proxy_module模块的proxy_protocol指令,就是用于设置后端连接的。当然,后端要能够处理这个协议才行。

    如果后端也是Nginx,那么可以在listen指令后,添加proxy_protocol选项,也能拿到真实IP。

    具体你可以参考我这门课《Nginx核心知识100讲》第113节课(可以免费学4节课):https://time.geekbang.org/course/detail/100020301-76735

    2、通过修改IP报文中source ip实现

    这种方法需要修改服务器上的网关,比较麻烦,副作用很大,你可以参考我这篇文章中,如何获取UDP中的真实IP地址:https://www.nginx-cn.net/article/76

    2
    回复
    举报
  • zerchin
    2020-07-02 16:01

    多谢老师的回答,这个问题已经解决了,就是使用的proxy_protocol
    架构也是老师说的nginx代理后端的nginx,所以使用proxy_protocol很方便的实现了获取client真实IP

    0
    回复
    举报
提问者

暂无个人介绍

  • 文章

  • 粉丝

  • 被赞

按Enter键发送
您已邀请位用户
版权所有©F5 Networks,Inc.保留所有权利。京ICP备16013763号-5