如何限制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
相关产品推荐
相关产品推荐

