nginx反向代{过}{滤}理的应用服务器如何获取ip?(已解决)
本帖最后由 ppgjx 于 2024-7-5 11:59 编辑客户端和nginx建立tcp链接->nginx和应用服务器建立链接
我的需求是应用服务器拿到客户端和nginx建立tcp链接的那个ip
1.在socket层面,应用服务器只能拿到和nginx建立tcp的ip
2.在http层面
假设反向代{过}{滤}理配置如
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
应用服务器如果通过解析http请求的header去获取ip确实可以,但如果客户端发送http请求是可以设置header头的,也就是可以伪造的,客户端把这些header改成了其他的ip,应用服务器获取的也是错误的ip
按照我的理解如果使用nginx反向代{过}{滤}理的情况下,应用服务器是无法拿到客户端的真实ip的,因为本身应用服务器不和客户端直接进行tcp链接,只能通过nginx提供的http信息来获取,但是http是可以伪造的,结论是应用服务器确保获取的ip是客户端的真实ip(不考虑代{过}{滤}理的情况下),有什么其他办法吗?还是说我理解错误了?请大佬们指教
按你的需求就是客户端请求的ip为准,不要考虑http头的IP信息。 Hmily 发表于 2024-7-5 11:48
按你的需求就是客户端请求的ip为准,不要考虑http头的IP信息。
是的,应用服务器做ip限制也应该是根据客户端请求的ip来限制,通过header传递的ip并不可靠,可以伪造 问题已解决,解决方案是,nginx反向代{过}{滤}理设置
proxy_set_header X-Real-IP $remote_addr;
$remote_addr变量是nginx通过tcp链接获取的ip,而proxy_set_header X-Real-IP 会覆盖原来的http请求header,从而不会出现伪造的情况,应用服务器只需要获取request.getHeader("X-Real-IP")就可以获取到客户端真实的请求ip
页:
[1]