You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需CloudFront CIDR在Nginx及EC2 Node.js应用中获取客户端IP

方案实现步骤

第一步:CloudFront侧配置自定义校验头

这一步是核心,用于替代CIDR白名单校验,避免客户端伪造转发头:

  • 进入CloudFront对应分发的源配置页,选择对接Nginx的源,编辑源请求策略
  • 添加自定义源请求头,例如命名为X-CloudFront-Secret,值设置为仅你知晓的高复杂度随机字符串
  • 保存配置等待CloudFront分发生效

第二步:Nginx侧配置获取真实客户端IP

编辑Nginx配置文件(通常为/etc/nginx/nginx.conf或对应站点的独立配置文件):

  • 先校验CloudFront传递的自定义秘密头,不匹配直接返回403,拦截伪造请求
  • CloudFront会将真实客户端IP放在X-Forwarded-For请求头的最左侧,后接CloudFront节点IP,直接提取最左侧值即可获得真实客户端IP

配置示例:

http {
    # 预先定义和CloudFront约定的秘密值
    set $cloudfront_secret "替换为你自己设置的随机字符串";

    server {
        listen 80;
        server_name 替换为你的站点域名;

        # 校验请求是否来自合法CloudFront
        if ($http_x_cloudfront_secret != $cloudfront_secret) {
            return 403;
        }

        # 提取真实客户端IP赋值给变量
        set $real_client_ip "";
        if ($http_x_forwarded_for ~ "^([^,]+),") {
            set $real_client_ip $1;
        }
        # 如需直接覆盖默认remote_addr变量方便日志打印可放开下一行注释
        # set $remote_addr $real_client_ip;

        # 日志配置示例,打印真实客户端IP
        access_log /var/log/nginx/access.log main;
        log_format main '$real_client_ip - $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent"';

        # 转发请求到Node.js应用的配置
        location / {
            proxy_pass http://127.0.0.1:3000; # 替换为你的Node.js服务实际地址
            proxy_set_header X-Real-IP $real_client_ip;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
        }
    }
}

配置完成后执行nginx -t校验语法合法性,校验通过后执行nginx -s reload生效。

第三步:Node.js应用获取真实客户端IP

直接读取Nginx校验后传递的X-Real-IP头即可,不要直接读取原始X-Forwarded-For避免伪造风险:

原生Node.js服务示例

const http = require('http');
const server = http.createServer((req, res) => {
    const realClientIp = req.headers['x-real-ip'];
    res.end(`Real client IP: ${realClientIp}`);
});
server.listen(3000);

Express框架示例

const express = require('express');
const app = express();
app.get('/', (req, res) => {
    const realClientIp = req.get('X-Real-IP');
    res.send(`Real client IP: ${realClientIp}`);
});
app.listen(3000);

Koa框架示例

const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
    const realClientIp = ctx.request.headers['x-real-ip'];
    ctx.body = `Real client IP: ${realClientIp}`;
});
app.listen(3000);

内容的提问来源于stack exchange,提问作者Aditya Singh Parmar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 02:54:07