容器与虚拟机运行时
运行时负责创建客人网卡;mayami 负责网桥地址、DHCP/RA/DNS、规则和可选 capture。两种 owner 不要同时管理同一座桥的地址或 DHCP。
完整配置
yaml
docker: {}
networks:
lab:
address: [10.10.0.1/24]
capture: false
dhcp:
range: 10.10.0.100-10.10.0.199
outbounds:
direct:
type: direct
route:
final: direct
dns:
servers:
real: {type: udp, address: 1.1.1.1:53}
final: real先运行 mayami check,再确认 ip -br link show lab。capture: false 时这是纯网段服务;需要规则接管代理流时改为 true 并配置 capture 入站。
Docker
sh
docker network create -d bridge \
--ipam-driver mayami --ipam-opt network=lab \
-o com.docker.network.bridge.name=lab \
-o com.docker.network.bridge.inhibit_ipv4=true \
-o com.docker.network.bridge.enable_ip_masquerade=false \
lab
docker run --rm --network lab --dns 10.10.0.1 \
alpine:3 sh -c 'ip -br addr; nslookup example.com'Docker 28 起,内置 DNS 对外的查询从宿主命名空间发出,不经过网桥来源规则,因此容器必须用 --dns 10.10.0.1,或把 Docker daemon 的 DNS 固定到该地址。插件只分配已有网段前缀,不建桥、不改成员/NAT,也不接受 external 网段。
Podman
root Podman 使用 netavark 的 unmanaged 模式和 DHCP:
sh
systemctl enable --now netavark-dhcp-proxy.socket
podman network create \
--interface-name lab \
--opt mode=unmanaged \
--ipam-driver dhcp \
--disable-dns \
labrootless Podman 默认用 pasta,不接宿主机的 lab 桥;不要为了接入而关闭 rootless 隔离。
LXC 与 Incus
ini
lxc.net.0.type = veth
lxc.net.0.link = lab
lxc.net.0.flags = up
lxc.net.0.name = eth0sh
incus profile device add default eth0 \
nic nictype=bridged parent=lablibvirt/KVM
xml
<interface type='bridge'>
<source bridge='lab'/>
<model type='virtio'/>
<driver name='vhost'/>
</interface>external 网桥
如果桥由 libvirt、Incus 或系统先创建并持续管理,在配置里写 external: true。mayami 只核对地址并提供 DHCP/RA/DNS;不要让两个 DHCP 服务管理同一座桥。需要 capture 时注意 fail: closed 的就绪屏障会短暂停整桥转发。