First, thanks to Marcos for providing a simple test.
I have the following FLOATING rules repeated for every interface on the firewall to handle the TimeStamp/Address Mask/Information requests/replies and allow other ICMP traffic:
pass quick on em1.66 inet proto icmp from <ISPRouterIPAdresses> to any icmp-type unreach keep state label "USER_RULE: Allow ICMP reports from router (Don't know which ..." ridentifier 1668177720
block drop quick on em1.66 inet from <UnsolicitedISPTrafic> to any label "USER_RULE: Discard unsollicited trafic from ISP router" ridentifier 1668177846
pass quick on em1.66 inet proto icmp all icmp-type echoreq keep state label "USER_RULE: Allow basic diagnostics" ridentifier 1668015336
pass log on em1.66 inet proto icmp all icmp-type echorep keep state label "USER_RULE: Allow basic diagnostics (deferred)" ridentifier 1668015427
match log on em1.66 inet proto icmp all icmp-type inforep label "USER_RULE: Log bad ICMP (trafic match only)" ridentifier 1669644959
match log on em1.66 inet proto icmp all icmp-type inforeq label "USER_RULE: Log bad ICMP (trafic match only)" ridentifier 1669644959
match log on em1.66 inet proto icmp all icmp-type maskrep label "USER_RULE: Log bad ICMP (trafic match only)" ridentifier 1669644959
match log on em1.66 inet proto icmp all icmp-type maskreq label "USER_RULE: Log bad ICMP (trafic match only)" ridentifier 1669644959
match log on em1.66 inet proto icmp all icmp-type timerep label "USER_RULE: Log bad ICMP (trafic match only)" ridentifier 1669644959
match log on em1.66 inet proto icmp all icmp-type timereq label "USER_RULE: Log bad ICMP (trafic match only)" ridentifier 1669644959
block drop log quick on em1.66 inet proto icmp all icmp-type inforeq label "USER_RULE: Discard any and all ICMP Timestamp, Address Mask..." ridentifier 1667827889
block drop log quick on em1.66 inet proto icmp all icmp-type maskreq label "USER_RULE: Discard any and all ICMP Timestamp, Address Mask..." ridentifier 1667827889
block drop log quick on em1.66 inet proto icmp all icmp-type timereq label "USER_RULE: Discard any and all ICMP Timestamp, Address Mask..." ridentifier 1667827889
block drop out log on em1.66 inet proto icmp all icmp-type inforep label "USER_RULE: Discard any and all ICMP Outgoing Timestamp, Addr..." ridentifier 1667764490
block drop out log on em1.66 inet proto icmp all icmp-type maskrep label "USER_RULE: Discard any and all ICMP Outgoing Timestamp, Addr..." ridentifier 1667764490
block drop out log on em1.66 inet proto icmp all icmp-type timerep label "USER_RULE: Discard any and all ICMP Outgoing Timestamp, Addr..." ridentifier 1667764490
pass log quick on em1.66 inet proto icmp all keep state label "USER_RULE: Accept any other ICMP trafic" ridentifier 1675147686
When TimeStamp requests are allowed regardless of the blocking rule, neither the match or the block rules are ever triggered for the TimeStamp reply.
It is as if the reply is not handled by pf, regardless of the interface used.
This may or may not be the same behavior. The above rules are created to avoid these request/replies crossing ANY subnet within the firewall: they obviously fail ;-)