Intro
When something in Proxmox networking misbehaves, small oversights in DNS, routing, or firewall rules can snowball into hard-to-diagnose issues: a node drops from the cluster, a VM loses its default route, web access is flaky, or live migration stalls. This guide gives you a practical, step-by-step approach to isolate the fault safely and fix it with confidence.
You will build a clear inventory of your versions and topology, validate core assumptions (IP addressing, bridges, bonds, VLANs, and DNS), verify the right ports are reachable, run targeted connectivity tests, and choose safe recovery paths if a change does not work. All examples are constructed scenarios you can adapt to your environment.
Version and Environment Inventory
Before changing anything, capture a minimal but complete picture of what you are troubleshooting. A short inventory prevents misaligned assumptions across the team and makes troubleshooting reproducible.
Prerequisites
- Console access to each node (local or out-of-band) in case of network loss
- Shell access as root on Proxmox nodes
- Change window or lab environment for tests
- A place to record outputs (ticket or notes)
Record versions and node identity Run on each node:
pveversion
uname -r
hostname -f
hostname -I
ip -br a
ip -br link
- Confirm the fully qualified domain name (FQDN) matches the node configuration and resolves to the management IP.
- Record kernel and Proxmox versions for context (driver behavior and firewall backends can differ across releases).
Inventory bridges, bonds, VLANs, and routes
ip -d link show
ip -br a
ip route show
grep -v '^#' /etc/network/interfaces
- Identify which physical NICs map to which bridges (for example, enp3s0 -> vmbr0), any vlan interfaces (vmbr0.100), and bond devices (bond0).
- Capture the default route and any VLAN-specific gateways.
Inventory DNS
hostname -f
getent hosts $(hostname -f)
cat /etc/hosts
cat /etc/resolv.conf || true
command -v resolvectl >/dev/null && resolvectl status || true
- Verify that the node FQDN resolves to the correct management IP and that /etc/hosts contains a consistent mapping.
Inventory firewall state
pve-firewall status || true
command -v nft >/dev/null && nft list ruleset | sed -n '1,120p' || iptables -L -n -v
ss -tulpn | sed -n '1,120p'
- Note whether the Proxmox firewall is enabled at datacenter or node scope.
- List listening sockets to cross-check expected services.
Safe Configuration Path
Networking changes can disconnect a node or partition a cluster. Use a narrow, measurable pilot and apply changes in a way you can roll back quickly.
Principles for safe changes
- Make one change at a time and measure its effect (for example, restore DNS resolution, then re-test cluster health).
- Keep a root console open while applying network changes so you can revert if SSH drops.
- Prefer ifupdown2 reloads over full restarts where available.
- Document the exact file diffs you apply under /etc/network/interfaces and any sysctl or firewall changes.
Constructed example: minimal static bridge
If your management IP should live on a Linux bridge that backs VM traffic:
auto lo
iface lo inet loopback
auto enp3s0
iface enp3s0 inet manual
auto vmbr0
iface vmbr0 inet static
address 192.168.10.20/24
gateway 192.168.10.1
bridge-ports enp3s0
bridge-stp off
bridge-fd 0
Apply safely using ifupdown2 (recommended on Proxmox):
ifreload -a
Verification right after reload:
ip -br a show dev vmbr0
ip route get 192.168.10.1
ping -c 3 192.168.10.1
ping -c 3 8.8.8.8
getent hosts $(hostname -f)
If you use VLANs, assign the IP to the VLAN subinterface, not the raw bridge. Constructed example for a management VLAN 100:
auto vmbr0
iface vmbr0 inet manual
bridge-ports enp3s0
bridge-stp off
bridge-fd 0
auto vmbr0.100
iface vmbr0.100 inet static
address 10.10.100.20/24
gateway 10.10.100.1
Again, apply via:
ifreload -a
DNS hygiene
- Ensure /etc/hosts includes your node short name and FQDN mapping to the correct management IP.
- Ensure resolvers in /etc/resolv.conf (or systemd-resolved config) are reachable from the node.
- Keep the node hostname aligned with Proxmox expectations: shortname and FQDN should both resolve to the management IP.
Verification and Diagnostics
Use targeted tests that confirm or falsify specific assumptions. Start at the local node, then expand outward.
Quick health anchors
- Can you reach the web UI locally? Try from the node:
curl -k https://127.0.0.1:8006/and look for HTML. - Is the default route correct?
ip route get 8.8.8.8should show the gateway and egress interface you expect. - Does the node resolve its own FQDN?
getent hosts $(hostname -f)should return the management IP.
Connectivity from local to local
# Web proxy (expects HTTP headers)
curl -kI https://127.0.0.1:8006/
# Console ports (spot-check)
ss -lnt | egrep ':8006|:22|:3128|:59'
# Corosync UDP port check (presence only)
ss -lun | grep 5405 || true
Connectivity from node to gateway and DNS
ping -c 3 $(ip r | awk '/default/ {print $3; exit}')
# If DNS IPs are listed in resolv.conf
awk '/^nameserver/ {print $2}' /etc/resolv.conf | while read s; do ping -c 3 "$s"; done
ARP and layer-2 sanity
arp -an | head -n 10
ethtool -S $(basename $(readlink -f /sys/class/net/vmbr0/brif/* 2>/dev/null | head -n1)) 2>/dev/null | sed -n '1,80p'
Routing and asymmetric paths
# Trace default route
traceroute -n 8.8.8.8 2>/dev/null || mtr -n --report 8.8.8.8
# Route chosen for a remote peer
ip route get <PEER_IP>
Firewall checks
pve-firewall status || true
command -v nft >/dev/null && nft list ruleset | sed -n '1,120p' || iptables -L -n -v
# Spot-test a TCP port to another node
nc -vz <OTHER_NODE_IP> 8006
Cluster visibility
pvecm status
journalctl -u corosync --since "-10m" | tail -n 80
VM dataplane checks
- Confirm the VM NIC is attached to the expected bridge and VLAN:
qm list
qm config <VMID> | egrep '^net|^name:'
- If a VLAN tag is expected on the VM port, ensure the bridge trunk is configured to allow it, and the VM NIC includes the tag, for example
net0: virtio=...,bridge=vmbr0, tag=100.
- From the node, check egress to the VM subnet gateway via the bridge subinterface (constructed example):
ping -c 3 -I vmbr0.100 10.10.100.1
- From inside the VM (with console access), validate IP, route, DNS:
ip -br a
ip route get 8.8.8.8
getent hosts $(hostname -f)
Expected results and how to read them
- curl -kI https://127.0.0.1:8006/ should return HTTP/1.1 200 or 302 with Proxmox headers.
- ip route get 8.8.8.8 should show a next hop on the intended interface (for example, via 192.168.10.1 dev vmbr0 src 192.168.10.20).
- getent hosts $(hostname -f) should map to the node management IP.
- nc -vz <OTHER_NODE_IP> 8006 should report succeeded for TCP connectivity between nodes on the web port if allowed by your security model.
Common symptoms mapped to checks:
| Symptom | Likely cause | First check |
|---|---|---|
| Web UI not reachable from LAN | Wrong IP/gateway on vmbr, firewall blocking 8006 | ip -br a; ip route get LAN gateway; nc -vz node 8006 |
| Node drops from cluster | Corosync port blocked or wrong NIC/VLAN | ss -lun | grep 5405; pvecm status; journalctl -u corosync | | VM has IP but no internet | Missing default route or wrong VLAN tag | ip route get 8.8.8.8 in VM; qm config <VMID> for tag= | | DNS resolution fails | Incorrect resolv.conf or unreachable DNS | cat /etc/resolv.conf; ping DNS IP; getent hosts name | | Migration stalls | Node-to-node TCP blocked on service ports | nc -vz other-node 8006 and relevant migration ports |
Common Proxmox-related network ports (defaults)
| Port | Proto | Purpose | Typical scope |
|---|---|---|---|
| 8006 | TCP | Web UI (pveproxy) | Admins on management LAN |
| 22 | TCP | SSH to node | Admins on management LAN |
| 5405 | UDP | Cluster traffic (corosync) | Between cluster nodes |
| 5900-5999 | TCP | VNC console to guests | Admins via node/proxy |
| 3128 | TCP | SPICE proxy | Admins via node/proxy |
Interpreting failures
- If ping to the gateway fails but link is up, check cabling, switch port VLAN, and bridge-ports mapping.
- If DNS queries to a listed nameserver time out, either the nameserver is wrong or blocked; try a different resolver inside the same subnet.
- If nc to port 8006 fails between nodes but the web UI works from your workstation, an inter-node firewall or ACL may be blocking node-to-node traffic.
Failure Modes and Recovery
Networking recovery is all about preserving a way back. The following are common failure modes and pragmatic rollbacks.
Failure: Lost SSH after editing /etc/network/interfaces
- Likely cause: Bridge IP moved to wrong interface, wrong VLAN, or bad gateway.
- Recovery:
- Switch to the open console session or out-of-band management.
- Revert the last change (keep a backup copy, for example /root/interfaces.bak).
- Apply changes with
ifreload -a. If ifreload is unavailable, tryifdown <iface>; ifup <iface>on only the affected interfaces. - Validate with
ip -br a,ip route, and ping gateway.
Failure: Node partitions from the cluster
- Likely cause: Corosync on the wrong network, blocked UDP 5405, or mismatched MTU.
- Recovery:
- Confirm link and L2 reachability between nodes on the intended NIC/VLAN:
arp -an,ping -c 3 <peer>. - Temporarily allow corosync UDP between nodes at your perimeter or node firewall for testing.
- If you moved cluster traffic to a new interface, update corosync bindnet settings using documented procedures and then restart corosync during a maintenance window.
- Validate with
pvecm statusand corosync logs.
Failure: Web UI inaccessible but SSH works
- Likely cause: pveproxy not listening, firewall rule on 8006, or certificate mismatch behind a proxy.
- Recovery:
- Check
systemctl status pveproxyandjournalctl -u pveproxy --since "-10m". - Confirm listener:
ss -lnt | grep ':8006'. - Test locally:
curl -kI https://127.0.0.1:8006/. - If local works but remote fails, inspect firewall rules and any load balancer in front.
Failure: VM no network after moving to a tagged VLAN
- Likely cause: VLAN not trunked on the host uplink or wrong tag on VM.
- Recovery:
- On the node, ensure the bridge uplink is on a trunk port and the bridge subinterface exists (for example, vmbr0.100 with an IP or as a pure trunk).
- In the VM config, confirm
tag=100on the NIC if you expect the VM to send tagged frames. - Validate at the switch side that the host port is in the right VLANs.
Failure: DNS breaks after changing resolvers
- Likely cause: New resolver unreachable or blocked.
- Recovery:
- Revert /etc/resolv.conf to a known-good resolver.
- Test with
getent hosts deb.debian.organddig @<resolver> example.com +time=1 +tries=1(if dig is installed). - If using systemd-resolved, check
resolvectl status, and set DNS per link if needed.
Last-resort recovery
- If changes cascade and you cannot restore connectivity, schedule a short reboot to reset transient L2/L3 states only after reverting config files to the last good versions. Reboots should be a final resort after confirming that the static config is correct.
Operations Checklist
Use this repeatable checklist to triage and fix networking in Proxmox.
- Establish baseline
- pveversion, uname -r recorded
- hostname -f and getent hosts match management IP
- ip -br a and ip route saved for reference
- Local service checks
- curl -kI https://127.0.0.1:8006/ returns headers
- ss -lnt shows 8006, 22 listening
- ss -lun shows UDP 5405 in use for clustering if applicable
- DNS sanity
- /etc/hosts maps short name and FQDN to the management IP
- resolv.conf or systemd-resolved points to reachable resolvers
- getent hosts example.com succeeds
- Routing and gateway
- ip route get <internet IP> shows correct next hop and interface
- ping gateway succeeds
- Inter-node and port checks
- nc -vz <other node> 8006 succeeds where allowed
- pvecm status healthy, no corosync errors in journal
- VM dataplane
- qm config <VMID> shows correct bridge and VLAN tag
- From VM, ip -br a and ip route correct; ping gateway works
- Apply changes safely
- Edit /etc/network/interfaces with a console open
- Use ifreload -a; verify before closing console
- One change at a time; re-test after each
- If anything fails
- Roll back the last change from backup
- Re-test baseline steps above
- Only proceed when the baseline is green
Conclusion
Successful Proxmox networking troubleshooting follows a simple path: capture a clear baseline of versions and topology; validate DNS, IP, routes, and bridges; confirm required ports are listening and reachable; and run precise, layered tests from the node outward and from VMs inward. Apply changes in a narrow, measurable way with a console open, and always keep a clear rollback.
With the inventories, commands, and verification steps in this guide, you can isolate most connectivity problems in minutes, not hours. Start with a small, local pilot on one node, confirm the expected results section by section, and then extend outward to the rest of your environment with confidence.