You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何阻止外部访问同一服务器上Node.js服务的地址与端口?

解决Node.js服务外部访问的问题

没问题,我来帮你搞定这个安全隐患——核心目标就是把你的Node.js服务限制为仅服务器本地可访问,同时保证PHP网站能正常获取数据。下面是几个实用的方案,按推荐程度排序:

方案1:修改Node.js监听地址(最简单直接)

你的Node.js服务现在应该是监听了所有网卡地址(0.0.0.0),所以外部能通过服务器公网IP+端口访问。只需要把监听地址改成本地回环地址127.0.0.1localhost),这样只有服务器自身能访问这个服务。

修改你的Node.js启动代码:

// 原来的代码可能是这样(监听所有网卡)
// app.listen(8000, '0.0.0.0');

// 修改为仅本地监听
app.listen(8000, '127.0.0.1');
// 或者用localhost
// app.listen(8000, 'localhost');

这样外部用户访问http://xxx.xxx.xx.xx:8000会直接被拒绝,而同一服务器上的PHP可以通过http://127.0.0.1:8000正常请求数据。

方案2:用PHP做中间层(彻底隐藏Node.js端口)

如果你的前端代码是直接在浏览器里连接Node.js端口,那最好的做法是不让前端直接接触Node.js服务,而是通过PHP作为中间代理:

  1. 先按方案1把Node.js改成仅本地监听
  2. 写一个PHP接口(比如fetch-node-data.php),在里面请求本地的Node.js服务:
<?php
// 访问本地Node.js服务
$nodeResponse = file_get_contents('http://127.0.0.1:8000');
// 把数据返回给前端
header('Content-Type: application/json');
echo $nodeResponse;
?>
  1. 前端代码改成请求这个PHP接口,而不是直接连Node.js端口:
// 原来的代码
// var socket = io.connect('http://xxx.xxx.xx.xx:8000');

// 修改为请求PHP接口
fetch('/fetch-node-data.php')
  .then(response => response.json())
  .then(data => {
    console.log(data);
    // 后续处理逻辑
  });

这样前端完全看不到Node.js的地址和端口,彻底杜绝了外部用户直接访问Node.js服务的可能。

方案3:用防火墙限制端口访问(额外加固)

如果上面的方案还不够,你可以通过服务器防火墙进一步限制8000端口的访问,只允许本地IP请求:

Linux系统(用ufw防火墙):

# 允许本地访问8000端口
sudo ufw allow from 127.0.0.1 to any port 8000
# 拒绝所有外部对8000端口的访问
sudo ufw deny 8000
# 重启防火墙生效
sudo ufw reload

Linux系统(用iptables):

# 允许本地访问8000端口
sudo iptables -A INPUT -p tcp --dport 8000 -s 127.0.0.1 -j ACCEPT
# 拒绝所有其他对8000端口的访问
sudo iptables -A INPUT -p tcp --dport 8000 -j DROP
# 保存规则
sudo iptables-save > /etc/iptables/rules.v4

这个方案可以和前两个方案配合使用,双重保障安全。

方案4:反向代理(适合复杂场景)

如果你的服务器用了Nginx做Web服务器,可以配置反向代理,把Node.js服务藏在Nginx后面,只允许本地请求转发:

server {
    listen 80;
    server_name your-domain.com;

    # 仅允许本地访问Node.js的代理路径
    location /node-service {
        allow 127.0.0.1;
        deny all;
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

然后PHP可以通过http://localhost/node-service访问Node.js服务,外部用户访问这个路径会被Nginx拒绝。


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

火山引擎 最新活动