如何获取客户端IP?服务器获取客户端ip的方式

在 Web 开发中,服务器获取客户端真实 IP 地址是一个常见但容易出错的需求,由于网络架构的复杂性(如反向代理、负载均衡、NAT 等),直接获取 IP 并不总是直接的。

以下是几种主要的方式、原理、优缺点及最佳实践:

泰拉瑞亚如何流畅的使用IP地址进行联机
加载中
泰拉瑞亚如何流畅的使用IP地址进行联机

直接获取连接 IP(最基础方式)

这是最原始的方式,适用于没有反向代理或负载均衡的简单架构。

  • 原理:服务器直接从 TCP 连接中获取对端(客户端)的 IP 地址。
  • 代码示例:
    • Java (Servlet): request.getRemoteAddr()
    • Python (Flask): request.remote_addr
    • Node.js (Express): req.ip 或 req.connection.remoteAddress
    • Go: req.RemoteAddr
  • 优点:简单、直接、性能高。
  • 缺点:
    • 如果客户端位于 NAT(网络地址转换)后面(如家庭宽带、公司内网),获取到的是网关出口 IP,而非用户真实 IP。
    • 如果前面有 Nginx、HAProxy、Cloudflare 等反向代理,获取到的是代理服务器的 IP,而非最终用户的 IP。

通过 HTTP 头信息获取(常见于代理场景)

当请求经过反向代理(如 Nginx、Apache、CDN、云厂商负载均衡)时,代理服务器通常会将原始客户端 IP 附加在 HTTP 请求头中。

常用 Header 字段:

如何获取客户端IP?服务器获取客户端ip的方式

Header 名称 说明 安全性/可靠性
X-Forwarded-For (XFF) 最常用,格式:client, proxy1, proxy2,第一个 IP 通常是原始客户端 IP。 ⚠️ 不可信:客户端可伪造此头。
X-Real-IP Nginx 常用,通常只包含一个 IP 值。 ⚠️ 不可信:客户端可伪造。
CF-Connecting-IP Cloudflare 专用。 ✅ 可信:由 Cloudflare 设置,客户端无法伪造。
True-Client-IP Akamai 等 CDN 使用。 ✅ 可信:由 CDN 设置。
X-Forwarded-Proto 记录原始协议(http/https),非 IP,但常配合使用。

获取逻辑(伪代码):

def get_client_ip(request):
    # 1. 优先检查可信 CDN 提供的专用头
    if request.headers.get('CF-Connecting-IP'):
        return request.headers['CF-Connecting-IP']
    # 2. 检查 X-Forwarded-For
    xff = request.headers.get('X-Forwarded-For')
    if xff:
        # XFF 格式: "client, proxy1, proxy2"
        # 取第一个 IP
        return xff.split(',')[0].strip()
    # 3. 检查 X-Real-IP
    if request.headers.get('X-Real-IP'):
        return request.headers['X-Real-IP']
    # 4. 降级到直接连接 IP
    return request.remote_addr

⚠️ 重要安全警告:

  • X-Forwarded-For 和 X-Real-IP 可以被客户端伪造!
    • 如果用户手动修改 HTTP 请求头,可以设置 X-Forwarded-For: 127.0.0.1 来欺骗服务器。
    • 解决方案:在反向代理(如 Nginx)中配置,只信任内部代理服务器传来的 XFF 头,丢弃来自外部客户端的伪造头。

通过反向代理配置(Nginx 示例)

为了正确传递真实 IP,必须在反向代理层进行配置。

Nginx 配置示例:

如何获取客户端IP?服务器获取客户端ip的方式

server {
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://backend_server;
        # 传递真实 IP 给后端
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;       # 将客户端 IP 放入 X-Real-IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 追加 IP 到 XFF
    }
}

后端信任代理配置(关键!):

