I'm working on setting up an OpenBSD box to perform CLAT services for 464XLAT on my network. v4-only clients will be behind the pf box, which uses af-to to translate v4 packets to v6 and send them to my border NAT64 gateway.
Things are working pretty well, but I've bumped into an issue with large packets. If the v4 client sends a max-size packet (1500 bytes), it looks like the pf box is silently dropping them. I've tested this by setting DF on an ICMP ping that is too big to fit in an IPv6 packet (1453 bytes). tcpdump shows the packet arriving on the pf box, but not leaving. Because the IPv6 headers are 20 bytes bigger, this makes sense (the resulting translated packet is too large). I was hoping that pf would return an ICMP type 3, code 4 (dest unreachable/fragmentation needed), but I'm not getting anything back. I have a default "pass out" rule so I don't believe I am blocking any ICMP sourced by the pf box. Without the ICMP feedback, the v4 client is unaware of the v6 bump in the path (essentially, the MTU is reduced to 1480), and path MTU discovery cannot detect it. Am I missing any config, or does af-to not generate ICMP messages in this circumstance? As a workaround I tried to find a pf rule to filter on packet size, but that doesn't exist either. I did add a scrub rule for max-mss, and that has helped with TCP. However, I was hoping to get full coverage on UDP and ICMP as well. I'm going to try lowering the MTU on the clients, but some of them are IoT garbage that doesn't give me access to those settings, so pmtud is really my best bet. Thanks, Jason