Я хочу поддерживать подключение к гостю на привилегированных портах, таких как порт 80, при использовании Vagrant с VirtualBox, но, похоже, это не работает. Каков наилучший вариант, как справиться с этим?
Я использую Vagrant с Virtualbox на моем Mac и у меня есть гость CentOS 7. Внутри гостя я экспериментирую с Docker, и у меня работает несколько разных контейнеров.
В моем Vagrantfile я установил минимальные правила переадресации портов, и они правильно создаются в VirtualBox vagrant.
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below,
# accessing "localhost:8080" will access port 80 on the guest machine.
# NOTE: This will enable public access to the opened port
config.vm.network "forwarded_port", guest: 8080, host: 8080
config.vm.network "forwarded_port", guest: 80, host: 8081
config.vm.network "forwarded_port", guest: 3306, host: 3306
Из Virtualbox все настроено как и ожидалось (сеть Nat, правила пересылки)
Когда я запускаю lsof
на macOS, я вижу это, которое выглядит и работает как ожидалось:
VBoxHeadl 1265 david 15u IPv4 0x54ccbd2a67321437 0t0 TCP localhost:2222 (LISTEN)
VBoxHeadl 1265 david 16u IPv4 0x54ccbd2a602a3b3f 0t0 TCP *:3306 (LISTEN)
VBoxHeadl 1265 david 17u IPv4 0x54ccbd2a672ad627 0t0 TCP *:8080 (LISTEN)
VBoxHeadl 1265 david 18u IPv4 0x54ccbd2a6539fd2f 0t0 TCP *:8081 (LISTEN)
Эта проблема
Если я пытаюсь переадресовать привилегированный порт (в данном случае:80), переадресация портов не работает. Процесс прослушивания OSX отсутствует:80.
Внутри виртуальной машины я могу видеть страницу на работающем веб-сервере, и на самом деле ничто не должно отличаться от гостевой виртуальной машины.
Руководство Virtualbox говорит, что это не должно работать?
В разделе «Руководство по виртуальным коробкам NAT» есть раздел, озаглавленный 6.3.3.Ограничения NAT
Переадресация портов хоста <1024 невозможна: на хостах на основе Unix (например, Linux, Solaris, Mac OS X) невозможно привязать порты ниже 1024 из приложений, которые не запускаются пользователем root. В результате, если вы попытаетесь настроить такую переадресацию портов, ВМ откажется запускаться.
Таким образом, возможно, это говорит о том, что это не должно работать, однако неверно, что виртуальная машина не запустится. В моем случае он работает нормально, что заставляет меня задаться вопросом, говорит ли руководство о запуске операционной системы для виртуальной машины или гостевой ОС.
Это причина того, что Virtualbox с NAT и переадресация портов не запускает прослушиватель для порта 80?
Кажется, в Vagrant появилось сообщение, которого я раньше не видел:
==> default: You are trying to forward to privileged ports (ports <= 1024). Most
==> default: operating systems restrict this to only privileged process (typically
==> default: processes running as an administrative user). This is a warning in case
==> default: the port forwarding doesn't work. If any problems occur, please try a
==> default: port higher than 1024.
Так что это, похоже, устраняет любую путаницу.
Заключение
Частная сеть или мостовая сеть являются жизнеспособными решениями, позволяющими мне использовать обычные гостевые порты, даже если они привилегированы (<1024) на хосте.
Это также устраняет необходимость настройки переадресации отдельных портов. В моем случае частная сеть кажется лучшим вариантом, поскольку она немного более безопасна, так как только мой Mac может видеть гостя.
Вот необходимая конфигурация Vagrantfile:
# Create a private network, which allows host-only access to the machine
# using a specific IP.
config.vm.network "private_network", ip: "192.168.20.20"
Это также облегчает добавление одной или нескольких записей в файл Mac /etc /hosts для гостя, обеспечивая удобство.