在 Node.js 服务端开发中,有哪些方法可以用来获取发起请求的客户端的真实 IP 地址?请说明不同部署场景下的实现方式和注意事项。
考察说明
考查对 Node.js 获取客户端真实 IP 的常见方法及反代场景下 X-Forwarded-For 头处理的理解。
回答思路
- 【回答框架 1】直接连接时,通过 socket.remoteAddress 或 request.connection.remoteAddress 可获取客户端 IP;在 HTTP 请求对象中,req.socket.remoteAddress 是标准方式。
- 【回答框架 2】经过反向代理(如 Nginx)时,需解析 X-Forwarded-For 头,取最左侧未被信任代理追加的 IP。常见做法是读取 req.headers['x-forwarded-for'],按逗号分割取第一个非私有 IP。
- 【回答框架 3】可以使用第三方库如 request-ip 或 express-rate-limit 的 getIp 方法,内部处理多种请求头(如 X-Real-IP、X-Client-IP)和代理情况,提高健壮性。
- 【回答框架 4】需注意代理转发时可能伪造 X-Forwarded-For,应只信任来自可信代理的请求,或在应用外层(如 Nginx)配置真实客户端 IP 传递,并禁用客户端直接访问应用。
- 【回答框架 5】若应用部署在负载均衡或云服务(如阿里云 SLB、AWS ELB)后,需根据平台提供的特定头(如 X-Real-IP、X-Forwarded-For)和信任代理设置来获取真实 IP。
- 【关键点 1】直接获取用 socket.remoteAddress。
- 【关键点 2】反代后用 X-Forwarded-For 并取正确 IP。
- 【关键点 3】优先考虑使用成熟库处理多请求头。
- 【关键点 4】必须信任代理并防止伪造头。
- 【易错点 1】不校验 X-Forwarded-For 头时可能被客户端伪造 IP。
- 【易错点 2】误将代理 IP 当作真实 IP。
- 【易错点 3】依赖单一请求头而忽略平台差异。