后端应用需要知道哪些 IP 是“可信代理”,否则可能被伪造攻击。

  • Nginx + Gunicorn: 使用 gunicorn 的 --forwarded-allow-ips 参数。
  • Node.js (Express): 设置 trust proxy。
    app.set('trust proxy', true); // 或指定具体 IP 列表
  • Java (Spring Boot): 在 application.yml 中配置。
    server:
    tomcat:
      remoteip:
        remote-ip-header: x-forwarded-for
        protocol-header: x-forwarded-proto

使用云厂商或 CDN 提供的专用 API/Header

如果使用 AWS ALB、Cloudflare、简米云 SLB 等云服务,它们通常会提供不可伪造的 IP 信息。

如何获取客户端IP?服务器获取客户端ip的方式

服务商 推荐 Header 说明
Cloudflare CF-Connecting-IP 最可靠,客户端无法伪造。
AWS ALB X-Forwarded-For AWS 保证不会由客户端伪造。
简米云 SLB X-Forwarded-For 简米云保证可信。
Azure X-Forwarded-For 在 App Service 中需配置 X-Forwarded-For 支持。

✅ 最佳实践:优先使用云服务商提供的专用 Header(如 CF-Connecting-IP),其次才是通用的 X-Forwarded-For。


总结与最佳实践建议

场景 推荐方式 注意事项
无代理直连 request.getRemoteAddr() 简单直接。
自建 Nginx 代理 读取 X-Real-IP 或 X-Forwarded-For 必须在 Nginx 中配置 proxy_set_header,并在后端信任代理 IP。
使用 Cloudflare 读取 CF-Connecting-IP 最安全,无需担心伪造。
使用 AWS/Azure/简米云 读取 X-Forwarded-For 云厂商保证该头可信。
高安全要求 结合 IP 白名单 + 日志审计 不要仅依赖 IP 做权限控制,应结合其他认证机制。

🛡️ 安全建议

  1. 永远不要完全信任 X-Forwarded-For:除非你确认请求来自可信的代理服务器。
  2. 配置信任代理列表:在后端框架中明确指定哪些 IP 是“可信代理”,这样框架会自动忽略来自非代理 IP 的伪造 XFF 头。
  3. 日志记录:记录原始连接 IP 和解析后的用户 IP,便于审计和故障排查。
  4. 防刷策略:如果用于频率限制(Rate Limiting),建议使用 X-Forwarded-For 的第一个 IP,但需确保代理层已正确清理伪造头。

通过以上方式,你可以准确、安全地获取客户端真实 IP。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/487174.html

赞 (0)
jquery百度cdn在哪里,jquery引用百度cdn
上一篇 2026年7月12日 13:58
火数云618云服务器21元起值得买吗,200G高防服务器哪家稳定
下一篇 2026年7月12日 14:01

