a73x

docs/faq.md

Ref:   Size: 2.8 KiB   History

# FAQ

## How do VMs get network access?

Outbound works out of the box: guests are NAT'd through their host and reach
the internet like any process on it. That NIC is unconditional—the guest's
egress, its way to the other guests on that host, and where the SSH
[jump gate](connecting.md) meets it.

Inbound has two answers. The gate works from anywhere: it authenticates every
connection against your tenant's CA and tunnels you in. The other is to put the
VM on your own network—declare a bridge on a Linux host, name it to the agent
(`--host-network lan=br0`), pick that name at create. Your own DHCP server
addresses the guest's second NIC, and it is then a machine on the network:
every port, every device, nothing of eitri's in front of that NIC. The
[networking](networking.md) has the recipe.

For reach beyond that LAN it is still a normal Linux machine, so install
[Tailscale](https://tailscale.com) (or WireGuard) inside it. A public gateway
is on the [roadmap](../ROADMAP.md).

## Is an exposed port authenticated?

No. The SSH [jump gate](connecting.md) authenticates every connection against
your tenant's CA. A published port has nothing in front of it: whoever can
reach the host on that port reaches the service, exactly as if the service were
running on the host itself.

That is the LAN trust posture, deliberately. The socket binds every interface
on the host, IPv4 only. Publish what you are content to serve to everything
that can reach it; put anything else behind the gate, or behind the service's
own authentication.

A published UDP port is the same posture carried one step further. Nothing in
UDP proves where a datagram came from, so the host answers the address the
datagram claimed—someone else's, if that is what it said. A UDP exposure can
therefore be pointed at a third party, and a guest service that answers larger
than it is asked makes that worse. Publish UDP the way you would publish
anything else here: onto a network you are content to serve.

## VMs boot and SSH works, but have no outbound network—why?

Docker. Installing (or starting) Docker on a host sets the kernel's iptables
`FORWARD` policy to drop, which silently discards the guests' NAT'd traffic —
the agent's own forwarding and masquerade rules are still in place, and a
drop in any chain wins. The symptoms are exactly this shape: the guest pings
its gateway, the jump gate still works (that path is tunnelled, not
forwarded), but DNS and everything outbound time out.

Docker reserves the `DOCKER-USER` chain for the host admin. Allow the eitri
bridge through it:

```sh
sudo iptables -I DOCKER-USER -i eitri0 -j ACCEPT
sudo iptables -I DOCKER-USER -o eitri0 -j ACCEPT
```

Docker re-creates its rules on every daemon start, so persist these (e.g.
`iptables-persistent`, or a systemd unit ordered after `docker.service`) —
a plain one-off insert is gone after the next reboot.