Extend router.firewall.rules with a reserved `wan` source zone: DNAT
(dnat, toPort), port ranges, source allow-lists, per-source rate
limits, logging and optional hairpin NAT. IPv6 is opened only by
explicit pinholes. Build-time assertions require WAN rules to name a
destination, protocol and ports so a typo cannot expose a whole zone.
Covered by the basic/pppoe VM tests and the assertion tests.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>