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

来源:6-3 使用Nginx作为反向代理时支持的协议

雨中独行

2024-04-02

老师,我的实验场景是: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转给上游服务?

写回答

1回答

酷田

2024-04-09

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

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

 proxy_set_header X-Real-IP      $remote_addr;

 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

0
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
共1条回复

Nginx体系化深度精讲 给开发和运维的刚需课程

快速精通Nginx1.17 ,体系与深度并存,轻松搞定企业级痛点问题

631 学习 · 161 问题

查看课程