相关推荐

  • 以太网适配器dns服务器怎么改?,在哪里设置

    修改以太网适配器的DNS服务器,最直接的办法是在Windows的“网络连接”设置中,找到对应网卡的“Internet协议版本4(TCP/IPv4)”属性,手动填入首选和备用DNS地址,这个操作通常能在一分钟内完成,是解决网络卡顿和域名解析错误的首选方案,很多朋友遇到网页打不开、游戏延迟高的问题,第一反应是重启路……

    2026年8月26日
    1100
  • Win7应用程序服务器错误怎么解决,是什么原因?

    win7应用程序服务器错误,绝大多数情况下是系统服务未启动、.NET环境损坏或权限配置不当造成的,按顺序排查这三方面,几分钟内就能定位问题,win7应用程序服务器错误怎么解决——先分清报错场景处理这类报错,第一步不是急着改配置,而是搞清楚错误出现在什么场景下,不同场景对应完全不同的排查路径,开发调试场景里,最常……

    2026年8月28日
    800
  • 为什么CF一开游戏就连接服务器失败,连接服务器失败怎么解决?

    CF一开游戏就连接服务器失败,核心原因在于网络波动、服务器状态、游戏文件损坏或本地配置冲突,按顺序排查即可解决,cf一开游戏就连接服务器失败原因分析很多玩家反馈游戏刚启动就弹出连接服务器失败的提示,连登录界面都进不去,这种情况通常不是单方面导致的,下面从网络、服务器、本地三个层面拆解,网络层面:波动与丢包连接失……

    2026年8月14日
    1700
  • 构建数据仓库的目的是什么?数据仓库的核心价值有哪些

    构建数据仓库的核心目的是打破数据孤岛,将分散、杂乱的原始数据转化为统一、可信、可复用的资产,从而支持高效的经营决策与业务创新,想象一下,你的企业就像一家大型连锁超市,收银台、仓库、会员系统、物流车辆,每一处都在产生数据,如果这些账本各自为政,财务想知道昨天的总营收得去查收银系统,运营想知道库存周转得去翻仓库记录……

    程序编程 2026年5月27日
    3800
  • Excel单元格内容如何交换?excel表格两列数据互换方法

    在 Excel 中,“单元交换”通常指的是交换两个单元格(或单元格区域)中的数据,由于 Excel 没有直接的“交换按钮”,我们可以通过以下几种高效的方法来实现:使用“拖动+Shift键”(最快捷,适合单个单元格)这是最简单、最常用的方法,无需任何公式或宏,选中要交换的第一个单元格(A1),将鼠标移动到该单元格……

    2026年7月12日
    20200
  • 如何判断DHCP服务器是手动设置的?,DHCP怎么设置?

    通过查看DHCP服务器上的租约记录、保留列表以及地址池配置,就能准确判断出哪些IP地址是手动指定的,手动设置通常对应保留或静态绑定,租约状态会显示为“保留”或“非动态”,dhcp手动设置怎么看:从租约记录入手手动分配的IP地址在DHCP服务器上往往留下特殊标记,最直接的办法就是打开服务器的租约浏览窗口,观察每个……

    2026年8月19日
    1300
  • 查ip怎么看一个服务器的好坏

    判断服务器好坏的核心在于解析IP背后的网络质量、硬件配置与机房信誉,而不是只看IP本身,通过IP测延迟、查路由、验丢包、看归属地,再结合实际使用场景,你就能快速识别一台服务器是“真香”还是“踩坑”,查IP怎么看一个服务器的好坏:先看延迟和丢包率延迟和丢包是衡量服务器网络质量的硬指标,无论你买的是香港服务器还是美……

    2026年8月26日
    600
  • ASP.NET Calendar函数如何使用 | 控件日期选择操作教程

    在ASP.NET中,Calendar控件是System.Web.UI.WebControls命名空间提供的强大工具,用于在Web页面中实现日期选择功能,其核心价值在于无需依赖第三方库即可生成交互式日历界面,并支持日期选择、范围限制、自定义样式及服务器端事件处理,基础应用与核心属性控件声明在.aspx页面添加以下……

    2026年2月12日
    11430
  • 广州语音合成哪家好?广州语音合成软件哪个好用

    2026年广州语音合成技术已全面迈入超拟真与情感计算时代,选择本地化服务商能将方言适配度提升至98%以上,并大幅降低延迟与定制成本,2026广州语音合成技术演进与核心价值行业现状与权威数据洞察根据中国人工智能产业发展联盟2026年最新发布的《智能语音技术白皮书》显示,粤港澳大湾区语音合成市场规模已突破80亿元……

    2026年4月26日
    5100
  • ASP.NET单个数据库如何高效管理?|配置技巧与优化教程

    在ASP.NET应用程序开发中,采用单一数据库架构是一种经典且高效的策略,它意味着整个应用的所有数据操作——用户信息、业务逻辑、配置设置、日志记录等——都集中存储和管理在一个关系型数据库管理系统(如SQL Server, MySQL, PostgreSQL)中,这种模式的核心优势在于其结构清晰、管理集中、事务一……

    程序编程 2026年2月13日
    12030

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注