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

如何限制Node.js WebSocket服务器仅允许localhost/127.0.0.1访问?

实现WebSocket服务器仅允许localhost/127.0.0.1访问的限制

你可以通过在upgrade事件中校验客户端的远程IP地址来实现这个限制。虽然你的HTTP服务器已经绑定到127.0.0.1,外部请求无法直接到达,但添加这一层校验能进一步强化安全,避免特殊场景下的绕过。

修改后的代码实现

const http = require('http');
const WebSocket = require('ws');

const server = http.createServer();
const wss = new WebSocket.Server({ noServer: true });
server.listen(5050, '127.0.0.1');

server.on('upgrade', function (request, socket, head) {
  // 获取发起请求的客户端IP
  const clientIp = socket.remoteAddress;
  
  // 定义允许访问的本地IP列表(覆盖IPv4和IPv6本地地址)
  const allowedLocalIps = ['127.0.0.1', '::1'];
  
  // 校验客户端IP是否在允许列表内
  if (!allowedLocalIps.includes(clientIp)) {
    // 拒绝非本地连接,返回403并关闭socket
    socket.write('HTTP/1.1 403 Forbidden\r\n\r\n');
    socket.destroy();
    return;
  }

  // IP校验通过,处理WebSocket连接升级
  wss.handleUpgrade(request, socket, head, function (ws) {
    wss.emit('connection', ws, request);
  });
});

// 可选:监听连接事件,确认本地客户端连接
wss.on('connection', (ws, request) => {
  console.log('本地客户端已成功连接');
  ws.on('message', (data) => {
    console.log('收到消息:', data.toString());
  });
});

关键细节说明

  • socket.remoteAddress:这个属性会返回客户端的真实IP地址,本地连接在IPv4环境下是127.0.0.1,IPv6环境下是::1,所以我们把这两个地址都加入允许列表。
  • 拒绝连接的处理:当检测到非本地IP时,直接向客户端发送403 Forbidden的HTTP响应,然后销毁socket,从根源上阻止WebSocket连接建立。
  • 双重保障:虽然服务器监听127.0.0.1已经限制了外部访问,但额外的IP校验可以应对一些特殊场景(比如本地代理转发、容器内的特殊网络配置等),进一步提升安全性。

内容的提问来源于stack exchange,提问作者Jaspreet Chhabra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:45:50