我正在尝试使用 VirtualBox 设置 Ubuntu Linux VM 来模拟我正在开发的服务器。该服务器有三个网络接口。
在服务器上,有一个由 Mosquitto 托管的网页ng
和一个实例。我们希望这些可以从一个接口(管理接口)访问,但不能从其他两个接口访问。我们使用 VRF 来隔离管理接口。
VirtualBox 适配器配置为:
- 适配器 1 - 仅主机适配器(旨在用作管理接口)。在虚拟机中,它是 ensp0s3,地址为 192.168.56.104。
- 适配器 2 - NAT。在 VM 中,它是 enp0s8,地址为 10.0.3.15。
- 适配器 3 - NAT。在 VM 中,它是 enp0s9,地址为 10.0.4.15。
在仅主机网络上,主机是 192.168.56.103。
在虚拟机中我不关心隔离,但我遇到了无法从主机访问网页的问题。
该网页由端口 4200 提供服务ng serve --host 0.0.0.0 --disable-host-check
,配置将其放在端口 4200 上。我理解 0.0.0.0 的意思是“所有地址”。
lsof
显示:
$ sudo lsof | grep :4200
ng\x20ser 30802 root 20u IPv4 330718 0t0 TCP *:4200 (LISTEN)
ng\x20ser 30802 30803 node root 20u IPv4 330718 0t0 TCP *:4200 (LISTEN)
ng\x20ser 30802 30804 node root 20u IPv4 330718 0t0 TCP *:4200 (LISTEN)
ng\x20ser 30802 30805 node root 20u IPv4 330718 0t0 TCP *:4200 (LISTEN)
ng\x20ser 30802 30806 node root 20u IPv4 330718 0t0 TCP *:4200 (LISTEN)
ng\x20ser 30802 30807 node root 20u IPv4 330718 0t0 TCP *:4200 (LISTEN)
ng\x20ser 30802 30808 node root 20u IPv4 330718 0t0 TCP *:4200 (LISTEN)
ng\x20ser 30802 30916 ng\x20ser root 20u IPv4 330718 0t0 TCP *:4200 (LISTEN)
ng\x20ser 30802 30917 ng\x20ser root 20u IPv4 330718 0t0 TCP *:4200 (LISTEN)
ng\x20ser 30802 30918 ng\x20ser root 20u IPv4 330718 0t0 TCP *:4200 (LISTEN)
ng\x20ser 30802 30919 ng\x20ser root 20u IPv4 330718 0t0 TCP *:4200 (LISTEN)
netstat
并ss
显示类似的开放绑定:
$ sudo netstat -tln | grep :4200
tcp 0 0 0.0.0.0:4200 0.0.0.0:* LISTEN
$ sudo ss -tln | grep :4200
LISTEN 0 511 0.0.0.0:4200 0.0.0.0:*
http://192.168.56.104:4200
但尝试在主机浏览器中导航时会出现“连接被拒绝”的情况。
我知道这不是网络可达性的问题,因为
- 我可以
ping
从主机访问虚拟机 - 我可以
ssh
从主机进入虚拟机 - 如果我
watch -n 1 "ifconfig enp0s3"
在虚拟机中执行此操作,我会看到每次刷新浏览器时计数器都会增加几个数据包。
在虚拟机中,curl http://0.0.0.0:4200
两者curl http://127.0.0.1:4200
都返回页面,但curl http://192.168.56.104
显示:
curl:(7)无法连接到 192.168.56.104 端口 4200:连接被拒绝
我似乎没有在虚拟机上被阻止,因为sudo ufw status
它显示“状态:不活动”并且sudo iptables-save
显示:
# Generated by iptables-save v1.8.4 on Tue Nov 29 14:13:18 2022
*filter
:INPUT ACCEPT [160:15704]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [219:23422]
-A FORWARD -m physdev --physdev-in enp0s8 --physdev-out enp0S9 -j ACCEPT
-A FORWARD -m physdev --physdev-in enp0S9 --physdev-out enp0s8 -j ACCEPT
COMMIT
# Completed on Tue Nov 29 14:13:18 2022
我可能认为这是一件奇怪的ng
事情,但我发现 VM 中的 MQTT 代理也出现了同样的故障。
那么,当绑定到 0.0.0.0 时,为什么我不能使用主机或curl
虚拟机上的浏览器中的“真实” IP 地址?