Node.js 应显式监听指定内网IP(如192.168.209.121),Nginx通过proxy_pass直连该IP:端口,禁用0.0.0.0监听并配合防火墙限制流量入口。

Node.js 本身不通过 Nginx “绑定 IP”,而是由 Node.js 应用主动监听特定 IP 地址;Nginx 在多网卡场景下只作为反向代理,其作用是把收到的请求准确转发给对应 IP 上运行的 Node.js 实例。关键在于两层绑定:Node.js 进程监听指定本地 IP,Nginx 的 proxy_pass 指向该 IP + 端口,并配合系统网络配置确保可达。
Node.js 层:启动时明确指定 host 参数
不能让 Node.js 监听 0.0.0.0 或省略 host(默认等效于 0.0.0.0),否则会暴露在所有网卡上。必须显式传入目标 IP:
- Express 示例:
app.listen(3000, '192.168.209.121') - 原生 http 模块:
server.listen(3000, '192.168.209.121') - 使用 PM2 启动时加参数:
pm2 start app.js -- --host=192.168.209.121(需代码中解析 process.argv)
Nginx 层:proxy_pass 指向该内网 IP,不写 127.0.0.1
假设 Node.js 运行在内网网卡 192.168.209.121:3000,Nginx 配置应直接指向它:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- ✅ 正确:
proxy_pass http://192.168.209.121:3000; - ❌ 错误:
proxy_pass http://127.0.0.1:3000;(若 Node.js 只监听内网 IP,此请求将失败) - 避免使用域名或 localhost,防止 DNS 解析绕过真实网卡路径
系统层:确认网卡状态与路由连通性
执行以下命令验证基础连通性:
-
ip -4 addr show→ 确认 192.168.209.121 存在且状态为 UP -
ss -tlnp | grep :3000→ 查看 Node.js 是否真正在该 IP 上监听(输出中应含 192.168.209.121:3000) -
curl -v http://192.168.209.121:3000(从 Nginx 所在服务器执行)→ 测试直连是否通
安全加固:关闭非必要监听面
即使 Node.js 已限定 host,也建议叠加系统级防护:
- 禁用 Node.js 进程以外的 0.0.0.0:3000 监听(检查是否有其他服务占端口)
- 防火墙限制仅允许指定网卡接收流量,例如:
iptables -A INPUT -i eth1 -d 192.168.209.121 -p tcp --dport 3000 -j ACCEPTiptables -A INPUT -p tcp --dport 3000 -j DROP - 如 Node.js 仅供 Nginx 调用,可考虑将其监听地址设为 127.0.0.1,同时让 Nginx 和 Node.js 同机部署 —— 此时无需多网卡绑定,但牺牲了网络隔离优势

















