我正在嘗試使用 VirtualBox 設定 Ubuntu Linux VM 來模擬我正在開發的伺服器。伺服器有三個網路介面。
在伺服器上,有一個由 Mosquitto 託管的網頁ng
和一個 Mosquitto 實例。我們希望這些可以從一個介面(管理介面)獲得,但不能從其他兩個介面獲得。我們使用 VRF 來隔離管理介面。
VirtualBox 適配器配置為:
- 適配器 1 - 僅主機適配器(旨在作為管理介面)。在虛擬機器中,它是 ensp0s3,位址為 192.168.56.104。
- 適配器 2 - NAT。在虛擬機器中,它是 enp0s8,位址為 10.0.3.15。
- 適配器 3 - NAT。在虛擬機器中,它是 enp0s9,位址為 10.0.4.15。
在僅主機網路上,主機為 192.168.56.103。
在虛擬機器中,我不關心隔離,但我遇到了無法從主機存取網頁的問題。
該網頁由連接埠 4200 提供服務ng serve --host 0.0.0.0 --disable-host-check
,配置將其置於連接埠 4200 上。
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
事情,但我在虛擬機器中的 MQTT 代理中看到了同樣的失敗。
那麼,當綁定到 0.0.0.0 時,為什麼我不能使用主機或curl
虛擬機器上的瀏覽器中的「真實」IP 位址?