学习NodeJs之【如何获取客户端真实IP】

这篇具有很好参考价值的文章主要介绍了学习NodeJs之【如何获取客户端真实IP】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、场景

        产品想要增加一个操作日志的模块,重点记录增删改的操作ip。

二、问题描述

        这块业务其实需要按【是否代理】来分逻辑。首次开发时,并未考虑 测试生产环境有统一代理 ,导致传统的获取ip方式取到了容器网关ip。——显然这样是无法满足产品想要区分操作ip。

三、调研过程

        解决问题首先要明确一些基础内容。参考如下:

express文档:在代理后面运行Express

Express.js req.ip正在返回:: ffff:127.0.0.1

HTTP 请求头中的 X-Forwarded-For

X-Forwarded-For

3.1 什么是req.ip?

        当 trust proxy 为false时,req.ip的取值与req.connection.remoteAddress一致

        当 trust proxy 为true时,req.ip的取值与X-Forwarded-For的首个IP一致

        而 trust proxy 默认为false,因此 req.ip 默认为remoteAddress。

注意:这里引出两个概念:remoteAddress和X-Forwarded-For。

3.2 什么是remoteAddress?

        如果使用了代理,如nginx,客户端发出的请求会先通过代理,由代理转发给服务器。remoteAddress就是代理ip。

        如果不使用代理,客户端发出的请求会直接给服务器,remoteAddress就是真实ip。

3.3 什么是X-Forwarded-For?

node.js 从 tcp 中 remoteaddress 的值 ::ffff:127.0.0.1,从入坑到入土,运维,node.js,express

        同样的道理,假设真实ip为Proxy0:

        如果使用了代理,如Proxy1,那么客户端发出的请求是以Proxy0,Proxy1的过程到达服务器,X-Forwarded-For就用英文逗号+空格记录代理过程,参考上图。

        如果不使用代理,客户端发出的HTTP请求默认没有X-Forwarded-For头部,又因为不经过代理服务器,所以到达目标服务器时,依然没有X-Forwarded-For

3.4 什么是X-Real-Ip?

        X-Real-Ip的使用环境多为nginx配置,在配置中通过Set Header方法把转发前的Proxy0,也就是remoteAddress值赋给X-Real-Ip头部,避免在代理过程中丢失真实ip。

四、实践

综上内容,进行调试。我们依次在debug环境、production环境进行验证:

4.1 客户端ip不经过代理,直接访问 ✔

结论:能获取真实ip。

客户端ip:127.xx.xx.49  ===>  服务器ip:172.xx.xx.20

node.js 从 tcp 中 remoteaddress 的值 ::ffff:127.0.0.1,从入坑到入土,运维,node.js,express

 4.2 客户端ip不经过代理,访问容器 ✖

结论:不能获取真实ip。

客户端ip:127.xx.xx.49  ===>  容器ip:172.xx.xx.246(服务器ip:172.xx.xx.250)

node.js 从 tcp 中 remoteaddress 的值 ::ffff:127.0.0.1,从入坑到入土,运维,node.js,express
 4.3 客户端ip经过1次代理,访问容器 ✔

结论:能获取真实ip。

客户端ip:127.xx.xx.49  ===> 代理ip:172.xx.xx.20  ===> 容器ip:172.xx.xx.246(服务器ip:172.xx.xx.250)

node.js 从 tcp 中 remoteaddress 的值 ::ffff:127.0.0.1,从入坑到入土,运维,node.js,express

五、总结 

        以上仅为我个人的粗浅理解,实际还有伪造请求头的场景存在。

        包括这也只是web端在电脑上的ip记录,另外还有外网环境下移动端的ip记录等。

        路过还请指正。

node.js 从 tcp 中 remoteaddress 的值 ::ffff:127.0.0.1,从入坑到入土,运维,node.js,express文章来源地址https://www.toymoban.com/news/detail-773173.html

