Nodejs 虚拟机设置了端口映射,跑node,宿主机通过无法访问?

Nodejs 虚拟机设置了端口映射,跑node,宿主机通过无法访问?

据说linux跑node比较好,我根据新手入门的教程配置了node在虚拟机上(CentOS),然后根据以下教程写了第一个http server:https://github.com/alsotang/node-lessons/tree/master/lesson1 执行$ node app.js 显示 app is listening at port 8888

宿主机设置端口映射,主机的8088映射到虚拟机的8888,宿主机上的浏览器访问http://localhost:8088/ 请求超时了 作为对比,我开了centos自带的httpd,监听的是虚拟机的80端口,然后映射到主机的8080 ,宿主机上访问http://localhost:8080/ 可以!

继续作为比较,我在虚拟机上分别 $ nc -C 127.0.0.1 80 $ nc -C 127.0.0.1 8888 然后GET / 两个均有应答,访问8888 正常显示hello world, 但是只有宿主机不能访问node。。。这是为什么呢? P.S. iptables已经stop了。

还有个奇怪的地方,虚拟机下$ nc -C localhost 8888 会显示Ncat: Connection refused.


5 回复

问题描述

你在一个 CentOS 的虚拟机上运行了一个 Node.js HTTP 服务器,并且将端口 8888 映射到了宿主机的 8088 端口。然而,宿主机上的浏览器无法访问这个 Node.js 服务。相反,宿主机可以成功访问 CentOS 自带的 Apache 服务。

原因分析

Node.js HTTP 服务器默认绑定到 127.0.0.1 或者 localhost,这意味着它只监听来自本机的请求。为了使外部机器(例如宿主机)能够访问该服务,你需要确保 Node.js 服务器绑定到所有网络接口(即 0.0.0.0)。

解决方案

修改你的 Node.js 应用程序,确保它绑定到 0.0.0.0。以下是修改后的示例代码:

const http = require('http');

const hostname = '0.0.0.0'; // 绑定到所有网络接口
const port = 8888;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

验证步骤

  1. 启动 Node.js 服务器: 在虚拟机中运行上述脚本。

    $ node app.js
    
  2. 检查 Node.js 服务器是否正确启动: 你应该看到输出 Server running at http://0.0.0.0:8888/

  3. 从宿主机访问: 打开浏览器,访问 http://localhost:8088/。你应该能看到 “Hello World” 的响应。

进一步排查

如果你仍然无法访问,可以尝试以下排查步骤:

  • 检查防火墙设置:尽管你提到 iptables 已经停止,但确认一下其他可能的防火墙规则。

    $ sudo firewall-cmd --list-all
    
  • 使用 netstat 检查监听端口

    $ netstat -tuln | grep 8888
    

    确认 Node.js 服务器正在监听 0.0.0.0:8888

通过这些步骤,你应该能够解决宿主机无法访问 Node.js 服务的问题。


这就很奇怪了,在Host上查看一下是不是8088端口已经被占用了:sudo lsof -i :8088

程序没问题,看样子是VMWare的设置有问题。不知道你设置好端口转发后,有没有关闭虚拟机,重启VMWare,重启虚拟机。

试试吧,看有没有luck

收集到与问题相关的一些资源:

  1. https://cnodejs.org/topic/50bf7116637ffa4155a2650c ,看作者PS
  2. http://blog.csdn.net/mby_123/article/details/48296209 ,这篇帖子,心路历程啊……
  3. 我自己做练习时,是把 防火墙关闭了的. 我在 centos6.9上 service iptables stop

根据你的描述,问题可能出在Node.js服务器只监听了本地地址,而不是所有网络接口。你需要确保Node.js服务器监听了所有的网络接口,这样宿主机才能通过端口映射访问它。

你可以修改你的app.js文件,将服务器绑定到所有网络接口,而不仅仅是localhost127.0.0.1。以下是示例代码:

const http = require('http');

const hostname = '0.0.0.0'; // 绑定到所有网络接口
const port = 8888;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

将上述代码保存为app.js,然后在虚拟机中运行:

$ node app.js

这将使Node.js服务器监听所有网络接口。现在你应该可以在宿主机上通过http://localhost:8088/访问该服务。

如果你仍然遇到问题,请检查以下几点:

  1. 确认虚拟机和宿主机之间的网络连接正常。
  2. 检查虚拟机中的防火墙设置(虽然你说iptables已停止,但确认其他防火墙规则)。
  3. 确认虚拟机中的端口映射配置正确。
回到顶部