Socket.io 中如何获取客户端的 IP 地址

阅读时长 4 分钟读完

在使用 Socket.io 进行服务器与客户端通信的时候,了解客户端的 IP 地址对于定位问题及进行一些安全控制非常重要。本文将介绍如何在 Socket.io 中获取客户端的 IP 地址,希望能对前端开发者有所帮助。

Socket.io 简介

Socket.io 是一个基于 WebSocket 封装的实时双向通信库,可以在浏览器和服务器之间实现实时通信。同其他的 WebSocket 库不同,Socket.io 具有跨浏览器和跨操作系统的 API,使得浏览器和服务器之间建立通信非常容易。这里不再详细介绍 Socket.io 的基础知识。

获取客户端的 IP 地址

Socket.io 中可以通过 socket.request.connection.remoteAddress 获取客户端的 IP 地址。这个属性同时适用于 HTTP 和 WebSocket 连接。示例代码如下:

-- -------------------- ---- -------
----- --- - --------------------------------------
----- -- - --------------------------

---------------

-------- ------------ ---- -
  -- ---- ---- --
--

------------------- -------- -- -
  ---------------- ---------- ---- - - -----------------------------------------
---

在上述示例中,当有新的连接建立时,输出 New connection from xxx.xxx.xxx.xxx 的信息以标识连接的 IP 地址。

但是需要注意的是,socket.request.connection.remoteAddress 并不能保证总是能获取正确的客户端 IP 地址。因为在节点网关 (NGINX、Apache,到 Express、Koa 等后端) 的反向代理下,如果代理服务器没有将请求头 X-Forwarded-For 设置为客户端 IP 地址,可能上述方法获取到的是代理服务器的 IP 地址。如果需要在反向代理下准确获取客户端的真实IP地址,可以通过访问请求头中的 X-Forwarded-For 属性,该属性是一个包含了客户端IP地址的由逗号划分的值。我们可以通过 socket.handshake.headers['x-forwarded-for'] 获取到。 如果需要处理多级反向代理,应该去查找第一个非内部地址,例如:

-- -------------------- ---- -------
-------- ------------------- -
  --- ------ - --------------------------------------------
  -- -------- -
    ----- ---- - ------------------
    --- ---- - - -- - - ------------ ---- -
      -- -------- -- ---------------------- -
        ------ - --------
        ------
      -
    -
  - ---- -
    ------ - ----------------------------------------
  -
  ------ -------
-

-------- --------------- -
  ------ -------------------------------------------------------------------------------
-

上述实现依赖了内部 isPrivateIp 函数,用于判断是否是内部地址(10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,IPv6 中的 ::1),如果不是,直接返回该地址,否则继续查找下一个地址。

总结

本文介绍了如何在 Socket.io 中获取客户端的 IP 地址,强调了在反向代理下获取客户端的真实IP地址。希望本文内容对前端开发者有所帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645c9a69968c7c53b0f07e47

纠错
反馈