我在虚拟机中使用 Ubuntu,并从那里启动我的代码项目。这些项目在处于活动状态时可以在 下运行localhost:3000
。
现在当我在 Ubuntu 中执行时ifconfig
得到以下结果:
如果我尝试 ping 标记的地址,我会收到回复(来自 Windows)。但不知何故我无法访问http://192.168.145.129:3000在我的浏览器中,我还尝试了主机名http://ubuntu:3000。我认为这是由于我的 Windows 中的某些防火墙设置造成的。
我在公司代理后面工作。因此能够在虚拟机中浏览互联网。从我的虚拟机网络设置开始,我使用 NAT(用于共享主机 IP 地址)。
有人知道如何从 VM 访问本地主机吗?
我还检查了tcpdump -i ens33 port 3000
是否收到任何包裹,结果是收到了。
编辑 netstat -tnlp 的结果
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:63342 0.0.0.0:* LISTEN 3087/java
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:3000 0.0.0.0:* LISTEN 3378/node
tcp 0 0 127.0.0.1:3128 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:6942 0.0.0.0:* LISTEN 3087/java
tcp6 0 0 ::1:631 :::* LISTEN
答案1
从netstat
输出中您可以看到,您的服务仅正在监听localhost
!
[snip]
tcp 0 0 127.0.0.1:3000 0.0.0.0:* LISTEN 3378/node
[snip]
你永远不可能从“外部”到达那里。
解决这个问题的最佳方法肯定是依赖于服务的。例如,对于一个简单的 PHP 服务器,您可以使用php -S 0.0.0.0:3000
它来让它监听全部接口,而不仅仅是localhost
。
但是,作为一种快速的解决方法,您可以使用转发端口iptables
,例如:
iptables -t nat -I PREROUTING -p tcp -i ens33 -d 192.168.145.129 --dport 3000 -j DNAT --to-destination 127.0.0.1:3000
不要忘记使用以下命令启用到本地主机的路由:
sysctl -w net.ipv4.conf.ens33.route_localnet=1
我已经使用了ens33
(从屏幕截图来看)它是您的“外部”网络接口,如果不是,请相应地更新规则。