My apologies. I should have been more careful with the packet inspection on the guest. I was a bit weary. I just reran packet capture (from within the guest) during a dhclient discover request and confirmed that return packets are not making to the guest eth0 interface.
Additionally I ran the same test except captured (from within the host) the virtual nic on the host (vethYB6MF1) that corresponds to the guest. Same result - DHCP offer packets are not making it to this interface.
For good measure, I reran the same test except captured on the host br0 interface. The DHCP offer packets are making it to this interface and seem to be correct (the destination mac address is correct). I hadn’t study DHCP before and noticed that during this debugging that DHCP offer packets have layer 3 IP data in them - which I found odd since the guest doesn’t have an IP address yet. I guess these are “unicast” packets? Including this here in case it is a clue - do the virtual interfaces need to be more promiscuous?
The dhcp server is external to this system - guests are joining a broader network.
Config data…
$ lxc config show --expanded foo
architecture: x86_64
config:
image.architecture: amd64
image.description: Debian buster amd64 (20190720_05:24)
image.os: Debian
image.release: buster
image.serial: “20190720_05:24”
volatile.base_image: bed9e862faaa94ee41eee34c747f5dfbf4e952016e5862e9580b8f17a143a98d
volatile.eth0.host_name: vethYB6MF1
volatile.eth0.hwaddr: 52:54:00:ee:14:64
volatile.idmap.base: “0”
volatile.idmap.current: ‘[{“Isuid”:true,“Isgid”:false,“Hostid”:1000000,“Nsid”:0,“Maprange”:1000000000},{“Isuid”:false,“Isgid”:true,“Hostid”:1000000,“Nsid”:0,“Maprange”:1000000000}]’
volatile.idmap.next: ‘[{“Isuid”:true,“Isgid”:false,“Hostid”:1000000,“Nsid”:0,“Maprange”:1000000000},{“Isuid”:false,“Isgid”:true,“Hostid”:1000000,“Nsid”:0,“Maprange”:1000000000}]’
volatile.last_state.idmap: ‘[{“Isuid”:true,“Isgid”:false,“Hostid”:1000000,“Nsid”:0,“Maprange”:1000000000},{“Isuid”:false,“Isgid”:true,“Hostid”:1000000,“Nsid”:0,“Maprange”:1000000000}]’
volatile.last_state.power: RUNNING
devices:
eth0:
name: eth0
nictype: bridged
parent: br0
type: nic
root:
path: /
pool: default
type: disk
ephemeral: false
profiles:
- default
stateful: false
description: “”
$ lxc profile show default
config: {}
description: Default LXD profile
devices:
eth0:
name: eth0
nictype: bridged
parent: br0
type: nic
root:
path: /
pool: default
type: disk
name: default
used_by:
- /1.0/containers/foo
- /1.0/containers/foo/Initial Minimal Install
- /1.0/containers/foo/Base packages installed
Thanks for the help!