fail2ban listed the address as banned, and the address still got in. On a Debian host with firewalld, the nft binary was missing, so every ban had failed.
The iptables ACCEPT rule for udp/67 on lxcbr0 kept counting, and dnsmasq never saw a DHCPDISCOVER. With nftables, an accept is not final: firewalld's table hooks in after it and rejected everything from the bridge.