到了这里,关于学习NodeJs之【如何获取客户端真实IP】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 获取客户端真实IP的方法

    获取请求的IP很简单,可以直接使用request.getRemoteAddr()直接获取。但由于请求在转发到接口前,会经过大量的反向代理,例如流程图中,至少要经过Nginx后,请求才会转发到接口,因此需要对请求接口的IP做处理,提取客户端真实IP地址。 配置Nginx的配置文件,需要反向代理服务

    2024年02月16日
    浏览(49)
  • nginx 获取客户端真实IP

    网站接入Web应用防火墙WAF(Web Application Firewall)后,访问请求在到达源站服务器之前,需要经过WAF的代理转发。这种情况下,源站服务器可以通过解析回源请求中的X-Forwarded-For记录,获取客户端的真实IP。 WAF在将客户端的访问请求转发到下一环节的服务器时,会在HTTP的请求头

    2023年04月09日
    浏览(47)
  • nginx获取客户端真实ip

    在nginx中获取客户端真实IP的方法有多种,以下是其中两种常用的方法: 使用nginx的access_log模块记录请求日志,并在日志中包含客户端的真实IP信息。例如: 在上述配置中,通过使用http_x_forwarded_for字段来获取客户端的真实IP地址。如果该字段不存在或不合法,则使用remote_ad

    2024年02月16日
    浏览(49)
  • k8s ingress获取客户端客户端真实IP

    在Kubernetes中,获取客户端真实IP地址是一个常见需求。这是因为在负载均衡架构中,原始请求的源IP地址会被替换成负载均衡器的IP地址。 获取客户端真实IP的需求背景包括以下几点: 安全性:基于客户端IP进行访问控制和认证授权可以提高系统安全性。 日志记录与审计:记

    2024年02月13日
    浏览(56)
  • Nginx(二十) 获取真实客户端IP

            客户端在访问互联网应用服务器时,与真实的应用服务器之间会因为有多层反向代理,而导致真实应用服务器获取的仅是最近一层的反向代理服务器 IP。为使 Nginx 后端的上游服务器可以获得真实客户端 IP,Nginx 提供了 ngx_http_realip_module 模块用以实现真实客户端

    2024年01月16日
    浏览(45)
  • 获取客户端真实 IP 地址的最佳实践

    1. 业务上云带来性能收益 公司从去年全面推动业务上云,而以往 IDC 架构部署上,接入层采用典型的 4 层 LVS 多机房容灾架构,在业务高峰时期,扩容困难(受限于物理机资源和 LVS 内网网段的网络规划),且抵挡不住 HTTPS 卸载引发的高 CPU 占用。 而经过压力测试发现,使用

    2024年02月05日
    浏览(58)
  • Nginx代理后获取客户端真实IP地址

    在项目实际应用中,我们可能会需要获取到用户也就是客户端的真实IP地址,比如记录系统操作日志等情况。 通常情况下我们可以使用以下方式来获取IP地址 但是当我们使用Nginx反向代理项目地址后,使用以上方法只能获取到Nginx服务器的IP地址,并不是客户端的IP地址。 解决

    2023年04月11日
    浏览(46)
  • 【Java开发】之获取客户端真实 IP 地址

    在投票系统开发中,为了防止刷票,我们需要限制每个 IP 地址只能投票一次; 当网站受到诸如 DDoS(Distributed Denial of Service,分布式拒绝服务攻击)等攻击时,我们需要快速定位攻击者 IP; 在渗透测试过程中,经常会碰到网站有 CDN(Content Distribution Network,内容交付网络),

    2024年02月04日
    浏览(48)
  • Docker部署Nginx,无法获取客户端真实ip地址

    在部署docker版本nginx进行请求转发,意外发现nginx打印日志中的客户端ip并非为客户端的真实ip(221.237.xxx.xxx),而是docker虚拟网卡的ip(172.17.0.1) 开始猜测是nginx配置问题,对比其他环境,发现配置相同,但其他环境未出现此情况 通过查询资料,推测是docker网桥和linux防火墙存在

    2023年04月21日
    浏览(37)
  • k8s ingress 添加获取客户端真实ip配置

    本环境是一个互联网ip服务器上的nginx转发k8s集群内的ingress域名,实现所有服务通过域名访问, 默认配置下,在pod内获取客户端请求地址信息时,获取的是pod的ip和节点ip。要获取客户端ip,需要添加nginx配置中 除此之外还需要修改configmap ingress-nginx-controller ,增加如下配置

    2024年02月02日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包