Я пытаюсь использовать VirtualBox для настройки виртуальной машины Ubuntu Linux для эмуляции сервера, для которого я разрабатываю. На сервере есть три сетевых интерфейса.
На сервере есть веб-страница, размещенная ng
и экземпляр Mosquitto. Мы хотим, чтобы они были доступны из одного интерфейса, интерфейса управления, но не из двух других. Мы используем VRF для изоляции интерфейса управления.
Адаптеры VirtualBox настроены для:
- Адаптер 1 — Host-only Adapter (он предназначен для интерфейса управления). В виртуальной машине это ensp0s3 с адресом 192.168.56.104.
- Адаптер 2 - NAT. В виртуальной машине это enp0s8 с адресом 10.0.3.15.
- Адаптер 3 - NAT. В виртуальной машине это enp0s9 с адресом 10.0.4.15.
В сети, состоящей только из хоста, хост — 192.168.56.103.
В виртуальной машине мне не важна изоляция, но я сталкиваюсь с проблемой, когда не могу получить доступ к веб-странице с хост-компьютера.
Веб-страница обслуживается 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
но я вижу те же самые сбои с брокером MQTT в виртуальной машине.
Итак, если я привязан к 0.0.0.0, почему я не могу использовать «реальный» IP-адрес из браузера на хосте или curl
на виртуальной машине?