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

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

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

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

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

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

  • 原理:服务器直接从 TCP 连接中获取对端(客户端)的 IP 地址。
  • 代码示例
    • Java (Servlet): request.getRemoteAddr()
    • Python (Flask): request.remote_addr
    • Node.js (Express): req.ipreq.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-ForX-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-IPX-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

相关推荐

  • AIoT最优产品解决方案是什么,AIoT产品方案哪家好

    在数字化转型的浪潮中,企业面临着设备连接难、数据价值挖掘浅、系统维护成本高等痛点,构建以数据驱动、智能决策为核心的AIoT最优产品解决方案,已成为企业实现降本增效、重塑商业价值的关键路径, 该方案不仅仅是硬件与软件的简单叠加,而是通过“端-边-云-用”的一体化协同,实现从感知到认知的跨越,最终达成业务流程的自动……

    2026年3月22日
    8900
  • DediPath服务器最新测评,美国10美元/年实测数据与性能表现,DediPath服务器怎么样,美国服务器推荐

    2026 年实测证实,DediPath 美国 10 美元/年方案在基础 Web 服务与轻量级 API 场景下具备极高性价比,但受限于共享带宽与 I/O 性能,并不适合高并发或数据库密集型业务,在 2026 年云原生架构普及的背景下,针对DediPath 服务器最新测评,我们需要剥离营销话术,回归底层硬件与网络实……

    2026年5月12日
    4500
  • 美国VPS最新测评,实测数据与性能表现,美国VPS哪家好用?

    2026年美国VPS实测结论:针对国内访问,首选具备CN2 GIA或BGP多线优化线路的节点,虽然价格较普通VPS高出30%-50%,但延迟稳定在80ms以内,丢包率低于0.1%,是保障业务连续性的最优解,2026年美国VPS性能实测与核心数据解析网络延迟与丢包率实测在2026年的网络环境下,中美之间的跨境数据……

    2026年5月17日
    5000
  • ajax封装js对象的方法是什么?ajax封装对象的最佳实践

    将AJAX请求封装为JS对象,核心在于利用构造函数或类定义统一的方法接口,通过配置对象传入URL、类型、数据及回调函数,从而实现代码的复用性与维护性,在现代前端开发中,直接调用原生XMLHttpRequest或fetch API往往显得冗长且难以管理,随着项目复杂度的提升,开发者越来越倾向于将网络请求抽象为独立……

    2026年5月30日
    3500
  • Excel打印怎么缩小?Excel打印设置缩小纸张比例

    Excel打印时页面内容超出范围,最直接有效的缩小方案是调整打印比例或设置缩放至单页,同时配合页面布局优化,可确保数据完整且清晰地输出在纸张上,在日常办公场景中,我们常遇到这样的尴尬:Excel表格在屏幕上看着井井有条,一旦点击打印预览,数据却被强行切断,或者因为列数太多导致字体小到像蚂蚁,这并非打印机故障,而……

    2026年7月4日
    5110
  • AIoT营销模式有哪些?AIoT营销模式怎么做

    AIoT营销模式的核心在于实现“用户需求实时响应”与“全场景数据驱动决策”的深度融合,其本质是从传统的单向产品销售转向双向互动的服务运营,企业通过智能物联网设备获取用户行为数据,利用人工智能算法分析预测,最终在合适的场景、以合适的方式推送合适的服务,从而构建起“硬件获客、服务盈利、数据增值”的商业闭环,这种模式……

    2026年3月19日
    9400
  • AI场景相机智能场景识别是什么,手机拍照怎么自动识别场景?

    ai场景相机智能场景识别技术已成为现代影像处理领域的核心驱动力,它标志着数字成像从被动记录向主动感知的范式转变,这项技术的核心结论在于:通过深度学习算法与计算机视觉的深度融合,现代影像系统能够实时解析复杂的视觉环境,自动匹配最优的拍摄参数,从而在零人工干预的情况下实现专业级的图像质量输出,这不仅极大地降低了普通……

    2026年2月18日
    23200
  • AIoT的应用有哪些?AIoT应用场景详解

    AIoT(人工智能物联网)正在从单纯的技术概念演变为产业升级的核心驱动力,其本质是人工智能与物联网的深度融合,实现了从“万物互联”到“万物智联”的跨越,核心结论在于:AIoT的应用不再局限于设备的简单连接与数据采集,而是通过边缘计算与云端协同,赋予了物理世界自我感知、自我决策与自我优化的能力,从而在工业制造、智……

    2026年3月9日
    17200
  • ToToTel VmShell夏日芳华2026不限流量产品如何?

    ToToTel和VmShell推出的“夏日芳华2024”不限流量套餐及VPS服务,通过底层架构优化实现了高性价比的网络接入,特别适合对延迟敏感和需要稳定海外连接的开发者及跨境业务人员,在2024年的夏季,云计算与网络服务市场迎来了一波产品迭代热潮,ToToTel与VmShell联合发布的“夏日芳华2024”活动……

    2026年6月30日
    2200
  • ajax查询jsp数据库报错怎么办?jsp连接mysql数据库教程

    Ajax查询JSP数据库的核心在于利用JavaScript的XMLHttpRequest或Fetch API异步发送HTTP请求至JSP后端,JSP通过JDBC连接数据库执行SQL并返回JSON格式数据,前端解析数据后局部刷新页面,从而实现无刷新交互体验,Ajax与JSP协同工作的底层逻辑解析在传统Web开发中……

    2026年6月3日
    3600

发表回复

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