请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

传输层如何把客户端的真实IP转给上游服务

老师,我的实验场景是:nginx和上游服务安装在同一台机器。
上游服务器开启socket监听端口,监听客户端发来的数据,需要获取客户端的真实IP和端口
使用了如下的配置:
stream{
upstream netty_test{
server 127.0.0.1:9001 weight=1;
server 127.0.0.1:9002 weight=2;
}
server{
listen 9999;
proxy_pass netty_test;
}
}
由于工作在第四层,无法修改HTTP协议头,把客户端ip透传给上游服务。
问题是:完成转发后,上游服务获取到远程的IP都是安装nginx机器的IP了。
请问,如何在第四层上把客户端的真实IP转给上游服务?

正在回答 回答被采纳积分+3

1回答

酷田 2024-04-09 13:26:44

默认情况下,上游获取的是代理的IP地址。如果想要上游应用可以获取到客户端的真实IP地址,需要在Nginx增加配置,增加头部信息,透传客户端真实IP给上游应用。

增加HTTP头部信息示例如下:

 proxy_set_header X-Real-IP      $remote_addr;

 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

1 回复 有任何疑惑可以回复我~
  • 提问者 雨中独行 #1
    老师,你好。我的实验场景是:服务端接收下位设备的socket连接。中间用nginx做转发。
    上游服务获取ip代码:
    Socket client = server.accept(); //接收客户端的链接
    client.getInetAddress();            //获取客户端地址
    因为不是通过HTTP协议的,所以无法设置http协议头,也就是不能用request.getHeader("x-forwarded-for")获取客户端IP.
    目前nginx用的stream,能够实现转发。现在的问题是:上游服务获取的客户端IP是Nginx机器的。
    nginx配置如下:
    stream{
        upstream netty_test{
        server 127.0.0.1:9001 weight=1;
        server 127.0.0.1:9002 weight=2;
    }
    server{
        listen 9999;
        proxy_pass netty_test;
      }
    }
    请您看看,在没有http协议的情况下,是否应该用stream,stream下该如何设置客户端IP透传给上游服务
    回复 有任何疑惑可以回复我~ 2024-04-09 22:22:57
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信