Skip to content

容器与虚拟机运行时 ​

运行时负责创建客人网卡;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 \
  lab

rootless 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 = eth0
sh
incus profile device add default eth0 \
  nic nictype=bridged parent=lab

libvirt/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 的就绪屏障会短暂停整桥转发。

相关 ​

页面历史

开发者设计、代码地图和验证记录保留在仓库 manual/。