This turned out to be a completely separate problem than what I expected — traffic was flowing to servers on the PUB interface, but was getting dropped due to Linux reverse path filtering (rp_filter). As such, the OPNsense firewall correctly showed that connections were being passed, but the firewall on the server wasn't logging any rejected packets. tcpdump on the server showed the packets coming in, which eventually led me to find the filter. OPNsense was doing the right thing all along :D