If you followed ProxMox's wiki page Proxmox VE inside VirtualBox, you might have found yourself unable to connect to the VM, even with port-forwarding. Should that be case, this might help.
Setup
You followed the wiki and have 2 interfaces setup for your VM in virtualbox
- Host-only network interface (
vboxnet0
, or another one) - NAT interface
Why is this happening?
Proxmox does not use systemd-networkd to configure its network interfaces. Everything is in /etc/network/interfaces
.
And thus, the VM boots with an unconfigured network.
Resolution
Step 1: Find the IP address of your host-only interface on the host
On Linux, macOS and Solaris Oracle VM VirtualBox will only allow IP addresses in
192.168.56.0/21
range to be assigned to host-only adapters.
There's a good chance vboxnet0
will thus have 192.168.56.1\24
, vboxnet1
then 192.168.57.1\24
, and so on. To check, run
ip a | grep -A2 vboxnet
There are 2 VMs on mine and vboxnet1
has the proxmox VM with the IP 192.168.57.1/24
My output
3: vboxnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 192.168.56.1/24 scope global vboxnet0
valid_lft forever preferred_lft forever
inet6 fe80::800:27ff:fe00:0/64 scope link proto kernel_ll
--
10: vboxnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 0a:00:27:00:00:01 brd ff:ff:ff:ff:ff:ff
altname enx0a0027000001
inet 192.168.57.1/24 brd 192.168.57.255 scope global vboxnet1
valid_lft forever preferred_lft forever
inet6 fe80::800:27ff:fe00:1/64 scope link proto kernel_ll
--
11: vboxnet2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 0a:00:27:00:00:02 brd ff:ff:ff:ff:ff:ff
altname enx0a0027000002
12: vboxnet3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 0a:00:27:00:00:03 brd ff:ff:ff:ff:ff:ff
altname enx0a0027000003
13: vboxnet4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 0a:00:27:00:00:04 brd ff:ff:ff:ff:ff:ff
altname enx0a0027000004
As for the NAT network interface, the virtualbox doc says
The virtual machine receives its network address and configuration on the private network from a DHCP server integrated into Oracle VM VirtualBox. The IP address thus assigned to the virtual machine is usually on a completely different network than the host. As more than one card of a virtual machine can be set up to use NAT, the first card is connected to the private network 10.0.2.0, the second card to the network 10.0.3.0 and so on.
Therefore we don't need to note down a IP and subnet here.
Step 2: Note the names of the network interfaces in the VM
Linux names the interfaces dynamically, which can be a pain sometimes, so the interface names here might be different from yours!
Lists the network interfaces and their information with
ip address # Or simply `ip a`
I have:
enp0s3
as the host-only interfaceenp0s8
as the NAT interface
My output
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,DOWN,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether 08:00:27:e4:f4:50 brd ff:ff:ff:ff:ff:ff
3: enp0s8: <BROADCAST,MULTICAST,DOWN,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr0 state DOWN group default qlen 1000
link/ether 08:00:27:bc:39:f4 brd ff:ff:ff:ff:ff:ff
4: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 08:00:27:e4:f4:50 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.2/24 scope global vmbr0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fee4:f450/64 scope link
valid_lft forever preferred_lft forever
In my output you can already see the problem. vmbr0
, which is the bridge interface for VMs that Proxmox will create has 2 problems:
- It's using the wrong network interface as a slave (
enp0s8
is the NAT network interface; it's the second one) - Had it chosen the right interface (host-only interface has
enp0s3
in my setup), the IP address and subnet would've been wrong anyway!
Step 2: Update /etc/network/interfaces
Time to:
- assign a manually chosen IP address to the bridge interface (
vmbr0
)- I picked
192.168.57.2/24
- I picked
- set the bridge interface as the master of the correct interface (
enp0s3
is the host-only interface in my case) - let DHCP configure the NAT interface (
enp0s8
in my case)
IP_SUB="192.168.57.2/24"
IFACE_HOST_ONLY="enp0s3"
IFACE_NAT="enp0s8"
cd /etc/network/
cp interfaces interfaces.bak
# Write configuration
echo " # Manually edited, might be overwritten by Proxmox
auto lo
iface lo inet loopback
auto $IFACE_NAT
iface $IFACE_NAT inet dhcp
auto $IFACE_HOST_ONLY
iface $IFACE_HOST_ONLY inet manual
auto vmbr0
iface vmbr0 inet static
address $IP_SUB
bridge-ports $IFACE_HOST_ONLY
bridge-stp off
bridge-fd 0
" > interfaces
# Reload networking
ifreload -a
Step 3: test
You should now be able to access Proxmox VE from the host-only network interface using the IP address you chose. In my case that's https://192.168.57.2:8006/
Conclusion
It would be great if Proxmox used systemd-networkd
and shoved configuration files into /etc/systemd/network
.
They are much easier to read, honestly and systemd does a good job at managing stuff. It would work "auto-magically"
regardless of environment.
Hopefully this helped somebody and you didn't have to spend a few hours trying to figure this out.