← Back to armoredgate.com  ·  Products  ·  Pricing  ·  Blog

Networking

How workloads get an address, reach each other, and expose ports.

No daemon, no docker0. Volt attaches each workload to a Linux bridge and programs nftables directly — the same primitives your kernel and firewall already use.

The bridge

On first run Volt creates a bridge, voltbr0, with a private subnet (default 10.10.0.0/16). Every container or VM gets a veth/tap interface on that bridge and a private address; outbound traffic is NAT-masqueraded to the host's default route.

# Inspect the bridge and attached interfaces
ip -br addr show voltbr0
bridge link

Publishing a port

Nothing is reachable from outside the host until you publish it. Map a host port to a workload port with -p host:container:

# Expose the container's :80 on the host's :8080
volt run --name web -p 8080:80 nginx

# Bind to a specific host address / protocol
volt run --name api -p 127.0.0.1:9000:9000 -p udp:5353:53 my-api

Each mapping becomes an nftables DNAT rule in Volt's own table — it does not touch your other firewall rules.

Workload-to-workload

Workloads on voltbr0 share an L2 segment and can reach each other by private IP with no extra flags. Find an address with:

volt inspect web --format '{{.Network.IP}}'

Tip: Put related services on the same host and address them by their bridge IPs, or publish only the front door and keep back-ends unexposed.

DNS

Workloads resolve names using the host's resolver by default (the host /etc/resolv.conf is projected in). Override per workload:

volt run --dns 1.1.1.1 --dns 9.9.9.9 --name app my-image

Host networking

For workloads that must share the host's network namespace (no isolation, no NAT), use host networking. The workload binds host ports directly — use sparingly.

volt run --network host --name probe my-image

VM networking

MicroVMs attach to the same voltbr0 bridge through a tap device, so port mapping and workload-to-workload connectivity behave the same as containers. Inside the guest the interface comes up via DHCP or cloud-init.

The firewall

Volt manages a dedicated nftables table (it never edits iptables or your existing chains). Masquerade, DNAT for published ports, and default-deny inbound live there:

# See Volt's ruleset
nft list table inet volt

Troubleshooting

SymptomCheck
Workload has no addressip -br addr show voltbr0 — is the bridge up? volt inspect <name> for the veth.
NO-CARRIER on the guest interfaceThe tap/veth isn't enslaved to the bridge — restart the workload; confirm bridge link lists it.
Published port refusednft list table inet volt for the DNAT rule; confirm the workload is listening on the container port.
No outbound connectivityMasquerade rule present? Host IP forwarding on: sysctl net.ipv4.ip_forward should be 1.
DNS fails inside a workloadHost /etc/resolv.conf valid, or pass --dns explicitly.

Next steps