Host Bridge for QEMU/KVM on Arch, btw

Have a server on a VM you want outside the NAT? Are you like me and havent had to do this yet but have linux experience?
Concepts

Bridge (br0) — a virtual switch on the host. The host's physical NIC plugs into it and VMs attach to it. Each machine (host, VM, phone) keeps its own IP on the same subnet.

systemd-networkd — i will be using EndevourOS but any distro with systemd will work. please note! the enp1s0 is placeholder. Your eth NIC may be different. please use ip a to find yours

Host Setup

Place these files in /etc/systemd/network/. Prefixes (10-,20-,30-) control ordering.

if dir or files do not exist, it is perfectly safe to create it :)

1) 10-br0.netdev — create bridge device

[NetDev]
Name=br0
Kind=bridge

2) 20-enp1s0.network — enslave your NIC to the bridge

[Match]
Name=enp1s0

[Network]
Bridge=br0

3) 30-br0-static.network — give the bridge an IP (static example)

[Match]
Name=br0

[Network]
Address=192.168.1.144/24
Gateway=192.168.1.1
DNS=1.1.1.1 8.8.8.8
DHCP=no

Then enable and start networkd:

sudo systemctl enable --now systemd-networkd
sudo systemctl restart systemd-networkd
If you are on Wi‑Fi, bridging may not work with many drivers. Use NAT+port-forwarding instead on laptops.
VM Setup

In Virt‑Manager, edit the VM → NIC → set Network source to Bridge and pick br0. Set model to virtio for best perf.

Static IP inside ubuntu VM (Netplan)

network:
  version: 2
  renderer: networkd
  ethernets:
    enp1s0:
      dhcp4: no
      addresses: [192.168.1.69/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [1.1.1.1, 8.8.8.8]

Apply with sudo netplan apply inside the VM.

Verify
  1. Check bridge on host:
    ip a show br0
  2. Ping router from host and VM:
    ping 192.168.1.1
  3. SSH from phone:
    ssh user@192.168.1.69
Troubleshooting

Common problems: